From e1bcda8c6245035c96bf44ee09d61fa5a52bcafc Mon Sep 17 00:00:00 2001
From: James Moger <james.moger@gitblit.com>
Date: Thu, 29 May 2014 17:18:38 -0400
Subject: [PATCH] Merged #93 "Clarify server.threadPoolSize setting documentation"
---
src/main/java/com/gitblit/manager/RepositoryManager.java | 67 ++++++++++++++++++++++++++-------
1 files changed, 53 insertions(+), 14 deletions(-)
diff --git a/src/main/java/com/gitblit/manager/RepositoryManager.java b/src/main/java/com/gitblit/manager/RepositoryManager.java
index 05a90b6..31d6b34 100644
--- a/src/main/java/com/gitblit/manager/RepositoryManager.java
+++ b/src/main/java/com/gitblit/manager/RepositoryManager.java
@@ -421,8 +421,9 @@
// update the fork origin repository with this repository clone
if (!StringUtils.isEmpty(model.originRepository)) {
- if (repositoryListCache.containsKey(model.originRepository)) {
- RepositoryModel origin = repositoryListCache.get(model.originRepository);
+ String originKey = model.originRepository.toLowerCase();
+ if (repositoryListCache.containsKey(originKey)) {
+ RepositoryModel origin = repositoryListCache.get(originKey);
origin.addFork(model.name);
}
}
@@ -451,6 +452,20 @@
repositorySizeCache.remove(repositoryName);
repositoryMetricsCache.remove(repositoryName);
CommitCache.instance().clear(repositoryName);
+ }
+
+ /**
+ * Reset all caches for this repository.
+ *
+ * @param repositoryName
+ * @since 1.5.1
+ */
+ @Override
+ public void resetRepositoryCache(String repositoryName) {
+ removeFromCachedRepositoryList(repositoryName);
+ clearRepositoryMetadataCache(repositoryName);
+ // force a reload of the repository data (ticket-82, issue-433)
+ getRepositoryModel(repositoryName);
}
/**
@@ -534,8 +549,9 @@
// rebuild fork networks
for (RepositoryModel model : repositoryListCache.values()) {
if (!StringUtils.isEmpty(model.originRepository)) {
- if (repositoryListCache.containsKey(model.originRepository)) {
- RepositoryModel origin = repositoryListCache.get(model.originRepository);
+ String originKey = model.originRepository.toLowerCase();
+ if (repositoryListCache.containsKey(originKey)) {
+ RepositoryModel origin = repositoryListCache.get(originKey);
origin.addFork(model.name);
}
}
@@ -668,7 +684,8 @@
// http://stackoverflow.com/questions/17183110
repositoryName = repositoryName.replace("%7E", "~").replace("%7e", "~");
- if (!repositoryListCache.containsKey(repositoryName)) {
+ String repositoryKey = repositoryName.toLowerCase();
+ if (!repositoryListCache.containsKey(repositoryKey)) {
RepositoryModel model = loadRepositoryModel(repositoryName);
if (model == null) {
return null;
@@ -678,7 +695,7 @@
}
// cached model
- RepositoryModel model = repositoryListCache.get(repositoryName.toLowerCase());
+ RepositoryModel model = repositoryListCache.get(repositoryKey);
if (gcExecutor.isCollectingGarbage(model.name)) {
// Gitblit is busy collecting garbage, use our cached model
@@ -943,26 +960,31 @@
*/
@Override
public String getFork(String username, String origin) {
+ if (StringUtils.isEmpty(origin)) {
+ return null;
+ }
String userProject = ModelUtils.getPersonalPath(username);
if (settings.getBoolean(Keys.git.cacheRepositoryList, true)) {
+ String originKey = origin.toLowerCase();
String userPath = userProject + "/";
// collect all origin nodes in fork network
Set<String> roots = new HashSet<String>();
- roots.add(origin);
- RepositoryModel originModel = repositoryListCache.get(origin);
+ roots.add(originKey);
+ RepositoryModel originModel = repositoryListCache.get(originKey);
while (originModel != null) {
if (!ArrayUtils.isEmpty(originModel.forks)) {
for (String fork : originModel.forks) {
if (!fork.startsWith(userPath)) {
- roots.add(fork);
+ roots.add(fork.toLowerCase());
}
}
}
if (originModel.originRepository != null) {
- roots.add(originModel.originRepository);
- originModel = repositoryListCache.get(originModel.originRepository);
+ String ooKey = originModel.originRepository.toLowerCase();
+ roots.add(ooKey);
+ originModel = repositoryListCache.get(ooKey);
} else {
// break
originModel = null;
@@ -973,7 +995,7 @@
if (repository.startsWith(userPath)) {
RepositoryModel model = repositoryListCache.get(repository);
if (!StringUtils.isEmpty(model.originRepository)) {
- if (roots.contains(model.originRepository)) {
+ if (roots.contains(model.originRepository.toLowerCase())) {
// user has a fork in this graph
return model.name;
}
@@ -1013,7 +1035,7 @@
// find the root, cached
RepositoryModel model = repositoryListCache.get(repository.toLowerCase());
while (model.originRepository != null) {
- model = repositoryListCache.get(model.originRepository);
+ model = repositoryListCache.get(model.originRepository.toLowerCase());
}
ForkModel root = getForkModelFromCache(model.name);
return root;
@@ -1344,7 +1366,7 @@
// update this repository's origin's fork list
if (!StringUtils.isEmpty(repository.originRepository)) {
- RepositoryModel origin = repositoryListCache.get(repository.originRepository);
+ RepositoryModel origin = repositoryListCache.get(repository.originRepository.toLowerCase());
if (origin != null && !ArrayUtils.isEmpty(origin.forks)) {
origin.forks.remove(repositoryName);
origin.forks.add(repository.name);
@@ -1514,6 +1536,17 @@
}
/**
+ * Returns true if the repository can be deleted.
+ *
+ * @return true if the repository can be deleted
+ */
+ @Override
+ public boolean canDelete(RepositoryModel repository) {
+ return settings.getBoolean(Keys.web.allowDeletingNonEmptyRepositories, true)
+ || !repository.hasCommits;
+ }
+
+ /**
* Deletes the repository from the file system and removes the repository
* permission from all repository users.
*
@@ -1534,6 +1567,12 @@
*/
@Override
public boolean deleteRepository(String repositoryName) {
+ RepositoryModel repository = getRepositoryModel(repositoryName);
+ if (!canDelete(repository)) {
+ logger.warn("Attempt to delete {} rejected!", repositoryName);
+ return false;
+ }
+
try {
close(repositoryName);
// clear the repository cache
--
Gitblit v1.9.1