view mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialMergeSupport.java @ 632:83692f82fbb7

Return a MergeResult
author Dmitry Neverov <dmitry.neverov@jetbrains.com>
date Wed, 14 Aug 2013 11:07:19 +0400
parents d28d52336ce5
children f0dce200f02a
line wrap: on
line source
package jetbrains.buildServer.buildTriggers.vcs.mercurial;

import jetbrains.buildServer.buildTriggers.vcs.mercurial.command.HgVcsRoot;
import jetbrains.buildServer.buildTriggers.vcs.mercurial.command.exception.MergeConflictException;
import jetbrains.buildServer.vcs.*;
import org.jetbrains.annotations.NotNull;
import com.intellij.openapi.diagnostic.Logger;

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

import static jetbrains.buildServer.buildTriggers.vcs.mercurial.HgFileUtil.deleteDir;

public class MercurialMergeSupport implements MergeSupport, MercurialServerExtension {

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

  private final MercurialVcsSupport myVcs;
  private final HgVcsRootFactory myHgVcsRootFactory;

  public MercurialMergeSupport(@NotNull MercurialVcsSupport vcs,
                               @NotNull HgVcsRootFactory vcsRootFactory) {
    vcs.addExtension(this);
    myVcs = vcs;
    myHgVcsRootFactory = vcsRootFactory;
  }

  @NotNull
  public MergeResult merge(@NotNull VcsRoot root,
                           @NotNull String srcRevision,
                           @NotNull String dstBranch,
                           @NotNull String message,
                           @NotNull MergeOptions options) throws VcsException {
    File tmpDir = null;
    MergeResult mergeResult = new MergeResult();
    try {
      tmpDir = HgFileUtil.createTempDir();
      HgVcsRoot hgRoot = myHgVcsRootFactory.createHgRoot(root);
      hgRoot.setCustomWorkingDir(tmpDir);
      myVcs.syncRepository(hgRoot);
      HgRepo repo = myVcs.createRepo(hgRoot);
      repo.update().branch(dstBranch).call();

      try {
        repo.merge().revision(srcRevision).call();
      } catch (MergeConflictException e) {
        List<String> conflicts = repo.resolve().call();
        mergeResult.setSuccess(false);
        for (String conflict : conflicts) {
          mergeResult.addConflict(conflict);
        }
        return mergeResult;
      }

      repo.commit().message(message).call();

      repo.push().toRepository(hgRoot.getRepository()).call();
      return mergeResult;
    } catch (Exception e) {
      if (e instanceof VcsException)
        throw (VcsException) e;
      throw new VcsException(e);
    } finally {
      deleteDir(tmpDir, LOG);
    }
  }
}