Mercurial > hg > mercurial
changeset 634:e89816840a2e
Merge branch Gaya-8.0.x
author | Dmitry Neverov <dmitry.neverov@jetbrains.com> |
---|---|
date | Wed, 14 Aug 2013 19:59:35 +0400 |
parents | 83692f82fbb7 (diff) 6ed9e0528564 (current diff) |
children | f0dce200f02a |
files | mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialVcsSupport.java |
diffstat | 11 files changed, 194 insertions(+), 7 deletions(-) [+] |
line wrap: on
line diff
--- a/mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/HgRepo.java Wed Aug 14 19:58:59 2013 +0400 +++ b/mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/HgRepo.java Wed Aug 14 19:59:35 2013 +0400 @@ -97,6 +97,18 @@ return new ParentsCommand(myCommandSettingsFactory.create(), myHgPath, myWorkingDir); } + public MergeCommand merge() { + return new MergeCommand(myCommandSettingsFactory.create(), myHgPath, myWorkingDir); + } + + public ResolveCommand resolve() { + return new ResolveCommand(myCommandSettingsFactory.create(), myHgPath, myWorkingDir); + } + + public CommitCommand commit() { + return new CommitCommand(myCommandSettingsFactory.create(), myHgPath, myWorkingDir); + } + public String path() { return myWorkingDir.getAbsolutePath(); }
--- a/mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/CommandResult.java Wed Aug 14 19:58:59 2013 +0400 +++ b/mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/CommandResult.java Wed Aug 14 19:59:35 2013 +0400 @@ -54,6 +54,10 @@ mySettings = settings; } + public int getExitCode() { + return myDelegate.getExitCode(); + } + @NotNull public String getStdout() { return removePrivateData(myDelegate.getStdout(), myPrivateData);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/CommitCommand.java Wed Aug 14 19:59:35 2013 +0400 @@ -0,0 +1,30 @@ +package jetbrains.buildServer.buildTriggers.vcs.mercurial.command; + +import jetbrains.buildServer.vcs.VcsException; +import org.jetbrains.annotations.NotNull; + +import java.io.File; + +public class CommitCommand extends BaseCommand { + + private String myCommitMessage; + + public CommitCommand(@NotNull CommandSettings commandSettings, + @NotNull String hgPath, + @NotNull File workingDir) { + super(commandSettings, hgPath, workingDir); + } + + public CommitCommand message(@NotNull String commitMessage) { + myCommitMessage = commitMessage; + return this; + } + + public void call() throws VcsException { + MercurialCommandLine cmd = createCommandLine(); + cmd.addParameter("commit"); + if (myCommitMessage != null) + cmd.addParameters("-m", myCommitMessage); + runCommand(cmd); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/MergeCommand.java Wed Aug 14 19:59:35 2013 +0400 @@ -0,0 +1,33 @@ +package jetbrains.buildServer.buildTriggers.vcs.mercurial.command; + +import jetbrains.buildServer.buildTriggers.vcs.mercurial.command.exception.MergeConflictException; +import jetbrains.buildServer.vcs.VcsException; +import org.jetbrains.annotations.NotNull; + +import java.io.File; + +public class MergeCommand extends BaseCommand { + + private String myRevision; + + public MergeCommand(@NotNull CommandSettings commandSettings, + @NotNull String hgPath, + @NotNull File workingDir) { + super(commandSettings, hgPath, workingDir); + } + + public MergeCommand revision(@NotNull String revision) { + myRevision = revision; + return this; + } + + public void call() throws VcsException { + MercurialCommandLine cmd = createCommandLine(); + cmd.addParameter("merge"); + if (myRevision != null) + cmd.addParameters("-r", myRevision); + CommandResult result = runCommand(cmd); + if (result.getExitCode() == 1) + throw new MergeConflictException(); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/ResolveCommand.java Wed Aug 14 19:59:35 2013 +0400 @@ -0,0 +1,29 @@ +package jetbrains.buildServer.buildTriggers.vcs.mercurial.command; + +import jetbrains.buildServer.vcs.VcsException; +import org.jetbrains.annotations.NotNull; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; + +public class ResolveCommand extends BaseCommand { + + public ResolveCommand(@NotNull CommandSettings commandSettings, + @NotNull String hgPath, + @NotNull File workingDir) { + super(commandSettings, hgPath, workingDir); + } + + public List<String> call() throws VcsException { + MercurialCommandLine cmd = createCommandLine(); + cmd.addParameters("resolve", "--no-status", "--list"); + CommandResult result = runCommand(cmd); + String stdout = result.getStdout(); + List<String> unresolvedFiles = new ArrayList<String>(); + for (String line: stdout.split("[\r\n]+")) { + unresolvedFiles.add(line); + } + return unresolvedFiles; + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/exception/MergeConflictException.java Wed Aug 14 19:59:35 2013 +0400 @@ -0,0 +1,9 @@ +package jetbrains.buildServer.buildTriggers.vcs.mercurial.command.exception; + +import jetbrains.buildServer.vcs.VcsException; + +public class MergeConflictException extends VcsException { + public MergeConflictException() { + super("Merge conflict"); + } +}
--- a/mercurial-server-tc/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialExtensionRegistry.java Wed Aug 14 19:58:59 2013 +0400 +++ b/mercurial-server-tc/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialExtensionRegistry.java Wed Aug 14 19:59:35 2013 +0400 @@ -8,6 +8,6 @@ public MercurialExtensionRegistry(@NotNull MercurialVcsSupport vcs, @NotNull Collection<MercurialServerExtension> extensions) { - vcs.setExtensions(extensions); + vcs.addExtensions(extensions); } }
--- a/mercurial-server/src/META-INF/build-server-plugin-mercurial.xml Wed Aug 14 19:58:59 2013 +0400 +++ b/mercurial-server/src/META-INF/build-server-plugin-mercurial.xml Wed Aug 14 19:59:35 2013 +0400 @@ -11,4 +11,5 @@ <bean id="testConnection" class="jetbrains.buildServer.buildTriggers.vcs.mercurial.HgTestConnectionSupport" /> <bean id="commandSettingsFactory" class="jetbrains.buildServer.buildTriggers.vcs.mercurial.ServerCommandSettingsFactory"/> <bean id="cleaner" class="jetbrains.buildServer.buildTriggers.vcs.mercurial.MercurialCleaner"/> + <bean id="mergeSupport" class="jetbrains.buildServer.buildTriggers.vcs.mercurial.MercurialMergeSupport"/> </beans>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialMergeSupport.java Wed Aug 14 19:59:35 2013 +0400 @@ -0,0 +1,67 @@ +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); + } + } +}
--- a/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialVcsSupport.java Wed Aug 14 19:58:59 2013 +0400 +++ b/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialVcsSupport.java Wed Aug 14 19:59:35 2013 +0400 @@ -61,7 +61,7 @@ private final FileFilter myAcceptAllFilter = new AcceptAllFilter(); private final HgTestConnectionSupport myTestConnection; private final SubrepoCheckoutRulesProvider mySubrepoCheckoutRulesProvider; - private Collection<MercurialServerExtension> myExtensions; + private final Collection<MercurialServerExtension> myExtensions = new ArrayList<MercurialServerExtension>(); public MercurialVcsSupport(@NotNull final EventDispatcher<ServerListener> dispatcher, @NotNull final ResetCacheRegister resetCacheHandlerManager, @@ -89,8 +89,12 @@ logUsedHg(); } - public void setExtensions(@NotNull Collection<MercurialServerExtension> extensions) { - myExtensions = extensions; + public void addExtensions(@NotNull Collection<MercurialServerExtension> extensions) { + myExtensions.addAll(extensions); + } + + public void addExtension(@NotNull MercurialServerExtension extension) { + myExtensions.add(extension); } private void logUsedHg() { @@ -646,8 +650,6 @@ @Override @Nullable protected <T extends VcsExtension> T getVcsCustomExtension(@NotNull final Class<T> extensionClass) { - if (myExtensions == null) - return null; for (MercurialServerExtension e : myExtensions) { if (extensionClass.isInstance(e)) return extensionClass.cast(e);
--- a/mercurial-tests/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialSupportBuilder.java Wed Aug 14 19:58:59 2013 +0400 +++ b/mercurial-tests/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialSupportBuilder.java Wed Aug 14 19:59:35 2013 +0400 @@ -42,7 +42,7 @@ }}); MercurialVcsSupport vcs = new MercurialVcsSupport(dispatcher, resetCacheManager, myConfig, hgPathProvider, repoFactory, mirrorManager, myHgRootFactory, testConnection, new SubrepoCheckoutRulesProviderImpl()); - vcs.setExtensions(myExtensions); + vcs.addExtensions(myExtensions); return vcs; }