view mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MergeBaseWithRevsets.java @ 349:e0464f11206c

TW-19698 Handle unrelated repositories When repository becames unrelated - clone it in different directory on the server. When changes are collected and any of revisions is from unrelated repository - return empty changes collection.
author Dmitry Neverov <dmitry.neverov@jetbrains.com>
date Thu, 12 Jan 2012 18:21:07 +0400
parents e9e7d9fcf57d
children
line wrap: on
line source
package jetbrains.buildServer.buildTriggers.vcs.mercurial;

import jetbrains.buildServer.buildTriggers.vcs.mercurial.command.*;
import jetbrains.buildServer.vcs.VcsException;
import org.jetbrains.annotations.NotNull;

import java.io.File;
import java.util.List;

/**
 * Implementation of merge-base using hg revsets
 * @author dmitry.neverov
 */
public final class MergeBaseWithRevsets implements MergeBaseCommand {

  private final Settings mySettings;
  private final File myWorkingDir;
  private final CommandFactoryImpl myCommandFactory;

  public MergeBaseWithRevsets(@NotNull final Settings settings, @NotNull final File workingDir, @NotNull final CommandFactoryImpl commandFactory) {
    mySettings = settings;
    myWorkingDir = workingDir;
    myCommandFactory = commandFactory;
  }

  public String execute(@NotNull final String revision1, @NotNull final String revision2) throws VcsException {
    try {
      LogCommand log = myCommandFactory.createLog(mySettings, myWorkingDir);
      log.setRevsets("ancestor(" + new ChangeSetRevision(revision1).getId() + ", " + new ChangeSetRevision(revision2).getId() + ")");
      log.showCommitsFromAllBranches();
      log.setCalculateParents(false);
      List<ChangeSet> csets = log.execute();
      return csets.isEmpty() ? null : csets.get(0).getId();
    } catch (VcsException e) {
      return null;
    }
  }
}