Mercurial > hg > mercurial
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))); + } +}