changeset 103:1b80570ddadf

TW-10150
author Pavel.Sher
date Mon, 12 Apr 2010 12:12:40 +0400
parents 95c28c14b26e
children 8cc11b0cbbd4
files mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialVcsSupport.java mercurial-tests/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialVcsSupportTest.java
diffstat 2 files changed, 68 insertions(+), 27 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialVcsSupport.java	Sun Apr 11 22:19:44 2010 +0400
+++ b/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialVcsSupport.java	Mon Apr 12 12:12:40 2010 +0400
@@ -16,17 +16,18 @@
 package jetbrains.buildServer.buildTriggers.vcs.mercurial;
 
 import jetbrains.buildServer.AgentSideCheckoutAbility;
+import jetbrains.buildServer.BuildAgent;
 import jetbrains.buildServer.CollectChangesByIncludeRule;
 import jetbrains.buildServer.Used;
 import jetbrains.buildServer.buildTriggers.vcs.AbstractVcsPropertiesProcessor;
 import jetbrains.buildServer.buildTriggers.vcs.mercurial.command.*;
 import jetbrains.buildServer.log.Loggers;
-import jetbrains.buildServer.serverSide.InvalidProperty;
-import jetbrains.buildServer.serverSide.PropertiesProcessor;
-import jetbrains.buildServer.serverSide.SBuildServer;
-import jetbrains.buildServer.serverSide.ServerPaths;
+import jetbrains.buildServer.serverSide.*;
+import jetbrains.buildServer.util.EventDispatcher;
 import jetbrains.buildServer.util.FileUtil;
 import jetbrains.buildServer.util.StringUtil;
+import jetbrains.buildServer.util.filters.Filter;
+import jetbrains.buildServer.util.filters.FilterUtil;
 import jetbrains.buildServer.vcs.*;
 import jetbrains.buildServer.vcs.patches.PatchBuilder;
 import org.jetbrains.annotations.NotNull;
@@ -62,7 +63,8 @@
 
   public MercurialVcsSupport(@NotNull final VcsManager vcsManager,
                              @NotNull ServerPaths paths,
-                             @NotNull SBuildServer server) {
+                             @NotNull final SBuildServer server,
+                             @NotNull EventDispatcher<BuildServerListener> dispatcher) {
     vcsManager.registerVcsSupport(this);
     myVcsManager = vcsManager;
     server.getExecutor().scheduleAtFixedRate(new Runnable() {
@@ -71,6 +73,26 @@
       }
     }, 0, OLD_WORK_DIRS_CLEANUP_PERIOD, TimeUnit.SECONDS);
     myDefaultWorkFolderParent = new File(paths.getCachesDir(), "mercurial");
+    dispatcher.addListener(new BuildServerAdapter() {
+      @Override
+      public void sourcesVersionReleased(@NotNull final BuildAgent agent) {
+        super.sourcesVersionReleased(agent);
+        server.getExecutor().submit(new Runnable() {
+          public void run() {
+            Set<File> clonedRepos = getAllClonedRepos();
+            if (clonedRepos == null) return;
+            for (File f: clonedRepos) {
+              lockWorkDir(f);
+              try {
+                FileUtil.delete(f);
+              } finally {
+                unlockWorkDir(f);
+              }
+            }
+          }
+        });
+      }
+    });
   }
 
   public List<ModificationData> collectBuildChanges(final VcsRoot root,
@@ -481,8 +503,42 @@
   }
 
   private void removeOldWorkFolders() {
+    Set<File> workDirs = getAllClonedRepos();
+    if (workDirs == null) return;
+
+    for (VcsRoot vcsRoot: getMercurialVcsRoots()) {
+      try {
+        Settings s = createSettings(vcsRoot);
+        workDirs.remove(PathUtil.getCanonicalFile(s.getLocalRepositoryDir()));
+      } catch (VcsException e) {
+        Loggers.VCS.error(e);
+      }
+    }
+
+    for (File f: workDirs) {
+      lockWorkDir(f);
+      try {
+        FileUtil.delete(f);
+      } finally {
+        unlockWorkDir(f);
+      }
+    }
+  }
+
+  private Collection<VcsRoot> getMercurialVcsRoots() {
+    List<VcsRoot> res = new ArrayList<VcsRoot>(myVcsManager.getAllRegisteredVcsRoots());
+    FilterUtil.filterCollection(res, new Filter<VcsRoot>() {
+      public boolean accept(@NotNull final VcsRoot data) {
+        return getName().equals(data.getVcsName());
+      }
+    });
+    return res;
+  }
+
+  @Nullable
+  private Set<File> getAllClonedRepos() {
     File workFoldersParent = myDefaultWorkFolderParent;
-    if (!workFoldersParent.isDirectory()) return;
+    if (!workFoldersParent.isDirectory()) return null;
 
     Set<File> workDirs = new HashSet<File>();
     File[] files = workFoldersParent.listFiles(new FileFilter() {
@@ -495,26 +551,7 @@
         workDirs.add(PathUtil.getCanonicalFile(f));
       }
     }
-
-    for (VcsRoot vcsRoot: myVcsManager.getAllRegisteredVcsRoots()) {
-      if (getName().equals(vcsRoot.getVcsName())) {
-        try {
-          Settings s = createSettings(vcsRoot);
-          workDirs.remove(PathUtil.getCanonicalFile(s.getLocalRepositoryDir()));
-        } catch (VcsException e) {
-          Loggers.VCS.error(e);
-        }
-      }
-    }
-
-    for (File f: workDirs) {
-      lockWorkDir(f);
-      try {
-        FileUtil.delete(f);
-      } finally {
-        unlockWorkDir(f);
-      }
-    }
+    return workDirs;
   }
 
   public String label(@NotNull String label, @NotNull String version, @NotNull VcsRoot root, @NotNull CheckoutRules checkoutRules) throws VcsException {
--- a/mercurial-tests/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialVcsSupportTest.java	Sun Apr 11 22:19:44 2010 +0400
+++ b/mercurial-tests/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialVcsSupportTest.java	Mon Apr 12 12:12:40 2010 +0400
@@ -19,8 +19,10 @@
 import jetbrains.buildServer.ExecResult;
 import jetbrains.buildServer.buildTriggers.vcs.mercurial.command.CommandUtil;
 import jetbrains.buildServer.buildTriggers.vcs.mercurial.command.Settings;
+import jetbrains.buildServer.serverSide.BuildServerListener;
 import jetbrains.buildServer.serverSide.SBuildServer;
 import jetbrains.buildServer.serverSide.ServerPaths;
+import jetbrains.buildServer.util.EventDispatcher;
 import jetbrains.buildServer.vcs.*;
 import jetbrains.buildServer.vcs.impl.VcsRootImpl;
 import jetbrains.buildServer.vcs.patches.PatchBuilderImpl;
@@ -54,10 +56,12 @@
     ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
     serverMock.stubs().method("getExecutor").will(myMockSupport.returnValue(executor));
 
+    EventDispatcher<BuildServerListener> dispatcher = EventDispatcher.create(BuildServerListener.class);
+
     File systemDir = myTempFiles.createTempDir();
     myServerPaths = new ServerPaths(systemDir.getAbsolutePath(), systemDir.getAbsolutePath(), systemDir.getAbsolutePath());
     assertTrue(new File(myServerPaths.getCachesDir()).mkdirs());
-    myVcs = new MercurialVcsSupport((VcsManager)vcsManagerMock.proxy(), myServerPaths, (SBuildServer)serverMock.proxy());
+    myVcs = new MercurialVcsSupport((VcsManager)vcsManagerMock.proxy(), myServerPaths, (SBuildServer)serverMock.proxy(), dispatcher);
   }
 
   protected String getTestDataPath() {