TW-45001 Ability to disable clean-up of git mirror
authorDmitry Neverov <dmitry.neverov@gmail.com>
Fri, 15 Dec 2017 15:34:31 +0000 (16:34 +0100)
committerDmitry Neverov <dmitry.neverov@gmail.com>
Fri, 15 Dec 2017 15:34:31 +0000 (16:34 +0100)
git-agent/src/jetbrains/buildServer/buildTriggers/vcs/git/agent/AgentMirrorCleaner.java

index 2bfa52d0253d79365d496c010cef2a9a69c5ea23..f8925f93d355263e2780fb663e6948d1f18382b3 100644 (file)
@@ -26,6 +26,8 @@ import jetbrains.buildServer.buildTriggers.vcs.git.MirrorManager;
 import jetbrains.buildServer.vcs.VcsException;
 import jetbrains.buildServer.vcs.VcsRoot;
 import jetbrains.buildServer.vcs.VcsRootEntry;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.lib.RepositoryBuilder;
 import org.jetbrains.annotations.NotNull;
 
 import java.io.File;
@@ -55,8 +57,12 @@ public class AgentMirrorCleaner implements DirectoryCleanersProvider {
       String repository = entry.getKey();
       File mirror = entry.getValue();
       if (!repositoriesUsedInBuild.contains(repository)) {
-        ourLog.debug("Register cleaner for mirror " + mirror.getAbsolutePath());
-        registry.addCleaner(mirror, new Date(myMirrorManager.getLastUsedTime(mirror)));
+        if (isCleanupEnabled(mirror)) {
+          ourLog.debug("Register cleaner for mirror " + mirror.getAbsolutePath());
+          registry.addCleaner(mirror, new Date(myMirrorManager.getLastUsedTime(mirror)));
+        } else {
+          ourLog.debug("Clean-up is disabled in " + repository + " (" + mirror.getName() + ")");
+        }
       }
     }
   }
@@ -78,4 +84,18 @@ public class AgentMirrorCleaner implements DirectoryCleanersProvider {
     }
     return repositories;
   }
+
+  private boolean isCleanupEnabled(@NotNull File gitDir) {
+    Repository repository = null;
+    try {
+      repository = new RepositoryBuilder().setGitDir(gitDir).setBare().build();
+      return repository.getConfig().getBoolean("teamcity", "freeDiskSpaceCleanupEnabled", true);
+    } catch (Exception e) {
+      return true;
+    } finally {
+      if (repository != null) {
+        repository.close();
+      }
+    }
+  }
 }