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 {