annotate mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/LogCommand.java @ 732:31a1aca3305c

Update copyright
author Dmitry Neverov <dmitry.neverov@jetbrains.com>
date Tue, 14 Jan 2014 12:45:10 +0100
parents fbff229ee2dc
children b7deb8f24278 97ae319eed9b
rev   line source
266
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 250
diff changeset
1 /*
732
31a1aca3305c Update copyright
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 699
diff changeset
2 * Copyright 2000-2014 JetBrains s.r.o.
266
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 250
diff changeset
3 *
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 250
diff changeset
4 * Licensed under the Apache License, Version 2.0 (the "License");
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 250
diff changeset
5 * you may not use this file except in compliance with the License.
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 250
diff changeset
6 * You may obtain a copy of the License at
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 250
diff changeset
7 *
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 250
diff changeset
8 * http://www.apache.org/licenses/LICENSE-2.0
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 250
diff changeset
9 *
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 250
diff changeset
10 * Unless required by applicable law or agreed to in writing, software
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 250
diff changeset
11 * distributed under the License is distributed on an "AS IS" BASIS,
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 250
diff changeset
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 250
diff changeset
13 * See the License for the specific language governing permissions and
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 250
diff changeset
14 * limitations under the License.
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 250
diff changeset
15 */
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 250
diff changeset
16 package jetbrains.buildServer.buildTriggers.vcs.mercurial.command;
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 250
diff changeset
17
451
5d4a7174c316 Do not insert output into exception message, it can be long
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 449
diff changeset
18 import com.intellij.openapi.diagnostic.Logger;
266
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 250
diff changeset
19 import jetbrains.buildServer.vcs.VcsException;
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 250
diff changeset
20 import org.jetbrains.annotations.NotNull;
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 381
diff changeset
21 import org.jetbrains.annotations.Nullable;
449
56aa3f718c24 Use SAX instead of DOM
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 421
diff changeset
22 import org.xml.sax.SAXException;
266
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 250
diff changeset
23
449
56aa3f718c24 Use SAX instead of DOM
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 421
diff changeset
24 import javax.xml.parsers.ParserConfigurationException;
56aa3f718c24 Use SAX instead of DOM
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 421
diff changeset
25 import javax.xml.parsers.SAXParser;
56aa3f718c24 Use SAX instead of DOM
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 421
diff changeset
26 import javax.xml.parsers.SAXParserFactory;
56aa3f718c24 Use SAX instead of DOM
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 421
diff changeset
27 import java.io.ByteArrayInputStream;
266
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 250
diff changeset
28 import java.io.File;
299
e9e7d9fcf57d Use customized xml output from the 'hg log' command instead of running 'hg status' for every commit
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 280
diff changeset
29 import java.io.IOException;
381
44a16c27bed6 Handle changes in ExecResult api
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 380
diff changeset
30 import java.nio.charset.Charset;
699
fbff229ee2dc add 'files' for log command
eugene.petrenko@jetbrains.com
parents: 698
diff changeset
31 import java.util.*;
266
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 250
diff changeset
32
280
8c1fd2e565ae Implement mercurial detection on the agents
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 276
diff changeset
33 public class LogCommand extends VcsRootCommand {
276
8c10f5cec37d TW-17797 Fix merge-base calculation
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 271
diff changeset
34
451
5d4a7174c316 Do not insert output into exception message, it can be long
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 449
diff changeset
35 private final static Logger LOG = Logger.getInstance(LogCommand.class.getName());
654
3daa8e36f8f1 include branch name into log commands
eugene.petrenko@gmail.com
parents: 480
diff changeset
36 public final static String ZERO_PARENT_ID = "0000000000000000000000000000000000000000";
662
c3c0ebc63d77 CommitsInfoBuilder command now returns all commits without respect to state parameter (API update will follow)
eugene.petrenko@gmail.com
parents: 654
diff changeset
37 public final static String ZERO_PARENT_SHORT_ID = "000000000000";
449
56aa3f718c24 Use SAX instead of DOM
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 421
diff changeset
38 private final static SAXParserFactory ourSAXFactory = SAXParserFactory.newInstance();
276
8c10f5cec37d TW-17797 Fix merge-base calculation
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 271
diff changeset
39
266
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 250
diff changeset
40 private String myFromId;
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 250
diff changeset
41 private String myToId;
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 250
diff changeset
42 private Integer myLimit = null;
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 250
diff changeset
43 private String myBranchName;
276
8c10f5cec37d TW-17797 Fix merge-base calculation
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 271
diff changeset
44 private boolean myCalculateParents = true;
8c10f5cec37d TW-17797 Fix merge-base calculation
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 271
diff changeset
45 private String myRevsets;
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 381
diff changeset
46 private File myTemplate;
699
fbff229ee2dc add 'files' for log command
eugene.petrenko@jetbrains.com
parents: 698
diff changeset
47 private List<String> myFiles = new ArrayList<String>();
266
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 250
diff changeset
48
480
efba721f9a1d TW-23382 agent logs with info, server logs with debug
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 460
diff changeset
49 public LogCommand(@NotNull CommandSettings commandSettings,
efba721f9a1d TW-23382 agent logs with info, server logs with debug
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 460
diff changeset
50 @NotNull String hgPath,
efba721f9a1d TW-23382 agent logs with info, server logs with debug
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 460
diff changeset
51 @NotNull File workingDir,
efba721f9a1d TW-23382 agent logs with info, server logs with debug
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 460
diff changeset
52 @NotNull AuthSettings authSettings) {
efba721f9a1d TW-23382 agent logs with info, server logs with debug
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 460
diff changeset
53 super(commandSettings, hgPath, workingDir, authSettings);
266
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 250
diff changeset
54 }
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 250
diff changeset
55
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 381
diff changeset
56 public LogCommand withTemplate(@NotNull File template) {
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 381
diff changeset
57 myTemplate = template;
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 381
diff changeset
58 return this;
276
8c10f5cec37d TW-17797 Fix merge-base calculation
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 271
diff changeset
59 }
8c10f5cec37d TW-17797 Fix merge-base calculation
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 271
diff changeset
60
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 381
diff changeset
61 public LogCommand inBranch(@NotNull String branchName) {
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 381
diff changeset
62 myBranchName = branchName;
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 381
diff changeset
63 return this;
276
8c10f5cec37d TW-17797 Fix merge-base calculation
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 271
diff changeset
64 }
8c10f5cec37d TW-17797 Fix merge-base calculation
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 271
diff changeset
65
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 381
diff changeset
66 public LogCommand fromRevision(@Nullable String fromRevision) {
698
68251dea7eae resolve IDEA warning
eugene.petrenko@jetbrains.com
parents: 662
diff changeset
67 myFromId = fromRevision == null ? null : new ChangeSet(fromRevision).getId();
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 381
diff changeset
68 return this;
266
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 250
diff changeset
69 }
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 250
diff changeset
70
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 381
diff changeset
71 public LogCommand toRevision(@Nullable String toRevision) {
698
68251dea7eae resolve IDEA warning
eugene.petrenko@jetbrains.com
parents: 662
diff changeset
72 myToId = toRevision == null ? null : new ChangeSet(toRevision).getId();
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 381
diff changeset
73 return this;
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 381
diff changeset
74 }
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 381
diff changeset
75
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 381
diff changeset
76 public LogCommand toNamedRevision(@Nullable String namedRevision) {
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 381
diff changeset
77 myToId = namedRevision;
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 381
diff changeset
78 return this;
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 381
diff changeset
79 }
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 381
diff changeset
80
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 381
diff changeset
81 public LogCommand setLimit(final int limit) {
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 381
diff changeset
82 myLimit = limit;
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 381
diff changeset
83 return this;
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 381
diff changeset
84 }
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 381
diff changeset
85
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 381
diff changeset
86 public LogCommand showCommitsFromAllBranches() {
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 381
diff changeset
87 myBranchName = null;
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 381
diff changeset
88 return this;
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 381
diff changeset
89 }
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 381
diff changeset
90
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 381
diff changeset
91 public LogCommand dontCalculateParents() {
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 381
diff changeset
92 myCalculateParents = false;
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 381
diff changeset
93 return this;
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 381
diff changeset
94 }
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 381
diff changeset
95
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 381
diff changeset
96 public LogCommand withRevsets(String revsets) {
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 381
diff changeset
97 myRevsets = revsets;
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 381
diff changeset
98 return this;
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 381
diff changeset
99 }
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 381
diff changeset
100
699
fbff229ee2dc add 'files' for log command
eugene.petrenko@jetbrains.com
parents: 698
diff changeset
101 public LogCommand forFile(@NotNull final String file) {
fbff229ee2dc add 'files' for log command
eugene.petrenko@jetbrains.com
parents: 698
diff changeset
102 myFiles.add(file);
fbff229ee2dc add 'files' for log command
eugene.petrenko@jetbrains.com
parents: 698
diff changeset
103 return this;
fbff229ee2dc add 'files' for log command
eugene.petrenko@jetbrains.com
parents: 698
diff changeset
104 }
fbff229ee2dc add 'files' for log command
eugene.petrenko@jetbrains.com
parents: 698
diff changeset
105
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 381
diff changeset
106 public List<ChangeSet> call() throws VcsException {
480
efba721f9a1d TW-23382 agent logs with info, server logs with debug
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 460
diff changeset
107 MercurialCommandLine cli = createCommandLine();
381
44a16c27bed6 Handle changes in ExecResult api
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 380
diff changeset
108 cli.setCharset(Charset.forName("UTF-8"));
380
3bc8125671b8 Merge branch Eluru-6.5.x
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 347 379
diff changeset
109 cli.addParameters("--encoding", "UTF-8");
266
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 250
diff changeset
110 cli.addParameter("log");
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 250
diff changeset
111 cli.addParameter("-v");
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 381
diff changeset
112 if (myTemplate != null)
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 381
diff changeset
113 cli.addParameter("--style=" + myTemplate.getAbsolutePath());
266
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 250
diff changeset
114 if (myBranchName != null) {
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 250
diff changeset
115 cli.addParameter("-b");
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 381
diff changeset
116 cli.addParameter(myBranchName);
266
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 250
diff changeset
117 }
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 250
diff changeset
118 cli.addParameter("-r");
276
8c10f5cec37d TW-17797 Fix merge-base calculation
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 271
diff changeset
119 if (myRevsets != null) {
8c10f5cec37d TW-17797 Fix merge-base calculation
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 271
diff changeset
120 cli.addParameter(myRevsets);
8c10f5cec37d TW-17797 Fix merge-base calculation
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 271
diff changeset
121 } else {
8c10f5cec37d TW-17797 Fix merge-base calculation
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 271
diff changeset
122 String from = myFromId != null ? myFromId : "0";
8c10f5cec37d TW-17797 Fix merge-base calculation
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 271
diff changeset
123 String to = myToId != null ? myToId : "tip";
8c10f5cec37d TW-17797 Fix merge-base calculation
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 271
diff changeset
124 cli.addParameter(from + ":" + to);
8c10f5cec37d TW-17797 Fix merge-base calculation
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 271
diff changeset
125 }
266
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 250
diff changeset
126 if (myLimit != null) {
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 250
diff changeset
127 cli.addParameter("--limit");
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 250
diff changeset
128 cli.addParameter(myLimit.toString());
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 250
diff changeset
129 }
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 250
diff changeset
130
699
fbff229ee2dc add 'files' for log command
eugene.petrenko@jetbrains.com
parents: 698
diff changeset
131 cli.addParameters(myFiles);
fbff229ee2dc add 'files' for log command
eugene.petrenko@jetbrains.com
parents: 698
diff changeset
132
347
4a49a0baf30b Merge branch Eluru-6.5.x
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 345 346
diff changeset
133 CommandResult res = runCommand(cli);
381
44a16c27bed6 Handle changes in ExecResult api
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 380
diff changeset
134 String output = res.getStdout();
299
e9e7d9fcf57d Use customized xml output from the 'hg log' command instead of running 'hg status' for every commit
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 280
diff changeset
135 try {
380
3bc8125671b8 Merge branch Eluru-6.5.x
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 347 379
diff changeset
136 List<ChangeSet> changes = parseChangeSetsXml(output);
299
e9e7d9fcf57d Use customized xml output from the 'hg log' command instead of running 'hg status' for every commit
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 280
diff changeset
137 if (myCalculateParents)
e9e7d9fcf57d Use customized xml output from the 'hg log' command instead of running 'hg status' for every commit
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 280
diff changeset
138 assignTrivialParents(changes);
e9e7d9fcf57d Use customized xml output from the 'hg log' command instead of running 'hg status' for every commit
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 280
diff changeset
139 return changes;
e9e7d9fcf57d Use customized xml output from the 'hg log' command instead of running 'hg status' for every commit
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 280
diff changeset
140 } catch (Exception e) {
451
5d4a7174c316 Do not insert output into exception message, it can be long
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 449
diff changeset
141 LOG.error("Error while parsing log output:\n" + output, e);
5d4a7174c316 Do not insert output into exception message, it can be long
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 449
diff changeset
142 throw new VcsException("Error while parsing log output, see teamcity-vcs.log for details", e);
380
3bc8125671b8 Merge branch Eluru-6.5.x
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 347 379
diff changeset
143 }
3bc8125671b8 Merge branch Eluru-6.5.x
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 347 379
diff changeset
144 }
3bc8125671b8 Merge branch Eluru-6.5.x
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 347 379
diff changeset
145
449
56aa3f718c24 Use SAX instead of DOM
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 421
diff changeset
146 private List<ChangeSet> parseChangeSetsXml(@NotNull final String xml) throws SAXException, ParserConfigurationException, IOException {
311
7f45db81af21 Hg output is empty when no changes found
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 304
diff changeset
147 if ("".equals(xml))
7f45db81af21 Hg output is empty when no changes found
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 304
diff changeset
148 return Collections.emptyList();
266
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 250
diff changeset
149
345
607091bd8ccd Merge branch Eluru-6.5.x
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 322 344
diff changeset
150 String validXml = makeValidXml(xml);
449
56aa3f718c24 Use SAX instead of DOM
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 421
diff changeset
151 MercurialXmlLogParser parser = new MercurialXmlLogParser();
56aa3f718c24 Use SAX instead of DOM
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 421
diff changeset
152 SAXParser saxParser = ourSAXFactory.newSAXParser();
458
1725588ec4f6 Fix compilation
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 451
diff changeset
153 saxParser.parse(new ByteArrayInputStream(validXml.getBytes("UTF-8")), parser);
449
56aa3f718c24 Use SAX instead of DOM
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 421
diff changeset
154 return parser.getChangeSets();
345
607091bd8ccd Merge branch Eluru-6.5.x
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 322 344
diff changeset
155 }
607091bd8ccd Merge branch Eluru-6.5.x
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 322 344
diff changeset
156
607091bd8ccd Merge branch Eluru-6.5.x
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 322 344
diff changeset
157 private String makeValidXml(@NotNull final String xml) {
607091bd8ccd Merge branch Eluru-6.5.x
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 322 344
diff changeset
158 String trimmed = xml.trim();
607091bd8ccd Merge branch Eluru-6.5.x
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 322 344
diff changeset
159 if (trimmed.endsWith("</log>"))
607091bd8ccd Merge branch Eluru-6.5.x
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 322 344
diff changeset
160 return xml;
607091bd8ccd Merge branch Eluru-6.5.x
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 322 344
diff changeset
161 else
607091bd8ccd Merge branch Eluru-6.5.x
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 322 344
diff changeset
162 return xml + "</log>";
607091bd8ccd Merge branch Eluru-6.5.x
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 322 344
diff changeset
163 }
607091bd8ccd Merge branch Eluru-6.5.x
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 322 344
diff changeset
164
299
e9e7d9fcf57d Use customized xml output from the 'hg log' command instead of running 'hg status' for every commit
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 280
diff changeset
165 private void assignTrivialParents(final @NotNull List<ChangeSet> csets) throws VcsException {
418
e56678c38fd5 Optimize parent calculation
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 399
diff changeset
166 Map<Integer, ChangeSet> revNumberMap = makeMapByRevNumber(csets);
276
8c10f5cec37d TW-17797 Fix merge-base calculation
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 271
diff changeset
167 for (ChangeSet cset : csets) {
8c10f5cec37d TW-17797 Fix merge-base calculation
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 271
diff changeset
168 if (cset.getParents().isEmpty()) {
8c10f5cec37d TW-17797 Fix merge-base calculation
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 271
diff changeset
169 int parentRevNumber = cset.getRevNumber() - 1;
418
e56678c38fd5 Optimize parent calculation
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 399
diff changeset
170 ChangeSet parent = revNumberMap.get(parentRevNumber);
e56678c38fd5 Optimize parent calculation
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 399
diff changeset
171 if (parent != null) {
e56678c38fd5 Optimize parent calculation
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 399
diff changeset
172 cset.addParent(parent);
e56678c38fd5 Optimize parent calculation
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 399
diff changeset
173 } else {
e56678c38fd5 Optimize parent calculation
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 399
diff changeset
174 String parentId = getIdOf(parentRevNumber);
e56678c38fd5 Optimize parent calculation
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 399
diff changeset
175 cset.addParent(new ChangeSetRevision(parentRevNumber, parentId));
e56678c38fd5 Optimize parent calculation
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 399
diff changeset
176 }
276
8c10f5cec37d TW-17797 Fix merge-base calculation
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 271
diff changeset
177 }
8c10f5cec37d TW-17797 Fix merge-base calculation
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 271
diff changeset
178 }
8c10f5cec37d TW-17797 Fix merge-base calculation
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 271
diff changeset
179 }
8c10f5cec37d TW-17797 Fix merge-base calculation
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 271
diff changeset
180
418
e56678c38fd5 Optimize parent calculation
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 399
diff changeset
181 private Map<Integer, ChangeSet> makeMapByRevNumber(@NotNull List<ChangeSet> csets) throws VcsException {
e56678c38fd5 Optimize parent calculation
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 399
diff changeset
182 Map<Integer, ChangeSet> csetMap = new HashMap<Integer, ChangeSet>();
e56678c38fd5 Optimize parent calculation
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 399
diff changeset
183 for (ChangeSet cset : csets) {
e56678c38fd5 Optimize parent calculation
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 399
diff changeset
184 csetMap.put(cset.getRevNumber(), cset);
e56678c38fd5 Optimize parent calculation
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 399
diff changeset
185 }
e56678c38fd5 Optimize parent calculation
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 399
diff changeset
186 return csetMap;
e56678c38fd5 Optimize parent calculation
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 399
diff changeset
187 }
e56678c38fd5 Optimize parent calculation
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 399
diff changeset
188
276
8c10f5cec37d TW-17797 Fix merge-base calculation
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 271
diff changeset
189 private String getIdOf(int revNumber) throws VcsException {
8c10f5cec37d TW-17797 Fix merge-base calculation
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 271
diff changeset
190 if (revNumber < 0)
8c10f5cec37d TW-17797 Fix merge-base calculation
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 271
diff changeset
191 return ZERO_PARENT_ID;
480
efba721f9a1d TW-23382 agent logs with info, server logs with debug
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 460
diff changeset
192 return new IdentifyCommand(myCommandSettings, getHgPath(), getWorkDirectory(), myAuthSettings)
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 381
diff changeset
193 .revisionNumber(revNumber)
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 381
diff changeset
194 .inLocalRepository()
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 381
diff changeset
195 .call();
276
8c10f5cec37d TW-17797 Fix merge-base calculation
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 271
diff changeset
196 }
449
56aa3f718c24 Use SAX instead of DOM
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 421
diff changeset
197 }