Mercurial > hg > mercurial
changeset 270:0af40adc4791
Provide an information about parents of commits
author | Dmitry Neverov <dmitry.neverov@jetbrains.com> |
---|---|
date | Wed, 20 Jul 2011 15:10:49 +0400 |
parents | f8f67a96b892 |
children | c0540bbe7c2a |
files | mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/ChangeSet.java mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/LogCommand.java mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/ParentsCommand.java mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialVcsSupport.java mercurial-tests/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/LogCommandTest.java |
diffstat | 5 files changed, 77 insertions(+), 11 deletions(-) [+] |
line wrap: on
line diff
--- a/mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/ChangeSet.java Wed Jul 20 13:34:00 2011 +0400 +++ b/mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/ChangeSet.java Wed Jul 20 15:10:49 2011 +0400 @@ -16,7 +16,6 @@ package jetbrains.buildServer.buildTriggers.vcs.mercurial.command; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.Date; @@ -30,7 +29,7 @@ @NotNull private Date myTimestamp; private String myDescription; private boolean myContainsFiles; - private List<ChangeSetRevision> myParents; + private List<ChangeSetRevision> myParents = new ArrayList<ChangeSetRevision>(); public ChangeSet(final int revNumber, @NotNull final String id) { super(revNumber, id); @@ -60,10 +59,11 @@ myContainsFiles = containsFiles; } + public void clearParents() { + myParents.clear(); + } + public void addParent(@NotNull ChangeSetRevision rev) { - if (myParents == null) { - myParents = new ArrayList<ChangeSetRevision>(); - } myParents.add(rev); } @@ -94,10 +94,10 @@ } /** - * Returns parrents of this change set, or null if there were no parents. + * Returns parents of this change set (empty list for initial commit). * @return see above */ - @Nullable + @NotNull public List<ChangeSetRevision> getParents() { return myParents; } @@ -116,6 +116,6 @@ * @return true if changeset is initial changeset */ public boolean isInitial() { - return getParents() == null; + return getParents().isEmpty(); } }
--- a/mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/LogCommand.java Wed Jul 20 13:34:00 2011 +0400 +++ b/mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/LogCommand.java Wed Jul 20 15:10:49 2011 +0400 @@ -103,9 +103,11 @@ List<ChangeSet> result = new ArrayList<ChangeSet>(); String[] lines = stdout.split("\n"); ChangeSet current = null; + ChangeSet prev = null; int lineNum = 0; boolean insideDescription = false; StringBuilder descr = new StringBuilder(); + boolean useTrivialParent = false; while (lineNum < lines.length) { String line = lines[lineNum]; lineNum++; @@ -117,9 +119,14 @@ descr.setLength(0); } + prev = current; String revAndId = line.substring(CHANGESET_PREFIX.length()).trim(); try { current = new ChangeSet(revAndId); + if (prev != null) { + current.addParent(prev); + useTrivialParent = true; + } result.add(current); } catch (IllegalArgumentException e) { LOG.warn("Unable to extract changeset id from the line: " + line); @@ -142,6 +149,10 @@ if (line.startsWith(PARENT_PREFIX)) { String parentRev = line.substring(PARENT_PREFIX.length()).trim(); + if (useTrivialParent) { + current.clearParents(); + useTrivialParent = false; + } current.addParent(new ChangeSetRevision(parentRev)); continue; }
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/ParentsCommand.java Wed Jul 20 15:10:49 2011 +0400 @@ -0,0 +1,42 @@ +package jetbrains.buildServer.buildTriggers.vcs.mercurial.command; + +import com.intellij.execution.configurations.GeneralCommandLine; +import jetbrains.buildServer.ExecResult; +import jetbrains.buildServer.util.StringUtil; +import jetbrains.buildServer.vcs.VcsException; +import org.jetbrains.annotations.NotNull; + +import java.io.File; +import java.util.Arrays; +import java.util.List; + +/** + * @author dmitry.neverov + */ +public class ParentsCommand extends BaseCommand { + + private final String myRevision; + + + public ParentsCommand(@NotNull Settings settings, @NotNull File workingDir, @NotNull String revision) { + super(settings, workingDir); + myRevision = revision; + } + + + public List<String> execute() throws VcsException { + GeneralCommandLine cli = createCommandLine(); + cli.addParameter("parents"); + cli.addParameter("--template"); + cli.addParameter("{rev}:{node|short}\n"); + cli.addParameter("--rev"); + cli.addParameter(myRevision); + ExecResult res = runCommand(cli); + return parseOutput(res.getStdout()); + } + + + private List<String> parseOutput(String output) { + return Arrays.asList(StringUtil.splitByLines(output)); + } +}
--- a/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialVcsSupport.java Wed Jul 20 13:34:00 2011 +0400 +++ b/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialVcsSupport.java Wed Jul 20 15:10:49 2011 +0400 @@ -571,6 +571,8 @@ return result; } + setChangeSetParents(settings, workingDir, changeSets.get(0)); + // invoke status command for each changeset and determine what files were modified in these changesets StatusCommand st = new StatusCommand(settings, workingDir); ChangeSet prev = new ChangeSet(fromVersion); @@ -579,8 +581,8 @@ String prevId = prev.getId(); List<ChangeSetRevision> curParents = cur.getParents(); - boolean merge = curParents != null && curParents.size() > 1; - if (curParents != null && !merge) { + boolean merge = curParents.size() > 1; + if (!merge) { prevId = curParents.get(0).getId(); } @@ -598,6 +600,9 @@ List<VcsChange> files = toVcsChanges(modifiedFiles, prev.getFullVersion(), cur.getFullVersion(), checkoutRules); if (files.isEmpty() && !merge) continue; ModificationData md = new ModificationData(cur.getTimestamp(), files, cur.getDescription(), cur.getUser(), root, cur.getFullVersion(), cur.getId()); + for (ChangeSetRevision revision : cur.getParents()) { + md.addParentRevision(revision.getFullVersion()); + } if (merge) { md.setCanBeIgnored(false); } @@ -610,6 +615,14 @@ }; } + private void setChangeSetParents(Settings settings, File workingDir, ChangeSet cset) throws VcsException { + ParentsCommand parents = new ParentsCommand(settings, workingDir, cset.getFullVersion()); + List<String> parentRevisions = parents.execute(); + for (String parentRevision : parentRevisions) { + cset.addParent(new ChangeSet(parentRevision)); + } + } + @NotNull public BuildPatchPolicy getBuildPatchPolicy() { return new BuildPatchByCheckoutRules() {
--- a/mercurial-tests/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/LogCommandTest.java Wed Jul 20 13:34:00 2011 +0400 +++ b/mercurial-tests/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/LogCommandTest.java Wed Jul 20 15:10:49 2011 +0400 @@ -42,7 +42,7 @@ assertEquals(toId, changeSet.getId()); assertEquals("pavel@localhost", changeSet.getUser()); assertEquals("dir1 created", changeSet.getDescription()); - assertNull(changeSet.getParents()); + assertTrue(changeSet.getParents().isEmpty()); } public void testMoreThanOneChangeSet() throws Exception {