view mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/Cleanup.java @ 365:a1d70e112d47

Add logging for cleanup
author Dmitry Neverov <dmitry.neverov@jetbrains.com>
date Mon, 30 Jan 2012 10:41:01 +0400
parents 53b430731041
children a75f2b73b1d8
line wrap: on
line source
package jetbrains.buildServer.buildTriggers.vcs.mercurial;

import com.intellij.openapi.diagnostic.Logger;
import jetbrains.buildServer.buildTriggers.vcs.mercurial.command.Settings;
import jetbrains.buildServer.serverSide.impl.LogUtil;
import jetbrains.buildServer.util.FileUtil;
import jetbrains.buildServer.vcs.VcsManager;
import jetbrains.buildServer.vcs.VcsRoot;
import org.jetbrains.annotations.NotNull;

import java.io.File;
import java.util.*;

/**
 * @author dmitry.neverov
 */
public class Cleanup implements Runnable {

  private static Logger LOG = Logger.getInstance(Cleanup.class.getName());

  private final VcsManager myVcsManager;
  private final MirrorManager myMirrorManager;
  private final HgPathProvider myHgPathProvider;

  public Cleanup(@NotNull final VcsManager vcsManager,
                 @NotNull final MirrorManager mirrorManager,
                 @NotNull final HgPathProvider hgPathProvider) {
    myVcsManager = vcsManager;
    myMirrorManager = mirrorManager;
    myHgPathProvider = hgPathProvider;
  }

  public void run() {
    Map<String, File> allMirrorDirs = myMirrorManager.getMappings();
    for (VcsRoot root : mercurialVcsRoots()) {
      allMirrorDirs.remove(urlOf(root));
    }
    deleteDirs(allMirrorDirs.values());
  }

  private String urlOf(VcsRoot root) {
    Settings s = new Settings(myHgPathProvider, root);
    return s.getRepositoryUrlWithCredentials();
  }

  private Collection<VcsRoot> mercurialVcsRoots() {
    List<VcsRoot> mercurialRoots = new ArrayList<VcsRoot>();
    for (VcsRoot root : myVcsManager.getAllRegisteredVcsRoots()) {
      if (isMercurialRoot(root))
        mercurialRoots.add(root);
    }
    logRegisteredMercurialRoots(mercurialRoots);
    return mercurialRoots;
  }

  private boolean isMercurialRoot(VcsRoot root) {
    return Constants.VCS_NAME.equals(root.getVcsName());
  }

  private void deleteDirs(Collection<File> dirs) {
    logUnusedLocalClones(dirs);
    for (File dir : dirs) {
      myMirrorManager.lockDir(dir);
      try {
        myMirrorManager.forgetDir(dir);
        FileUtil.delete(dir);
      } finally {
        myMirrorManager.unlockDir(dir);
      }
    }
  }

  private void logRegisteredMercurialRoots(@NotNull List<VcsRoot> roots) {
    StringBuilder sb = new StringBuilder();
    sb.append("Registered mercurial roots: ");
    Iterator<VcsRoot> iter = roots.iterator();
    while (iter.hasNext()) {
      sb.append(LogUtil.describe(iter.next()));
      if (iter.hasNext())
        sb.append(", ");
    }
    LOG.debug(sb.toString());
  }

  private void logUnusedLocalClones(@NotNull Collection<File> dirs) {
    StringBuilder sb = new StringBuilder();
    sb.append("Unused local clones: ");
    Iterator<File> iter = dirs.iterator();
    while (iter.hasNext()) {
      sb.append(iter.next().getAbsolutePath());
      if (iter.hasNext())
        sb.append(", ");
    }
    LOG.info(sb.toString());
  }
}