# HG changeset patch # User Dmitry Neverov # Date 1335604456 -14400 # Node ID ef53ca83df1bf2b1de715ba8afeb3a11408f14bb # Parent 20f5eca6b8ec60543972012f238067fcc17dceb3# Parent 83aff5760c25893bcef49aaf12b0e2e5c7150925 Merge branch Faradi-7.0.x diff -r 20f5eca6b8ec -r ef53ca83df1b mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/LogCommand.java --- a/mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/LogCommand.java Thu Apr 26 16:43:19 2012 +0400 +++ b/mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/LogCommand.java Sat Apr 28 13:14:16 2012 +0400 @@ -219,6 +219,8 @@ private List getModifiedFiles(@NotNull final Element logEntry) { List result = new ArrayList(); Element paths = logEntry.getChild("paths"); + if (paths == null) + return result; for (Object o : paths.getChildren("path")) { Element path = (Element) o; result.add(getModifiedFile(path)); diff -r 20f5eca6b8ec -r ef53ca83df1b mercurial-server/resources/buildServerResources/log.no.files.template --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mercurial-server/resources/buildServerResources/log.no.files.template Sat Apr 28 13:14:16 2012 +0400 @@ -0,0 +1,6 @@ +header = '\n\n' +footer = '\n' + +changeset = '\n{parents}\n{date|date|xmlescape}\n{desc|xmlescape}\n\n' + +parent = '\n' diff -r 20f5eca6b8ec -r ef53ca83df1b mercurial-server/resources/buildServerResources/log.template --- a/mercurial-server/resources/buildServerResources/log.template Thu Apr 26 16:43:19 2012 +0400 +++ b/mercurial-server/resources/buildServerResources/log.template Sat Apr 28 13:14:16 2012 +0400 @@ -1,17 +1,11 @@ header = '\n\n' footer = '\n' -changeset = '\n{branches}{tags}{parents}{author|person|xmlescape}\n{date|date|xmlescape}\n{desc|xmlescape}\n\n{file_adds}{file_dels}{file_mods}\n{file_copies}\n' +changeset = '\n{parents}\n{date|date|xmlescape}\n{desc|xmlescape}\n\n{file_adds}{file_dels}{file_mods}\n\n' file_add = '{file_add|xmlescape}\n' file_mod = '{file_mod|xmlescape}\n' file_del = '{file_del|xmlescape}\n' -start_file_copies = '\n' -file_copy = '{name|xmlescape}\n' -end_file_copies = '\n' +parent = '\n' -parent = '\n' -branch = '{branch|xmlescape}\n' -tag = '{tag|xmlescape}\n' -extra = '{value|xmlescape}\n' diff -r 20f5eca6b8ec -r ef53ca83df1b mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/RepoFactory.java --- a/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/RepoFactory.java Thu Apr 26 16:43:19 2012 +0400 +++ b/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/RepoFactory.java Sat Apr 28 13:14:16 2012 +0400 @@ -18,15 +18,17 @@ private final ServerPluginConfig myConfig; private File myLogTemplate; + private File myLogNoFilesTemplate; public RepoFactory(@NotNull ServerPluginConfig config) throws IOException { myConfig = config; myLogTemplate = createLogTemplate(); + myLogNoFilesTemplate = createLogNoFilesTemplate(); } @NotNull public ServerHgRepo create(@NotNull File workingDir, @NotNull String hgPath, @NotNull AuthSettings authSettings) throws VcsException { - return new ServerHgRepo(myConfig, workingDir, hgPath, authSettings).withLogTemplate(getTemplate()); + return new ServerHgRepo(myConfig, workingDir, hgPath, authSettings).withLogTemplates(getTemplate(), getLogNoFilesTemplate()); } public void dispose() { @@ -44,9 +46,26 @@ } } + private File getLogNoFilesTemplate() throws VcsException { + if (myLogNoFilesTemplate.isFile() && myLogNoFilesTemplate.exists()) + return myLogNoFilesTemplate; + try { + myLogNoFilesTemplate = createLogNoFilesTemplate(); + return myLogNoFilesTemplate; + } catch (IOException e) { + throw new VcsException("Cannot create mercurial log template", e); + } + } + private File createLogTemplate() throws IOException { File template = createTempFile("teamcity", "hg.log.template"); FileUtil.copyResource(RepoFactory.class, "/buildServerResources/log.template", template); return template; } + + private File createLogNoFilesTemplate() throws IOException { + File template = createTempFile("teamcity", "hg.short.log.template"); + FileUtil.copyResource(RepoFactory.class, "/buildServerResources/log.no.files.template", template); + return template; + } } diff -r 20f5eca6b8ec -r ef53ca83df1b mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/ServerHgRepo.java --- a/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/ServerHgRepo.java Thu Apr 26 16:43:19 2012 +0400 +++ b/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/ServerHgRepo.java Sat Apr 28 13:14:16 2012 +0400 @@ -14,14 +14,16 @@ private final static HgVersion REVSET_HG_VERSION = new HgVersion(1, 7, 0); private final ServerPluginConfig myConfig; private File myLogTemplate; + private File myLogNoFilesTemplate; public ServerHgRepo(@NotNull ServerPluginConfig config, @NotNull File workingDir, @NotNull String hgPath, @NotNull AuthSettings authSettings) { super(workingDir, hgPath, authSettings); myConfig = config; } - public ServerHgRepo withLogTemplate(@NotNull File logTemplate) { + public ServerHgRepo withLogTemplates(@NotNull File logTemplate, @NotNull File logNoFilesTemplate) { myLogTemplate = logTemplate; + myLogNoFilesTemplate = logNoFilesTemplate; return this; } @@ -40,13 +42,13 @@ @NotNull public CollectChangesCommand collectChanges() throws VcsException { if (myConfig.dontUseRevsets()) - return new CollectChangesNoRevsets(this); + return new CollectChangesNoRevsets(this, myLogNoFilesTemplate); HgVersion hgVersion = getHgVersion(); if (hgVersion.isEqualsOrGreaterThan(REVSET_HG_VERSION)) { return new CollectChangesWithRevsets(this); } else { - return new CollectChangesNoRevsets(this); + return new CollectChangesNoRevsets(this, myLogNoFilesTemplate); } } diff -r 20f5eca6b8ec -r ef53ca83df1b mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/CollectChangesNoRevsets.java --- a/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/CollectChangesNoRevsets.java Thu Apr 26 16:43:19 2012 +0400 +++ b/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/CollectChangesNoRevsets.java Sat Apr 28 13:14:16 2012 +0400 @@ -8,6 +8,7 @@ import jetbrains.buildServer.vcs.VcsException; import org.jetbrains.annotations.NotNull; +import java.io.File; import java.util.*; /** @@ -16,9 +17,11 @@ public class CollectChangesNoRevsets extends CollectChangesCommand { private ServerHgRepo myRepo; + private File myLogNoFilesTemplate; - public CollectChangesNoRevsets(@NotNull ServerHgRepo repo) { + public CollectChangesNoRevsets(@NotNull ServerHgRepo repo, @NotNull File logNoFilesTemplate) { myRepo = repo; + myLogNoFilesTemplate = logNoFilesTemplate; } @Override @@ -28,6 +31,25 @@ @NotNull public List call(@NotNull final String fromCommit, @NotNull final String toCommit) throws VcsException { + Pair, Integer> commitsWithoutFiles = getCommitsWithoutFiles(fromCommit, toCommit); + List csetsWithoutFiles = commitsWithoutFiles.first; + Integer minRevNum = commitsWithoutFiles.second; + if (csetsWithoutFiles.isEmpty()) + return csetsWithoutFiles; + List commitsWithFiles = getRevisionsBetween(minRevNum, toCommit); + Map csetMap = getChangesetMap(commitsWithFiles); + List result = new ArrayList(); + for (ChangeSet cset : csetsWithoutFiles) { + ChangeSet csetWithFiles = csetMap.get(cset.getId()); + if (csetWithFiles != null) + result.add(csetWithFiles); + } + return result; + } + + + @NotNull + private Pair, Integer> getCommitsWithoutFiles(@NotNull String fromCommit, @NotNull String toCommit) throws VcsException { List csets = getRevisionsReachableFrom(toCommit); Map csetsMap = getChangesetMap(csets); if (csetsMap.containsKey(fromCommit)) { @@ -35,17 +57,21 @@ DAGIterator iter = dag.iterator(toCommit); iter.markUninteresting(fromCommit); List result = new ArrayList(); + int minRevNum = Integer.MAX_VALUE; while (iter.hasNext()) { String commit = iter.next(); ChangeSet cset = csetsMap.get(commit); if (cset == null) throw new IllegalStateException("Cannot find cset for id " + commit + ", csets map: " + csetsMap); + int revNum = cset.getRevNumber(); + if (revNum < minRevNum) + minRevNum = revNum; result.add(cset); } Collections.reverse(result); - return result; + return Pair.create(result, minRevNum); } else { - return Collections.emptyList(); + return new Pair, Integer>(Collections.emptyList(), Integer.MAX_VALUE); } } @@ -64,6 +90,16 @@ .fromRevision(revision) .toRevision("0") .showCommitsFromAllBranches() + .withTemplate(myLogNoFilesTemplate) + .call(); + } + + + private List getRevisionsBetween(int fromRevNum, @NotNull String toCommit) throws VcsException { + return myRepo.log() + .fromRevision(toCommit) + .toRevision(String.valueOf(fromRevNum)) + .showCommitsFromAllBranches() .call(); } diff -r 20f5eca6b8ec -r ef53ca83df1b mercurial-tests/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/ServerPluginConfigBuilder.java --- a/mercurial-tests/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/ServerPluginConfigBuilder.java Thu Apr 26 16:43:19 2012 +0400 +++ b/mercurial-tests/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/ServerPluginConfigBuilder.java Sat Apr 28 13:14:16 2012 +0400 @@ -12,7 +12,7 @@ private boolean myUsePullProtocol = true; private String myHgPath; private File myCachesDir; - + private boolean myDontUseRevsets = false; @NotNull public ServerPluginConfig build() { @@ -38,7 +38,7 @@ } public boolean dontUseRevsets() { - return false; + return myDontUseRevsets; } }; } @@ -58,4 +58,9 @@ myCachesDir = cachesDir; return this; } + + public ServerPluginConfigBuilder dontUseRevsets() { + myDontUseRevsets = true; + return this; + } }