view mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialResetCacheHandler.java @ 372:2869f49b9211

TW-17252 handle mercurial caches correctly
author Dmitry Neverov <dmitry.neverov@jetbrains.com>
date Thu, 09 Feb 2012 12:58:53 +0400
parents
children 1350f99b43bc
line wrap: on
line source
package jetbrains.buildServer.buildTriggers.vcs.mercurial;

import com.intellij.openapi.diagnostic.Logger;
import jetbrains.buildServer.util.cache.ResetCacheHandler;
import org.jetbrains.annotations.NotNull;

import java.io.File;
import java.util.*;
import java.util.concurrent.atomic.AtomicBoolean;

import static com.intellij.openapi.util.io.FileUtil.delete;
import static java.util.Collections.singletonList;

/**
 * @author dmitry.neverov
 */
public class MercurialResetCacheHandler implements ResetCacheHandler {

  private static Logger LOG = Logger.getInstance(MercurialResetCacheHandler.class.getName());
  private static final String MERCURIAL_CACHE_NAME = "mercurial";

  private final MirrorManager myMirrorManager;
  private AtomicBoolean myResetRunning = new AtomicBoolean(false);

  public MercurialResetCacheHandler(@NotNull MirrorManager mirrorManager) {
    myMirrorManager = mirrorManager;
  }

  @NotNull
  public List<String> listCaches() {
    return singletonList(MERCURIAL_CACHE_NAME);
  }

  public boolean isEmpty(@NotNull final String cache) {
    return myMirrorManager.getMappings().isEmpty();
  }

  public void resetCache(@NotNull final String cache) {
    boolean started = startReset();
    if (!started) {
      LOG.info("Mercurial mirrors reset is already running");
      return;
    }
    resetAllMirrors();
    finishReset();
  }

  private boolean startReset() {
    return myResetRunning.compareAndSet(false, true);
  }

  private void finishReset() {
    myResetRunning.set(false);
  }

  private void resetAllMirrors() {
    LOG.info("Start reseting mercurial caches");
    for (Map.Entry<String, File> entry : myMirrorManager.getMappings().entrySet()) {
      String url = entry.getKey();
      File mirror = entry.getValue();
      try {
        lockMirror(url, mirror);
        resetMirror(mirror);
      } finally {
        unlockMirror(url, mirror);
      }
    }
    LOG.info("Mercurial caches reseted");
  }

  private void lockMirror(@NotNull final String url, @NotNull final File mirror) {
    LOG.debug("Lock mirror of " + url);
    myMirrorManager.lockDir(mirror);
    LOG.debug("Mirror of " + url + " is locked");
  }

  private void resetMirror(@NotNull final File mirror) {
    LOG.debug("Reset mercurial mirror "  + mirror.getAbsolutePath());
    myMirrorManager.forgetDir(mirror);
    delete(mirror);
    LOG.debug("Mercurial mirror "  + mirror.getAbsolutePath() + " reseted");
  }

  private void unlockMirror(@NotNull final String url, @NotNull final File mirror) {
    myMirrorManager.unlockDir(mirror);
    LOG.debug("Mirror of " + url + " is unlocked");
  }
}