# HG changeset patch # User eugene.petrenko@jetbrains.com # Date 1389641399 -3600 # Node ID 785ab04c78dac5998dc086380c268f3c5c9be9e4 # Parent 501cb1911d4b8a3b392577da6cebe33f0bb513e7 implement new graph construction code diff -r 501cb1911d4b -r 785ab04c78da mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/CommitsAndMountPointsCommand.java --- 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); diff -r 501cb1911d4b -r 785ab04c78da mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/CommitsAndMountPointsParser.java --- 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); } diff -r 501cb1911d4b -r 785ab04c78da mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialCommitsInfoBuilderStates.java --- /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 myHgStateNodes = new HashMap(); + private final Map myHgSubNodes = new HashMap(); + + 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 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)); + } +} diff -r 501cb1911d4b -r 785ab04c78da mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialCommitsInfoBuilderSupport.java --- 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 commitToTag = new MultiMap(); - for (Map.Entry 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); + } + }); } + } diff -r 501cb1911d4b -r 785ab04c78da mercurial-tests/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/CommitsAndMountPointsCommandParserTest.java --- 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 proxy(@NotNull final Class clazz, @NotNull final List 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; }