changeset 700:a9adc3daf252

diff log parser added
author eugene.petrenko@jetbrains.com
date Fri, 03 Jan 2014 16:03:21 +0100
parents fbff229ee2dc
children ec3a72046099
files mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/diff/DiffParser.java mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/diff/DiffProcessor.java mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/diff/LinesIterator.java mercurial-tests/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/diff/DiffParserTest.java
diffstat 4 files changed, 205 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/diff/DiffParser.java	Fri Jan 03 16:03:21 2014 +0100
@@ -0,0 +1,71 @@
+package jetbrains.buildServer.buildTriggers.vcs.mercurial.command.diff;
+
+import com.intellij.openapi.diagnostic.Logger;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * Created 03.01.14 15:51
+ *
+ * @author Eugene Petrenko (eugene.petrenko@jetbrains.com)
+ */
+public class DiffParser {
+  private static final Logger LOG = Logger.getInstance(DiffParser.class.getName());
+  public static final String COMMITS_SEPARATOR = "JJJJ ";
+
+  public static void parse(@NotNull final LinesIterator input,
+                           @NotNull final DiffProcessor proc) {
+
+    String revision = null;
+    String baseRevision = null;
+    String file = null;
+
+
+    String line;
+    while ((line = input.nextLine()) != null) {
+      if (line.length() == 0) continue;
+
+      if (line.startsWith(COMMITS_SEPARATOR)) {
+        revision = null;
+        baseRevision = null;
+        file = null;
+        continue;
+      }
+
+      if (line.startsWith("diff")) {
+        final Matcher matcher = Pattern.compile("diff\\s+-r\\s+([0-9a-z]+)\\s+-r\\s+([0-9a-z]+)\\s+(.*)").matcher(line);
+        if (matcher.find()) {
+          baseRevision = matcher.group(1);
+          revision = matcher.group(2);
+          file = matcher.group(3);
+        } else {
+          LOG.warn("Unexpected line: " + line);
+        }
+
+        continue;
+      }
+
+      if (line.startsWith("---")) {
+        if (line.contains("/dev/null")) baseRevision = null;
+        continue;
+      }
+
+      if (line.startsWith("+++") || line.startsWith("@@")) continue;
+
+      if (line.startsWith("+") || line.startsWith("-")) {
+        assert revision != null;
+        assert file != null;
+
+        if (line.startsWith("+")) {
+          proc.append(revision, baseRevision, file, line.substring(1));
+        }
+
+        if (line.startsWith("-")) {
+          proc.remove(revision, baseRevision, file, line.substring(1));
+        }
+      }
+    }
+  }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/diff/DiffProcessor.java	Fri Jan 03 16:03:21 2014 +0100
@@ -0,0 +1,22 @@
+package jetbrains.buildServer.buildTriggers.vcs.mercurial.command.diff;
+
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+/**
+* Created 03.01.14 15:50
+*
+* @author Eugene Petrenko (eugene.petrenko@jetbrains.com)
+*/
+public interface DiffProcessor {
+
+  void append(@NotNull final String revision,
+              @Nullable final String baseRevision,
+              @NotNull final String file,
+              @NotNull final String line);
+
+  void remove(@NotNull final String revision,
+              @Nullable final String baseRevision,
+              @NotNull final String file,
+              @NotNull final String line);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/diff/LinesIterator.java	Fri Jan 03 16:03:21 2014 +0100
@@ -0,0 +1,13 @@
+package jetbrains.buildServer.buildTriggers.vcs.mercurial.command.diff;
+
+import org.jetbrains.annotations.Nullable;
+
+/**
+* Created 03.01.14 15:52
+*
+* @author Eugene Petrenko (eugene.petrenko@jetbrains.com)
+*/
+public interface LinesIterator {
+  @Nullable
+  String nextLine();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mercurial-tests/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/diff/DiffParserTest.java	Fri Jan 03 16:03:21 2014 +0100
@@ -0,0 +1,99 @@
+package jetbrains.buildServer.buildTriggers.vcs.mercurial.command.diff;
+
+import jetbrains.buildServer.util.StringUtil;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+import org.testng.Assert;
+import org.testng.annotations.Test;
+
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Method;
+import java.lang.reflect.Proxy;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * Created 03.01.14 15:55
+ *
+ * @author Eugene Petrenko (eugene.petrenko@jetbrains.com)
+ */
+@Test
+public class DiffParserTest {
+
+  @Test
+  public void should_provide_callbacks_for_simple_diff() {
+
+    do_test("JJJJ 26952844704d\n" +
+            "diff -r 0b4e7f84d45f -r 26952844704d .hgsubstate\n" +
+            "--- a/.hgsubstate\tThu Jan 19 17:27:48 2012 +0400\n" +
+            "+++ b/.hgsubstate\tThu Jan 19 17:28:16 2012 +0400\n" +
+            "@@ -1,2 +1,2 @@\n" +
+            "-a4df811123136e817028a44226ff2377bb8bb377 Platform\n" +
+            "-5a78af38f4971548792897bcdff778e533068f74 Psi.Features\n" +
+            "+0ccb706430e57563ec7caf7a1f3f5212ea661c1a Platform\n" +
+            "+627758500a98b3834358aa885549fedccacca26b Psi.Features\n" +
+            "\n" +
+            "JJJJ 0b4e7f84d45f\n" +
+            "diff -r 75a13ad66b06 -r 0b4e7f84d45f .hgsubstate\n" +
+            "--- a/.hgsubstate\tThu Jan 19 17:27:01 2012 +0400\n" +
+            "+++ b/.hgsubstate\tThu Jan 19 17:27:48 2012 +0400\n" +
+            "@@ -1,2 +1,2 @@\n" +
+            "-c59974e3c8e7d1758aade9befa4d3419c6a8a6b6 Platform\n" +
+            "-5e99e7af8a284e201fe8a659239cd4d05c783f02 Psi.Features\n" +
+            "+a4df811123136e817028a44226ff2377bb8bb377 Platform\n" +
+            "+5a78af38f4971548792897bcdff778e533068f74 Psi.Features\n" +
+            "\n" +
+            "JJJJ 75a13ad66b06\n" +
+            "diff -r 96eebd936bd2 -r 75a13ad66b06 .hgsubstate\n" +
+            "--- /dev/null\tThu Jan 01 00:00:00 1970 +0000\n" +
+            "+++ b/.hgsubstate\tThu Jan 19 17:27:01 2012 +0400\n" +
+            "@@ -0,0 +1,2 @@\n" +
+            "+c59974e3c8e7d1758aade9befa4d3419c6a8a6b6 Platform\n" +
+            "+5e99e7af8a284e201fe8a659239cd4d05c783f02 Psi.Features\n" +
+            "\n",
+            "remove 26952844704d, 0b4e7f84d45f, .hgsubstate, a4df811123136e817028a44226ff2377bb8bb377 Platform",
+            "remove 26952844704d, 0b4e7f84d45f, .hgsubstate, 5a78af38f4971548792897bcdff778e533068f74 Psi.Features",
+            "append 26952844704d, 0b4e7f84d45f, .hgsubstate, 0ccb706430e57563ec7caf7a1f3f5212ea661c1a Platform",
+            "append 26952844704d, 0b4e7f84d45f, .hgsubstate, 627758500a98b3834358aa885549fedccacca26b Psi.Features",
+            "remove 0b4e7f84d45f, 75a13ad66b06, .hgsubstate, c59974e3c8e7d1758aade9befa4d3419c6a8a6b6 Platform",
+            "remove 0b4e7f84d45f, 75a13ad66b06, .hgsubstate, 5e99e7af8a284e201fe8a659239cd4d05c783f02 Psi.Features",
+            "append 0b4e7f84d45f, 75a13ad66b06, .hgsubstate, a4df811123136e817028a44226ff2377bb8bb377 Platform",
+            "append 0b4e7f84d45f, 75a13ad66b06, .hgsubstate, 5a78af38f4971548792897bcdff778e533068f74 Psi.Features",
+            "append 75a13ad66b06, <null>, .hgsubstate, c59974e3c8e7d1758aade9befa4d3419c6a8a6b6 Platform",
+            "append 75a13ad66b06, <null>, .hgsubstate, 5e99e7af8a284e201fe8a659239cd4d05c783f02 Psi.Features");
+  }
+
+  public void do_test(@NotNull String input, @NotNull String... gold) {
+    final List<String> log = new ArrayList<String>();
+
+    final String[] lines = StringUtil.splitByLines(input);
+    DiffParser.parse(new LinesIterator() {
+      int ix = 0;
+
+      @Nullable
+      public String nextLine() {
+        if (ix >= lines.length) return null;
+        return lines[ix++];
+      }
+    }, (DiffProcessor) Proxy.newProxyInstance(getClass().getClassLoader(), new Class<?>[]{DiffProcessor.class}, new InvocationHandler() {
+      public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
+        List<String> argz = new ArrayList<String>();
+        for (Object o : args) {
+          if (o == null) {
+            argz.add("<null>");
+          } else {
+            argz.add(o.toString());
+          }
+        }
+
+        final String call = method.getName() + " " + StringUtil.join(", ", argz);
+        log.add(call);
+        System.out.println(call);
+        return null;
+      }
+    }));
+
+    Assert.assertEquals(log, new ArrayList<String>(Arrays.asList(gold)));
+  }
+}