changeset 366:a75f2b73b1d8

TW-19984
author Dmitry Neverov <dmitry.neverov@jetbrains.com>
date Fri, 03 Feb 2012 13:23:18 +0400
parents a1d70e112d47
children 061e5f3a6bad
files mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/Cleanup.java mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialVcsSupport.java mercurial-tests/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/CleanupTest.java
diffstat 3 files changed, 50 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/Cleanup.java	Mon Jan 30 10:41:01 2012 +0400
+++ b/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/Cleanup.java	Fri Feb 03 13:23:18 2012 +0400
@@ -9,8 +9,11 @@
 import org.jetbrains.annotations.NotNull;
 
 import java.io.File;
+import java.io.FileFilter;
 import java.util.*;
 
+import static java.util.Arrays.asList;
+
 /**
  * @author dmitry.neverov
  */
@@ -20,22 +23,56 @@
 
   private final VcsManager myVcsManager;
   private final MirrorManager myMirrorManager;
+  private final PluginConfig myConfig;
   private final HgPathProvider myHgPathProvider;
 
   public Cleanup(@NotNull final VcsManager vcsManager,
                  @NotNull final MirrorManager mirrorManager,
+                 @NotNull final PluginConfig config,
                  @NotNull final HgPathProvider hgPathProvider) {
     myVcsManager = vcsManager;
     myMirrorManager = mirrorManager;
+    myConfig = config;
     myHgPathProvider = hgPathProvider;
   }
 
   public void run() {
-    Map<String, File> allMirrorDirs = myMirrorManager.getMappings();
+    delete(unusedDirs());
+  }
+
+  private Collection<File> unusedDirs() {
+    List<File> existingDirs = existingDirs();
+    List<File> mirrorsInUse = mirrorDirsOfRootsInUse();
+    existingDirs.removeAll(mirrorsInUse);
+    return existingDirs;
+  }
+
+  private List<File> existingDirs() {
+    File[] files = listDirs();
+    if (files != null)
+      return new ArrayList<File>(asList(files));
+    if (myConfig.getCachesDir().isDirectory())
+      LOG.warn("Cannot list files in " + myConfig.getCachesDir());
+    return Collections.emptyList();
+  }
+
+  private File[] listDirs() {
+    return myConfig.getCachesDir().listFiles(new FileFilter() {
+      public boolean accept(File f) {
+        return f.isDirectory();
+      }
+    });
+  }
+
+  private List<File> mirrorDirsOfRootsInUse() {
+    Map<String, File> mirrorMap = myMirrorManager.getMappings();
+    List<File> result = new ArrayList<File>();
     for (VcsRoot root : mercurialVcsRoots()) {
-      allMirrorDirs.remove(urlOf(root));
+      File mirrorDir = mirrorMap.get(urlOf(root));
+      if (mirrorDir != null)
+        result.add(mirrorDir);
     }
-    deleteDirs(allMirrorDirs.values());
+    return result;
   }
 
   private String urlOf(VcsRoot root) {
@@ -57,7 +94,7 @@
     return Constants.VCS_NAME.equals(root.getVcsName());
   }
 
-  private void deleteDirs(Collection<File> dirs) {
+  private void delete(Collection<File> dirs) {
     logUnusedLocalClones(dirs);
     for (File dir : dirs) {
       myMirrorManager.lockDir(dir);
@@ -83,6 +120,8 @@
   }
 
   private void logUnusedLocalClones(@NotNull Collection<File> dirs) {
+    if (dirs.isEmpty())
+      return;
     StringBuilder sb = new StringBuilder();
     sb.append("Unused local clones: ");
     Iterator<File> iter = dirs.iterator();
--- a/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialVcsSupport.java	Mon Jan 30 10:41:01 2012 +0400
+++ b/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialVcsSupport.java	Fri Feb 03 13:23:18 2012 +0400
@@ -76,7 +76,7 @@
     dispatcher.addListener(new BuildServerAdapter() {
       @Override
       public void cleanupFinished() {
-        server.getExecutor().submit(new Cleanup(myVcsManager, myMirrorManager, myHgPathProvider));
+        server.getExecutor().submit(new Cleanup(myVcsManager, myMirrorManager, myConfig, myHgPathProvider));
       }
 
       @Override
--- a/mercurial-tests/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/CleanupTest.java	Mon Jan 30 10:41:01 2012 +0400
+++ b/mercurial-tests/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/CleanupTest.java	Fri Feb 03 13:23:18 2012 +0400
@@ -48,7 +48,7 @@
     myMirrorManager = new MirrorManagerImpl(config);
 
     myVcsManager = myContext.mock(VcsManager.class);
-    myCleanup = new Cleanup(myVcsManager, myMirrorManager, new ServerHgPathProvider(config));
+    myCleanup = new Cleanup(myVcsManager, myMirrorManager, config, new ServerHgPathProvider(config));
   }
 
   @AfterMethod
@@ -64,6 +64,7 @@
     createDirFor(url1);
     createDirFor(url2);
     createDirFor(url3);
+    createUnusedDir();
     myContext.checking(new Expectations() {{
       atLeast(1).of(myVcsManager).getAllRegisteredVcsRoots();
       will(returnValue(asList(build(vcsRoot().withUrl(url1)), build(vcsRoot().withUrl(url2)))));
@@ -77,6 +78,10 @@
     assertThat(mappingsFile(), containsOnly(directoriesInside(myCachesDir)));
   }
 
+  private void createUnusedDir() {
+    new File(myCachesDir, "some unused dir").mkdirs();
+  }
+
 
   private void createDirFor(@NotNull String url) {
     myMirrorManager.getMirrorDir(url);