James Moger
2013-12-09 5e3521f8496511db4df45f011ea72f25623ad90f
src/main/java/com/gitblit/manager/RepositoryManager.java
@@ -169,6 +169,7 @@
      gcExecutor.close();
      mirrorExecutor.close();
      closeAll();
      return this;
   }
@@ -449,6 +450,7 @@
   private void clearRepositoryMetadataCache(String repositoryName) {
      repositorySizeCache.remove(repositoryName);
      repositoryMetricsCache.remove(repositoryName);
      CommitCache.instance().clear(repositoryName);
   }
   /**
@@ -461,6 +463,7 @@
      repositoryListCache.clear();
      repositorySizeCache.clear();
      repositoryMetricsCache.clear();
      CommitCache.instance().clear();
   }
   /**
@@ -798,6 +801,9 @@
         model.description = getConfig(config, "description", "");
         model.originRepository = getConfig(config, "originRepository", null);
         model.addOwners(ArrayUtils.fromString(getConfig(config, "owner", "")));
         model.acceptNewPatchsets = getConfig(config, "acceptNewPatchsets", true);
         model.acceptNewTickets = getConfig(config, "acceptNewTickets", true);
         model.requireApproval = getConfig(config, "requireApproval", settings.getBoolean(Keys.tickets.requireApproval, false));
         model.useIncrementalPushTags = getConfig(config, "useIncrementalPushTags", false);
         model.incrementalPushTagPrefix = getConfig(config, "incrementalPushTagPrefix", null);
         model.allowForks = getConfig(config, "allowForks", true);
@@ -1082,12 +1088,49 @@
   }
   /**
    * Returns true if the repository is idle (not being accessed).
    *
    * @param repository
    * @return true if the repository is idle
    */
   @Override
   public boolean isIdle(Repository repository) {
      try {
         // Read the use count.
         // An idle use count is 2:
         // +1 for being in the cache
         // +1 for the repository parameter in this method
         Field useCnt = Repository.class.getDeclaredField("useCnt");
         useCnt.setAccessible(true);
         int useCount = ((AtomicInteger) useCnt.get(repository)).get();
         return useCount == 2;
      } catch (Exception e) {
         logger.warn(MessageFormat
               .format("Failed to reflectively determine use count for repository {0}",
                     repository.getDirectory().getPath()), e);
      }
      return false;
   }
   /**
    * Ensures that all cached repository are completely closed and their resources
    * are properly released.
    */
   @Override
   public void closeAll() {
      for (String repository : getRepositoryList()) {
         close(repository);
      }
   }
   /**
    * Ensure that a cached repository is completely closed and its resources
    * are properly released.
    *
    * @param repositoryName
    */
   private void closeRepository(String repositoryName) {
   @Override
   public void close(String repositoryName) {
      Repository repository = getRepository(repositoryName);
      if (repository == null) {
         return;
@@ -1112,7 +1155,7 @@
                     repositoryName), e);
      }
      if (uses > 0) {
         logger.info(MessageFormat
         logger.debug(MessageFormat
               .format("{0}.useCnt={1}, calling close() {2} time(s) to close object and ref databases",
                     repositoryName, uses, uses));
         for (int i = 0; i < uses; i++) {
@@ -1250,7 +1293,7 @@
                     "Failed to rename ''{0}'' because ''{1}'' already exists.",
                     repositoryName, repository.name));
            }
            closeRepository(repositoryName);
            close(repositoryName);
            File folder = new File(repositoriesFolder, repositoryName);
            File destFolder = new File(repositoriesFolder, repository.name);
            if (destFolder.exists()) {
@@ -1366,6 +1409,15 @@
      config.setString(Constants.CONFIG_GITBLIT, null, "description", repository.description);
      config.setString(Constants.CONFIG_GITBLIT, null, "originRepository", repository.originRepository);
      config.setString(Constants.CONFIG_GITBLIT, null, "owner", ArrayUtils.toString(repository.owners));
      config.setBoolean(Constants.CONFIG_GITBLIT, null, "acceptNewPatchsets", repository.acceptNewPatchsets);
      config.setBoolean(Constants.CONFIG_GITBLIT, null, "acceptNewTickets", repository.acceptNewTickets);
      if (settings.getBoolean(Keys.tickets.requireApproval, false) == repository.requireApproval) {
         // use default
         config.unset(Constants.CONFIG_GITBLIT, null, "requireApproval");
      } else {
         // override default
         config.setBoolean(Constants.CONFIG_GITBLIT, null, "requireApproval", repository.requireApproval);
      }
      config.setBoolean(Constants.CONFIG_GITBLIT, null, "useIncrementalPushTags", repository.useIncrementalPushTags);
      if (StringUtils.isEmpty(repository.incrementalPushTagPrefix) ||
            repository.incrementalPushTagPrefix.equals(settings.getString(Keys.git.defaultIncrementalPushTagPrefix, "r"))) {
@@ -1475,7 +1527,7 @@
   @Override
   public boolean deleteRepository(String repositoryName) {
      try {
         closeRepository(repositoryName);
         close(repositoryName);
         // clear the repository cache
         clearRepositoryMetadataCache(repositoryName);