view mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/Cleanup.java @ 704:5ee94ee69b29

helper method
author eugene.petrenko@jetbrains.com
date Wed, 08 Jan 2014 17:42:41 +0100
parents da75e774d237
children 31a1aca3305c
line wrap: on
line source
package jetbrains.buildServer.buildTriggers.vcs.mercurial;

import com.intellij.openapi.diagnostic.Logger;
import jetbrains.buildServer.util.FileUtil;
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
 */
public class Cleanup implements Runnable {

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

  private final MirrorManager myMirrorManager;
  private final ServerPluginConfig myConfig;

  public Cleanup(@NotNull final MirrorManager mirrorManager,
                 @NotNull final ServerPluginConfig config) {
    myMirrorManager = mirrorManager;
    myConfig = config;
  }

  public void run() {
    delete(unusedDirs());
  }

  private Collection<File> unusedDirs() {
    List<File> existingDirs = existingDirs();
    List<File> mirrorsInUse = mirrorDirsOfRootsInUse(existingDirs);
    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(@NotNull List<File> mirrors) {
    List<File> result = new ArrayList<File>();
    long now = new Date().getTime();
    for (File mirror : mirrors) {
      File dotHg = new File(mirror, ".hg");
      File timestamp = new File(dotHg, "timestamp");
      if (!timestamp.exists())
        continue;
      long lastUsedTime = myMirrorManager.getLastUsedTime(mirror);
      if (now - lastUsedTime < myConfig.getMirrorExpirationTimeoutMillis())
        result.add(mirror);
    }
    return result;
  }

  private void delete(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 logUnusedLocalClones(@NotNull Collection<File> dirs) {
    if (dirs.isEmpty())
      return;
    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());
  }
}