changeset 729:785ab04c78da

implement new graph construction code
author eugene.petrenko@jetbrains.com
date Mon, 13 Jan 2014 20:29:59 +0100
parents 501cb1911d4b
children ae1358e79ee1
files mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/CommitsAndMountPointsCommand.java mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/CommitsAndMountPointsParser.java mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialCommitsInfoBuilderStates.java mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialCommitsInfoBuilderSupport.java mercurial-tests/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/CommitsAndMountPointsCommandParserTest.java
diffstat 5 files changed, 114 insertions(+), 35 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/CommitsAndMountPointsCommand.java	Mon Jan 13 20:29:29 2014 +0100
+++ b/mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/CommitsAndMountPointsCommand.java	Mon Jan 13 20:29:59 2014 +0100
@@ -9,6 +9,7 @@
 
 import java.io.File;
 import java.io.IOException;
+import java.util.Date;
 
 import static jetbrains.buildServer.buildTriggers.vcs.mercurial.command.CommitsAndMountPointsParser.parseCommits;
 import static jetbrains.buildServer.buildTriggers.vcs.mercurial.command.CommitsAndMountPointsParser.parseFileLog;
@@ -74,7 +75,7 @@
             @NotNull String[] tags,
             @NotNull String author,
             @NotNull String message,
-            final long timestamp,
+            @NotNull final Date timestamp,
             @Nullable String hgsubNodeId,
             @Nullable String hgsubstateNodeId);
   }
@@ -114,7 +115,7 @@
                              @NotNull String[] tags,
                              @NotNull String author,
                              @NotNull String message,
-                             long timestamp,
+                             @NotNull Date timestamp,
                              @Nullable String hgsubNodeId,
                              @Nullable String hgsubstateNodeId) {
           consumer.onCommit(commitNum, commitId, parents, branch, tags, author, message, timestamp, hgsubNodeId, hgsubstateNodeId);
--- a/mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/CommitsAndMountPointsParser.java	Mon Jan 13 20:29:29 2014 +0100
+++ b/mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/CommitsAndMountPointsParser.java	Mon Jan 13 20:29:59 2014 +0100
@@ -50,7 +50,7 @@
             @NotNull String[] tags,
             @NotNull String author,
             @NotNull String message,
-            final long timestamp,
+            @NotNull Date timestamp,
             @Nullable String hgsubNodeId,
             @Nullable String hgsubstateNodeId);
   }
@@ -88,7 +88,7 @@
 
       final String author = authorDecoder.decode(items.next());
       final String message = messageDecoder.decode(items.next());
-      final long time = parseTime(dateFormat, items.next());
+      final Date time = parseTime(dateFormat, items.next());
       final String hgsub = textOrNull(items.next());
       final String hgsubstate = textOrNull(items.next());
 
@@ -98,8 +98,8 @@
               parents,
               branch,
               tags,
-              author,
-              message,
+              author == null ? "" : author,
+              message == null ? "" : message,
               time,
               hgsub,
               hgsubstate);
@@ -109,10 +109,11 @@
     }
   }
 
-  private static long parseTime(@NotNull final SimpleDateFormat dateFormat,
+  @NotNull
+  private static Date parseTime(@NotNull final SimpleDateFormat dateFormat,
                                 @NotNull final String time) {
     try {
-      return dateFormat.parse(time).getTime();
+      return dateFormat.parse(time);
     } catch (ParseException e) {
       throw new RuntimeException("Failed to parse datetime: " + time + ". " + e, e);
     }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialCommitsInfoBuilderStates.java	Mon Jan 13 20:29:59 2014 +0100
@@ -0,0 +1,38 @@
+package jetbrains.buildServer.buildTriggers.vcs.mercurial;
+
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Created 13.01.14 19:45
+ *
+ * @author Eugene Petrenko (eugene.petrenko@jetbrains.com)
+ */
+public class MercurialCommitsInfoBuilderStates {
+  private final Map<String, String> myHgStateNodes = new HashMap<String, String>();
+  private final Map<String, String> myHgSubNodes = new HashMap<String, String>();
+
+  public void addSubNode(@NotNull final String hash, @NotNull final String text) {
+    myHgSubNodes.put(hash, text);
+  }
+
+  public void addStateNode(@NotNull final String hash, @NotNull final String text) {
+    myHgStateNodes.put(hash, text);
+  }
+
+
+  @NotNull
+  public Map<String, SubRepo> mounts(@Nullable final String subHash,
+                                     @Nullable final String stateHash) {
+    if (subHash == null || stateHash == null) return Collections.emptyMap();
+
+    //TODO: may cache parsed contents to make it work faster
+    return HgSubs.readSubrepositories(
+            myHgSubNodes.get(subHash),
+            myHgStateNodes.get(stateHash));
+  }
+}
--- a/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialCommitsInfoBuilderSupport.java	Mon Jan 13 20:29:29 2014 +0100
+++ b/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialCommitsInfoBuilderSupport.java	Mon Jan 13 20:29:59 2014 +0100
@@ -1,16 +1,14 @@
 package jetbrains.buildServer.buildTriggers.vcs.mercurial;
 
-import jetbrains.buildServer.buildTriggers.vcs.mercurial.command.ChangeSet;
-import jetbrains.buildServer.buildTriggers.vcs.mercurial.command.ChangeSetRevision;
+import jetbrains.buildServer.buildTriggers.vcs.mercurial.command.CommitsAndMountPointsCommand;
 import jetbrains.buildServer.buildTriggers.vcs.mercurial.command.HgVcsRoot;
-import jetbrains.buildServer.util.MultiMap;
+import jetbrains.buildServer.buildTriggers.vcs.mercurial.command.LogCommand;
 import jetbrains.buildServer.vcs.*;
 import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
 
-import java.util.Map;
-
-import static jetbrains.buildServer.buildTriggers.vcs.mercurial.command.LogCommand.ZERO_PARENT_ID;
-import static jetbrains.buildServer.buildTriggers.vcs.mercurial.command.LogCommand.ZERO_PARENT_SHORT_ID;
+import java.net.URISyntaxException;
+import java.util.Date;
 
 /**
  * Created 30.09.13 13:05
@@ -36,31 +34,67 @@
     final ServerHgRepo repo = mySupport.createRepo(hgRoot);
     mySupport.syncRepository(hgRoot);
 
-    MultiMap<String, String> commitToTag = new MultiMap<String, String>();
-    for (Map.Entry<String, String> e : repo.tags().call().entrySet()) {
-      commitToTag.putValue(e.getValue(), e.getKey());
-    }
 
-    //TODO: make stream parsing of commits instead of parsing of collected string output
-    for (ChangeSet set : repo.logNoFiles().showCommitsFromAllBranches().call()) {
-      final CommitDataBean change = new CommitDataBean(set.getId(), set.getFullVersion(), set.getTimestamp());
-      for (ChangeSetRevision p : set.getParents()) {
-        final String commitId = p.getId();
+    repo.logSubstates().call(new CommitsAndMountPointsCommand.Callback() {
+      private final MercurialCommitsInfoBuilderStates subs = new MercurialCommitsInfoBuilderStates();
 
-        if (ZERO_PARENT_ID.equals(commitId)) continue;
-        if (ZERO_PARENT_SHORT_ID.equals(commitId)) continue;
-        change.addParentRevision(commitId);
+      public void processHGSubFile(@NotNull String fileId, @NotNull String text) {
+        subs.addSubNode(fileId, text);
       }
 
-      change.setCommitMessage(set.getDescription());
-      change.setCommitAuthor(set.getUser());
-      change.addBranch(set.getBranch());
-
-      for (String tag : commitToTag.get(set.getId())) {
-        change.addTag(tag);
+      public void processHGSubStateFile(@NotNull String fileId, @NotNull String text) {
+        subs.addStateNode(fileId, text);
       }
 
-      consumer.consumeCommit(change);
-    }
+      public void onCommit(@NotNull String commitNum,
+                           @NotNull String commitId,
+                           @NotNull String[] parents,
+                           @NotNull String branch,
+                           @NotNull String[] tags,
+                           @NotNull String author,
+                           @NotNull String message,
+                           @NotNull Date timestamp,
+                           @Nullable String hgsubNodeId,
+                           @Nullable String hgsubstateNodeId) {
+
+        final CommitDataBean bean = new CommitDataBean(
+                HgRepo.shortId(commitId),
+                HgRepo.shortId(commitId),
+                timestamp
+                );
+
+        for (String parent : parents) {
+          if (LogCommand.ZERO_PARENT_ID.equals(parent)) continue;
+          if (LogCommand.ZERO_PARENT_SHORT_ID.equals(parent)) continue;
+          bean.addParentRevision(HgRepo.shortId(parent));
+        }
+
+        for (String tag : tags) {
+          if ("tip".equals(tag)) continue;
+
+          bean.addTag(tag);
+        }
+
+        bean.addBranch(branch);
+        bean.setCommitAuthor(author);
+        bean.setCommitMessage(message);
+
+        for (SubRepo subRepo : subs.mounts(hgsubNodeId, hgsubstateNodeId).values()) {
+          try {
+            bean.addMountPoint(new CommitMountPointDataBean(
+                    subRepo.vcsType().getVcsPluginName(),
+                    subRepo.resolveUrl(hgRoot.getRepository()),
+                    subRepo.path(),
+                    subRepo.revision()
+                    ));
+          } catch (URISyntaxException e) {
+            //NOP
+          }
+        }
+
+        consumer.consumeCommit(bean);
+      }
+    });
   }
+
 }
--- a/mercurial-tests/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/CommitsAndMountPointsCommandParserTest.java	Mon Jan 13 20:29:29 2014 +0100
+++ b/mercurial-tests/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/CommitsAndMountPointsCommandParserTest.java	Mon Jan 13 20:29:59 2014 +0100
@@ -11,6 +11,7 @@
 import java.lang.reflect.Proxy;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Date;
 import java.util.List;
 
 /**
@@ -59,6 +60,10 @@
   private <T> T proxy(@NotNull final Class<T> clazz, @NotNull final List<String> log) {
     return clazz.cast(Proxy.newProxyInstance(getClass().getClassLoader(), new Class<?>[]{clazz}, new InvocationHandler() {
       public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
+        for (int i = 0; i < args.length; i++) {
+          Object arg = args[i];
+          if (arg instanceof Date) args[i] = ((Date) arg).getTime();
+        }
         log.add(method.getName() + " " + Arrays.deepToString(args));
         return null;
       }