From 2c60de580f6452365a6f25c998b7dd1ca68f7181 Mon Sep 17 00:00:00 2001 From: James Moger <james.moger@gitblit.com> Date: Fri, 05 Oct 2012 18:00:24 -0400 Subject: [PATCH] Fixed bug in create/rename repository if the root group alias is specified (issue 143) --- src/com/gitblit/GitBlit.java | 97 ++++++++++++++++++++++-------------------------- 1 files changed, 45 insertions(+), 52 deletions(-) diff --git a/src/com/gitblit/GitBlit.java b/src/com/gitblit/GitBlit.java index 4ada748..7fbd3ef 100644 --- a/src/com/gitblit/GitBlit.java +++ b/src/com/gitblit/GitBlit.java @@ -57,18 +57,13 @@ import javax.servlet.http.Cookie; import org.apache.wicket.protocol.http.WebResponse; -import org.eclipse.jgit.errors.RepositoryNotFoundException; import org.eclipse.jgit.lib.Repository; +import org.eclipse.jgit.lib.RepositoryCache; import org.eclipse.jgit.lib.RepositoryCache.FileKey; import org.eclipse.jgit.lib.StoredConfig; import org.eclipse.jgit.storage.file.FileBasedConfig; import org.eclipse.jgit.storage.file.WindowCache; import org.eclipse.jgit.storage.file.WindowCacheConfig; -import org.eclipse.jgit.transport.ServiceMayNotContinueException; -import org.eclipse.jgit.transport.resolver.FileResolver; -import org.eclipse.jgit.transport.resolver.RepositoryResolver; -import org.eclipse.jgit.transport.resolver.ServiceNotAuthorizedException; -import org.eclipse.jgit.transport.resolver.ServiceNotEnabledException; import org.eclipse.jgit.util.FS; import org.eclipse.jgit.util.FileUtils; import org.slf4j.Logger; @@ -141,8 +136,6 @@ private final Map<String, ProjectModel> projectCache = new ConcurrentHashMap<String, ProjectModel>(); private final AtomicReference<String> repositoryListSettingsChecksum = new AtomicReference<String>(""); - - private RepositoryResolver<Void> repositoryResolver; private ServletContext servletContext; @@ -746,17 +739,17 @@ * Adds the repository to the list of cached repositories if Gitblit is * configured to cache the repository list. * - * @param name + * @param model */ - private void addToCachedRepositoryList(String name, RepositoryModel model) { + private void addToCachedRepositoryList(RepositoryModel model) { if (settings.getBoolean(Keys.git.cacheRepositoryList, true)) { - repositoryListCache.put(name, model); + repositoryListCache.put(model.name, model); // 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); - origin.addFork(name); + origin.addFork(model.name); } } } @@ -895,32 +888,18 @@ * @return repository or null */ public Repository getRepository(String repositoryName, boolean logError) { + File dir = FileKey.resolve(new File(repositoriesFolder, repositoryName), FS.DETECTED); + if (dir == null) + return null; + Repository r = null; try { - r = repositoryResolver.open(null, repositoryName); - } catch (RepositoryNotFoundException e) { - r = null; + FileKey key = FileKey.exact(dir, FS.DETECTED); + r = RepositoryCache.open(key, true); + } catch (IOException e) { if (logError) { logger.error("GitBlit.getRepository(String) failed to find " + new File(repositoriesFolder, repositoryName).getAbsolutePath()); - } - } catch (ServiceNotAuthorizedException e) { - r = null; - if (logError) { - logger.error("GitBlit.getRepository(String) failed to find " - + new File(repositoriesFolder, repositoryName).getAbsolutePath(), e); - } - } catch (ServiceNotEnabledException e) { - r = null; - if (logError) { - logger.error("GitBlit.getRepository(String) failed to find " - + new File(repositoriesFolder, repositoryName).getAbsolutePath(), e); - } - } catch (ServiceMayNotContinueException e) { - r = null; - if (logError) { - logger.error("GitBlit.getRepository(String) failed to find " - + new File(repositoriesFolder, repositoryName).getAbsolutePath(), e); } } return r; @@ -1001,7 +980,7 @@ if (model == null) { return null; } - addToCachedRepositoryList(repositoryName, model); + addToCachedRepositoryList(model); return model; } @@ -1023,7 +1002,7 @@ logger.info(MessageFormat.format("Config for \"{0}\" has changed. Reloading model and updating cache.", repositoryName)); model = loadRepositoryModel(repositoryName); removeFromCachedRepositoryList(repositoryName); - addToCachedRepositoryList(repositoryName, model); + addToCachedRepositoryList(model); } else { // update a few repository parameters if (!model.hasCommits) { @@ -1236,10 +1215,15 @@ return null; } RepositoryModel model = new RepositoryModel(); - model.name = repositoryName; + model.isBare = r.isBare(); + File basePath = getFileOrFolder(Keys.git.repositoriesFolder, "git"); + if (model.isBare) { + model.name = com.gitblit.utils.FileUtils.getRelativePath(basePath, r.getDirectory()); + } else { + model.name = com.gitblit.utils.FileUtils.getRelativePath(basePath, r.getDirectory().getParentFile()); + } model.hasCommits = JGitUtils.hasCommits(r); model.lastChange = JGitUtils.getLastChange(r); - model.isBare = r.isBare(); if (repositoryName.indexOf('/') == -1) { model.projectPath = ""; } else { @@ -1270,6 +1254,9 @@ Constants.CONFIG_GITBLIT, null, "federationSets"))); model.isFederated = getConfig(config, "isFederated", false); model.origin = config.getString("remote", "origin", "url"); + if (model.origin != null) { + model.origin = model.origin.replace('\\', '/'); + } model.preReceiveScripts = new ArrayList<String>(Arrays.asList(config.getStringList( Constants.CONFIG_GITBLIT, null, "preReceiveScript"))); model.postReceiveScripts = new ArrayList<String>(Arrays.asList(config.getStringList( @@ -1425,7 +1412,7 @@ private ForkModel getForkModel(String repository) { RepositoryModel model = repositoryListCache.get(repository); - ForkModel fork = new ForkModel(model.originRepository, model.name); + ForkModel fork = new ForkModel(model); if (!ArrayUtils.isEmpty(model.forks)) { for (String aFork : model.forks) { ForkModel fm = getForkModel(aFork); @@ -1462,6 +1449,8 @@ */ private void closeRepository(String repositoryName) { Repository repository = getRepository(repositoryName); + RepositoryCache.close(repository); + // assume 2 uses in case reflection fails int uses = 2; try { @@ -1558,6 +1547,13 @@ public void updateRepositoryModel(String repositoryName, RepositoryModel repository, boolean isCreate) throws GitBlitException { Repository r = null; + String projectPath = StringUtils.getFirstPathElement(repository.name); + if (!StringUtils.isEmpty(projectPath)) { + if (projectPath.equalsIgnoreCase(getString(Keys.web.repositoryRootGroupName, "main"))) { + // strip leading group name + repository.name = repository.name.substring(projectPath.length() + 1); + } + } if (isCreate) { // ensure created repository name ends with .git if (!repository.name.toLowerCase().endsWith(org.eclipse.jgit.lib.Constants.DOT_GIT_EXT)) { @@ -1625,6 +1621,14 @@ rf.close(); } } + + // remove this repository from any origin model's fork list + if (!StringUtils.isEmpty(repository.originRepository)) { + RepositoryModel origin = repositoryListCache.get(repository.originRepository); + if (origin != null && !ArrayUtils.isEmpty(origin.forks)) { + origin.forks.remove(repositoryName); + } + } // clear the cache clearRepositoryMetadataCache(repositoryName); @@ -1633,17 +1637,7 @@ // load repository logger.info("edit repository " + repository.name); - try { - r = repositoryResolver.open(null, repository.name); - } catch (RepositoryNotFoundException e) { - logger.error("Repository not found", e); - } catch (ServiceNotAuthorizedException e) { - logger.error("Service not authorized", e); - } catch (ServiceNotEnabledException e) { - logger.error("Service not enabled", e); - } catch (ServiceMayNotContinueException e) { - logger.error("Service may not continue", e); - } + r = getRepository(repository.name); } // update settings @@ -1667,7 +1661,7 @@ // update repository cache removeFromCachedRepositoryList(repositoryName); // model will actually be replaced on next load because config is stale - addToCachedRepositoryList(repository.name, repository); + addToCachedRepositoryList(repository); } /** @@ -2491,7 +2485,6 @@ this.settings = settings; repositoriesFolder = getRepositoriesFolder(); logger.info("Git repositories folder " + repositoriesFolder.getAbsolutePath()); - repositoryResolver = new FileResolver<Void>(repositoriesFolder, true); // calculate repository list settings checksum for future config changes repositoryListSettingsChecksum.set(getRepositoryListSettingsChecksum()); @@ -2675,7 +2668,7 @@ } // add this clone to the cached model - addToCachedRepositoryList(cloneModel.name, cloneModel); + addToCachedRepositoryList(cloneModel); return cloneModel; } } -- Gitblit v1.9.1