Mercurial > hg > mercurial
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() {