James Moger
2014-06-09 ca4d98678c20e4033fdaca09ecbbf0f5952e0b84
src/main/java/com/gitblit/manager/RepositoryManager.java
@@ -66,6 +66,7 @@
import com.gitblit.GitBlitException;
import com.gitblit.IStoredSettings;
import com.gitblit.Keys;
import com.gitblit.extensions.RepositoryLifeCycleListener;
import com.gitblit.models.ForkModel;
import com.gitblit.models.Metric;
import com.gitblit.models.RefModel;
@@ -114,6 +115,8 @@
   private final IRuntimeManager runtimeManager;
   private final IPluginManager pluginManager;
   private final IUserManager userManager;
   private final File repositoriesFolder;
@@ -126,10 +129,12 @@
   public RepositoryManager(
         IRuntimeManager runtimeManager,
         IPluginManager pluginManager,
         IUserManager userManager) {
      this.settings = runtimeManager.getSettings();
      this.runtimeManager = runtimeManager;
      this.pluginManager = pluginManager;
      this.userManager = userManager;
      this.repositoriesFolder = runtimeManager.getFileOrFolder(Keys.git.repositoriesFolder, "${baseFolder}/git");
   }
@@ -684,7 +689,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;
@@ -694,7 +700,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
@@ -1419,6 +1425,16 @@
      removeFromCachedRepositoryList(repositoryName);
      // model will actually be replaced on next load because config is stale
      addToCachedRepositoryList(repository);
      if (isCreate && pluginManager != null) {
         for (RepositoryLifeCycleListener listener : pluginManager.getExtensions(RepositoryLifeCycleListener.class)) {
            try {
               listener.onCreation(repository);
            } catch (Throwable t) {
               logger.error(String.format("failed to call plugin onCreation %s", repositoryName), t);
            }
         }
      }
   }
   /**
@@ -1535,6 +1551,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.
    *
@@ -1555,6 +1582,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
@@ -1570,6 +1603,16 @@
            FileUtils.delete(folder, FileUtils.RECURSIVE | FileUtils.RETRY);
            if (userManager.deleteRepositoryRole(repositoryName)) {
               logger.info(MessageFormat.format("Repository \"{0}\" deleted", repositoryName));
               if (pluginManager != null) {
                  for (RepositoryLifeCycleListener listener : pluginManager.getExtensions(RepositoryLifeCycleListener.class)) {
                     try {
                        listener.onDeletion(repository);
                     } catch (Throwable t) {
                        logger.error(String.format("failed to call plugin onDeletion %s", repositoryName), t);
                     }
                  }
               }
               return true;
            }
         }