annotate mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/CommandResult.java @ 710:efd1d23a3ae6

disable local test
author eugene.petrenko@jetbrains.com
date Wed, 08 Jan 2014 22:47:35 +0100
parents 1da36037196d
children 31a1aca3305c
rev   line source
346
e8f0eb6d4ca4 Introduce CommandResult that filters out private data from ExecResult
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
1 package jetbrains.buildServer.buildTriggers.vcs.mercurial.command;
e8f0eb6d4ca4 Introduce CommandResult that filters out private data from ExecResult
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
2
430
3600b68a4c0c TW-21403 better error message when hg not found
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 423
diff changeset
3 import com.intellij.execution.process.ProcessNotCreatedException;
367
061e5f3a6bad Make plugin compatible with mercurial 2.1
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 349
diff changeset
4 import com.intellij.openapi.diagnostic.Logger;
346
e8f0eb6d4ca4 Introduce CommandResult that filters out private data from ExecResult
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
5 import jetbrains.buildServer.ExecResult;
430
3600b68a4c0c TW-21403 better error message when hg not found
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 423
diff changeset
6 import jetbrains.buildServer.buildTriggers.vcs.mercurial.command.exception.*;
367
061e5f3a6bad Make plugin compatible with mercurial 2.1
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 349
diff changeset
7 import jetbrains.buildServer.util.StringUtil;
349
e0464f11206c TW-19698 Handle unrelated repositories
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 346
diff changeset
8 import jetbrains.buildServer.vcs.VcsException;
346
e8f0eb6d4ca4 Introduce CommandResult that filters out private data from ExecResult
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
9 import org.jetbrains.annotations.NotNull;
e8f0eb6d4ca4 Introduce CommandResult that filters out private data from ExecResult
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
10 import org.jetbrains.annotations.Nullable;
e8f0eb6d4ca4 Introduce CommandResult that filters out private data from ExecResult
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
11
430
3600b68a4c0c TW-21403 better error message when hg not found
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 423
diff changeset
12 import java.io.IOException;
387
88480a85f888 Some exit codes mean errors
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 386
diff changeset
13 import java.util.HashSet;
346
e8f0eb6d4ca4 Introduce CommandResult that filters out private data from ExecResult
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
14 import java.util.Set;
e8f0eb6d4ca4 Introduce CommandResult that filters out private data from ExecResult
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
15
367
061e5f3a6bad Make plugin compatible with mercurial 2.1
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 349
diff changeset
16 import static com.intellij.openapi.util.text.StringUtil.isEmpty;
387
88480a85f888 Some exit codes mean errors
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 386
diff changeset
17 import static java.util.Arrays.asList;
346
e8f0eb6d4ca4 Introduce CommandResult that filters out private data from ExecResult
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
18 import static jetbrains.buildServer.buildTriggers.vcs.mercurial.command.CommandUtil.removePrivateData;
e8f0eb6d4ca4 Introduce CommandResult that filters out private data from ExecResult
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
19
e8f0eb6d4ca4 Introduce CommandResult that filters out private data from ExecResult
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
20 /**
367
061e5f3a6bad Make plugin compatible with mercurial 2.1
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 349
diff changeset
21 * Mercurial command result. Filters out private data from stdout and detects errors.
346
e8f0eb6d4ca4 Introduce CommandResult that filters out private data from ExecResult
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
22 *
e8f0eb6d4ca4 Introduce CommandResult that filters out private data from ExecResult
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
23 * @author dmitry.neverov
e8f0eb6d4ca4 Introduce CommandResult that filters out private data from ExecResult
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
24 */
e8f0eb6d4ca4 Introduce CommandResult that filters out private data from ExecResult
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
25 public class CommandResult {
e8f0eb6d4ca4 Introduce CommandResult that filters out private data from ExecResult
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
26
387
88480a85f888 Some exit codes mean errors
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 386
diff changeset
27 //Mercurial returns -1 in the case of errors (see dispatch.py)
88480a85f888 Some exit codes mean errors
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 386
diff changeset
28 //and on some shells (e.g. windows cmd) it is truncated to 255.
88480a85f888 Some exit codes mean errors
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 386
diff changeset
29 //A non-zero exit code is not always an error:
88480a85f888 Some exit codes mean errors
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 386
diff changeset
30 //http://mercurial.selenic.com/bts/issue186
88480a85f888 Some exit codes mean errors
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 386
diff changeset
31 //http://mercurial.selenic.com/bts/issue2189
88480a85f888 Some exit codes mean errors
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 386
diff changeset
32 //e.g. pull command in hg 2.1 exits with 1 if no new changes were pulled.
88480a85f888 Some exit codes mean errors
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 386
diff changeset
33 private static final Set<Integer> ERROR_EXIT_CODES = setOf(-1, 255);
88480a85f888 Some exit codes mean errors
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 386
diff changeset
34
430
3600b68a4c0c TW-21403 better error message when hg not found
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 423
diff changeset
35 private static final String MERCURIAL_NOT_FOUND_MESSAGE_PREFIX = "Cannot run program \"";
431
9a2b6a7a3381 Better detection of the case when mercurial not found
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 430
diff changeset
36 private static final String MERCURIAL_NOT_FOUND_MESSAGE_SUFFIX1 = "No such file or directory";
9a2b6a7a3381 Better detection of the case when mercurial not found
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 430
diff changeset
37 private static final String MERCURIAL_NOT_FOUND_MESSAGE_SUFFIX2 = "The system cannot find the file specified";
430
3600b68a4c0c TW-21403 better error message when hg not found
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 423
diff changeset
38
367
061e5f3a6bad Make plugin compatible with mercurial 2.1
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 349
diff changeset
39 private final Logger myLogger;
349
e0464f11206c TW-19698 Handle unrelated repositories
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 346
diff changeset
40 private final String myCommand;
346
e8f0eb6d4ca4 Introduce CommandResult that filters out private data from ExecResult
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
41 private final ExecResult myDelegate;
e8f0eb6d4ca4 Introduce CommandResult that filters out private data from ExecResult
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
42 private final Set<String> myPrivateData;
596
a37960e1f0a0 Log stderr when hg command fails to ease troubleshooting
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 577
diff changeset
43 private final CommandSettings mySettings;
346
e8f0eb6d4ca4 Introduce CommandResult that filters out private data from ExecResult
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
44
423
010d8663ac4d TW-21384 better error message
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 399
diff changeset
45 public CommandResult(@NotNull Logger logger,
010d8663ac4d TW-21384 better error message
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 399
diff changeset
46 @NotNull String command,
010d8663ac4d TW-21384 better error message
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 399
diff changeset
47 @NotNull ExecResult execResult,
596
a37960e1f0a0 Log stderr when hg command fails to ease troubleshooting
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 577
diff changeset
48 @NotNull Set<String> privateData,
a37960e1f0a0 Log stderr when hg command fails to ease troubleshooting
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 577
diff changeset
49 @NotNull CommandSettings settings) {
367
061e5f3a6bad Make plugin compatible with mercurial 2.1
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 349
diff changeset
50 myLogger = logger;
349
e0464f11206c TW-19698 Handle unrelated repositories
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 346
diff changeset
51 myCommand = command;
346
e8f0eb6d4ca4 Introduce CommandResult that filters out private data from ExecResult
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
52 myDelegate = execResult;
e8f0eb6d4ca4 Introduce CommandResult that filters out private data from ExecResult
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
53 myPrivateData = privateData;
596
a37960e1f0a0 Log stderr when hg command fails to ease troubleshooting
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 577
diff changeset
54 mySettings = settings;
346
e8f0eb6d4ca4 Introduce CommandResult that filters out private data from ExecResult
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
55 }
e8f0eb6d4ca4 Introduce CommandResult that filters out private data from ExecResult
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
56
631
d28d52336ce5 Implement MergeSupport
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 627
diff changeset
57 public int getExitCode() {
d28d52336ce5 Implement MergeSupport
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 627
diff changeset
58 return myDelegate.getExitCode();
d28d52336ce5 Implement MergeSupport
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 627
diff changeset
59 }
d28d52336ce5 Implement MergeSupport
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 627
diff changeset
60
346
e8f0eb6d4ca4 Introduce CommandResult that filters out private data from ExecResult
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
61 @NotNull
e8f0eb6d4ca4 Introduce CommandResult that filters out private data from ExecResult
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
62 public String getStdout() {
e8f0eb6d4ca4 Introduce CommandResult that filters out private data from ExecResult
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
63 return removePrivateData(myDelegate.getStdout(), myPrivateData);
e8f0eb6d4ca4 Introduce CommandResult that filters out private data from ExecResult
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
64 }
e8f0eb6d4ca4 Introduce CommandResult that filters out private data from ExecResult
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
65
367
061e5f3a6bad Make plugin compatible with mercurial 2.1
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 349
diff changeset
66 public void checkCommandFailed() throws VcsException {
061e5f3a6bad Make plugin compatible with mercurial 2.1
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 349
diff changeset
67 checkFailure(false);
061e5f3a6bad Make plugin compatible with mercurial 2.1
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 349
diff changeset
68 }
061e5f3a6bad Make plugin compatible with mercurial 2.1
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 349
diff changeset
69
061e5f3a6bad Make plugin compatible with mercurial 2.1
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 349
diff changeset
70 public void checkFailure(boolean failWhenStderrIsNonEmpty) throws VcsException {
061e5f3a6bad Make plugin compatible with mercurial 2.1
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 349
diff changeset
71 rethrowDetectedError();
061e5f3a6bad Make plugin compatible with mercurial 2.1
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 349
diff changeset
72 if (isFailure())
061e5f3a6bad Make plugin compatible with mercurial 2.1
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 349
diff changeset
73 logAndThrowError();
061e5f3a6bad Make plugin compatible with mercurial 2.1
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 349
diff changeset
74 String stderr = getStderr();
061e5f3a6bad Make plugin compatible with mercurial 2.1
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 349
diff changeset
75 if (!isEmpty(stderr)) {
061e5f3a6bad Make plugin compatible with mercurial 2.1
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 349
diff changeset
76 if (failWhenStderrIsNonEmpty)
061e5f3a6bad Make plugin compatible with mercurial 2.1
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 349
diff changeset
77 logAndThrowError();
061e5f3a6bad Make plugin compatible with mercurial 2.1
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 349
diff changeset
78 else
061e5f3a6bad Make plugin compatible with mercurial 2.1
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 349
diff changeset
79 logStderr(stderr);
061e5f3a6bad Make plugin compatible with mercurial 2.1
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 349
diff changeset
80 }
061e5f3a6bad Make plugin compatible with mercurial 2.1
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 349
diff changeset
81 }
061e5f3a6bad Make plugin compatible with mercurial 2.1
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 349
diff changeset
82
061e5f3a6bad Make plugin compatible with mercurial 2.1
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 349
diff changeset
83 private void logAndThrowError() throws VcsException {
061e5f3a6bad Make plugin compatible with mercurial 2.1
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 349
diff changeset
84 String message = createCommandLogMessage();
061e5f3a6bad Make plugin compatible with mercurial 2.1
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 349
diff changeset
85 myLogger.warn(message);
061e5f3a6bad Make plugin compatible with mercurial 2.1
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 349
diff changeset
86 if (hasImportantException())
061e5f3a6bad Make plugin compatible with mercurial 2.1
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 349
diff changeset
87 myLogger.error("Error during executing '" + getCommand() + "'", getException());
596
a37960e1f0a0 Log stderr when hg command fails to ease troubleshooting
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 577
diff changeset
88 throwVcsException(getExceptionMessage());
430
3600b68a4c0c TW-21403 better error message when hg not found
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 423
diff changeset
89 }
3600b68a4c0c TW-21403 better error message when hg not found
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 423
diff changeset
90
3600b68a4c0c TW-21403 better error message when hg not found
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 423
diff changeset
91 private void throwVcsException(@NotNull String message) throws VcsException {
3600b68a4c0c TW-21403 better error message when hg not found
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 423
diff changeset
92 //noinspection ThrowableResultOfMethodCallIgnored
3600b68a4c0c TW-21403 better error message when hg not found
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 423
diff changeset
93 Throwable e = getException();
3600b68a4c0c TW-21403 better error message when hg not found
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 423
diff changeset
94 if (isMercurialNotFoundException(e)) {
3600b68a4c0c TW-21403 better error message when hg not found
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 423
diff changeset
95 assert e != null;
3600b68a4c0c TW-21403 better error message when hg not found
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 423
diff changeset
96 throw new MercurialNotFoundException(myCommand, e);
3600b68a4c0c TW-21403 better error message when hg not found
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 423
diff changeset
97 }
367
061e5f3a6bad Make plugin compatible with mercurial 2.1
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 349
diff changeset
98 throw new VcsException(message);
061e5f3a6bad Make plugin compatible with mercurial 2.1
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 349
diff changeset
99 }
061e5f3a6bad Make plugin compatible with mercurial 2.1
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 349
diff changeset
100
430
3600b68a4c0c TW-21403 better error message when hg not found
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 423
diff changeset
101 private boolean isMercurialNotFoundException(@Nullable Throwable e) {
3600b68a4c0c TW-21403 better error message when hg not found
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 423
diff changeset
102 return e instanceof ProcessNotCreatedException &&
3600b68a4c0c TW-21403 better error message when hg not found
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 423
diff changeset
103 e.getCause() instanceof IOException &&
431
9a2b6a7a3381 Better detection of the case when mercurial not found
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 430
diff changeset
104 isMercurialNotFoundErrorMessage(e.getMessage());
9a2b6a7a3381 Better detection of the case when mercurial not found
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 430
diff changeset
105 }
9a2b6a7a3381 Better detection of the case when mercurial not found
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 430
diff changeset
106
9a2b6a7a3381 Better detection of the case when mercurial not found
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 430
diff changeset
107 private boolean isMercurialNotFoundErrorMessage(@Nullable String message) {
9a2b6a7a3381 Better detection of the case when mercurial not found
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 430
diff changeset
108 return message != null &&
505
aa67433a0c05 Detect yet another error from OS when hg executable not found
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 431
diff changeset
109 (message.startsWith(MERCURIAL_NOT_FOUND_MESSAGE_PREFIX) &&
aa67433a0c05 Detect yet another error from OS when hg executable not found
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 431
diff changeset
110 (message.endsWith(MERCURIAL_NOT_FOUND_MESSAGE_SUFFIX1) ||
aa67433a0c05 Detect yet another error from OS when hg executable not found
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 431
diff changeset
111 message.endsWith(MERCURIAL_NOT_FOUND_MESSAGE_SUFFIX2)) ||
aa67433a0c05 Detect yet another error from OS when hg executable not found
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 431
diff changeset
112 message.startsWith("CreateProcess") && message.endsWith("error=2"));
430
3600b68a4c0c TW-21403 better error message when hg not found
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 423
diff changeset
113 }
3600b68a4c0c TW-21403 better error message when hg not found
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 423
diff changeset
114
367
061e5f3a6bad Make plugin compatible with mercurial 2.1
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 349
diff changeset
115 private void logStderr(String stderr) {
061e5f3a6bad Make plugin compatible with mercurial 2.1
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 349
diff changeset
116 myLogger.warn("Error output produced by: " + getCommand());
061e5f3a6bad Make plugin compatible with mercurial 2.1
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 349
diff changeset
117 myLogger.warn(stderr);
061e5f3a6bad Make plugin compatible with mercurial 2.1
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 349
diff changeset
118 }
061e5f3a6bad Make plugin compatible with mercurial 2.1
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 349
diff changeset
119
346
e8f0eb6d4ca4 Introduce CommandResult that filters out private data from ExecResult
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
120 @NotNull
367
061e5f3a6bad Make plugin compatible with mercurial 2.1
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 349
diff changeset
121 private String getStderr() {
346
e8f0eb6d4ca4 Introduce CommandResult that filters out private data from ExecResult
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
122 return removePrivateData(myDelegate.getStderr(), myPrivateData);
e8f0eb6d4ca4 Introduce CommandResult that filters out private data from ExecResult
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
123 }
e8f0eb6d4ca4 Introduce CommandResult that filters out private data from ExecResult
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
124
e8f0eb6d4ca4 Introduce CommandResult that filters out private data from ExecResult
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
125 @Nullable
367
061e5f3a6bad Make plugin compatible with mercurial 2.1
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 349
diff changeset
126 private Throwable getException() {
346
e8f0eb6d4ca4 Introduce CommandResult that filters out private data from ExecResult
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
127 return myDelegate.getException();
e8f0eb6d4ca4 Introduce CommandResult that filters out private data from ExecResult
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
128 }
e8f0eb6d4ca4 Introduce CommandResult that filters out private data from ExecResult
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
129
367
061e5f3a6bad Make plugin compatible with mercurial 2.1
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 349
diff changeset
130 private boolean isFailure() {
430
3600b68a4c0c TW-21403 better error message when hg not found
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 423
diff changeset
131 //noinspection ThrowableResultOfMethodCallIgnored
386
00d13c910f5d Some non-zero exit codes mean error
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 381
diff changeset
132 return getException() != null || isErrorExitCode();
00d13c910f5d Some non-zero exit codes mean error
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 381
diff changeset
133 }
00d13c910f5d Some non-zero exit codes mean error
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 381
diff changeset
134
00d13c910f5d Some non-zero exit codes mean error
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 381
diff changeset
135 private boolean isErrorExitCode() {
00d13c910f5d Some non-zero exit codes mean error
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 381
diff changeset
136 int exitCode = myDelegate.getExitCode();
387
88480a85f888 Some exit codes mean errors
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 386
diff changeset
137 return ERROR_EXIT_CODES.contains(exitCode);
367
061e5f3a6bad Make plugin compatible with mercurial 2.1
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 349
diff changeset
138 }
061e5f3a6bad Make plugin compatible with mercurial 2.1
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 349
diff changeset
139
061e5f3a6bad Make plugin compatible with mercurial 2.1
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 349
diff changeset
140 private boolean shouldDetectErrors() {
061e5f3a6bad Make plugin compatible with mercurial 2.1
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 349
diff changeset
141 return isFailure() || myDelegate.getExitCode() != 0;
346
e8f0eb6d4ca4 Introduce CommandResult that filters out private data from ExecResult
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
142 }
349
e0464f11206c TW-19698 Handle unrelated repositories
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 346
diff changeset
143
e0464f11206c TW-19698 Handle unrelated repositories
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 346
diff changeset
144 @NotNull
367
061e5f3a6bad Make plugin compatible with mercurial 2.1
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 349
diff changeset
145 private String getCommand() {
061e5f3a6bad Make plugin compatible with mercurial 2.1
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 349
diff changeset
146 return removePrivateData(myCommand, myPrivateData);
349
e0464f11206c TW-19698 Handle unrelated repositories
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 346
diff changeset
147 }
e0464f11206c TW-19698 Handle unrelated repositories
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 346
diff changeset
148
367
061e5f3a6bad Make plugin compatible with mercurial 2.1
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 349
diff changeset
149 private boolean hasImportantException() {
430
3600b68a4c0c TW-21403 better error message when hg not found
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 423
diff changeset
150 //noinspection ThrowableResultOfMethodCallIgnored
349
e0464f11206c TW-19698 Handle unrelated repositories
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 346
diff changeset
151 Throwable exception = getException();
e0464f11206c TW-19698 Handle unrelated repositories
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 346
diff changeset
152 return exception instanceof NullPointerException;
e0464f11206c TW-19698 Handle unrelated repositories
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 346
diff changeset
153 }
e0464f11206c TW-19698 Handle unrelated repositories
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 346
diff changeset
154
367
061e5f3a6bad Make plugin compatible with mercurial 2.1
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 349
diff changeset
155 private String createCommandLogMessage() {
596
a37960e1f0a0 Log stderr when hg command fails to ease troubleshooting
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 577
diff changeset
156 StringBuilder message = new StringBuilder();
a37960e1f0a0 Log stderr when hg command fails to ease troubleshooting
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 577
diff changeset
157 message.append("'").append(getCommand()).append("' command failed.");
a37960e1f0a0 Log stderr when hg command fails to ease troubleshooting
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 577
diff changeset
158 String stderr = getStderr();
a37960e1f0a0 Log stderr when hg command fails to ease troubleshooting
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 577
diff changeset
159 if (!isEmpty(stderr)) {
a37960e1f0a0 Log stderr when hg command fails to ease troubleshooting
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 577
diff changeset
160 int logOutputLimit = mySettings.getLogOutputLimit();
a37960e1f0a0 Log stderr when hg command fails to ease troubleshooting
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 577
diff changeset
161 if (logOutputLimit == -1) {
a37960e1f0a0 Log stderr when hg command fails to ease troubleshooting
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 577
diff changeset
162 message.append("\nstderr:\n").append(stderr);
a37960e1f0a0 Log stderr when hg command fails to ease troubleshooting
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 577
diff changeset
163 } else {
a37960e1f0a0 Log stderr when hg command fails to ease troubleshooting
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 577
diff changeset
164 message.append(StringUtil.truncateStringValueWithDotsAtEnd(stderr, logOutputLimit));
a37960e1f0a0 Log stderr when hg command fails to ease troubleshooting
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 577
diff changeset
165 }
a37960e1f0a0 Log stderr when hg command fails to ease troubleshooting
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 577
diff changeset
166 }
a37960e1f0a0 Log stderr when hg command fails to ease troubleshooting
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 577
diff changeset
167 return message.toString();
367
061e5f3a6bad Make plugin compatible with mercurial 2.1
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 349
diff changeset
168 }
061e5f3a6bad Make plugin compatible with mercurial 2.1
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 349
diff changeset
169
061e5f3a6bad Make plugin compatible with mercurial 2.1
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 349
diff changeset
170 private String getExceptionMessage() {
596
a37960e1f0a0 Log stderr when hg command fails to ease troubleshooting
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 577
diff changeset
171 StringBuilder message = new StringBuilder();
a37960e1f0a0 Log stderr when hg command fails to ease troubleshooting
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 577
diff changeset
172 message.append("'").append(getCommand()).append("' command failed.");
679
1da36037196d TW-30905 include stderr into VcsException messages, so it is shown in a build log
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 643
diff changeset
173 String stderr = getStderr();
1da36037196d TW-30905 include stderr into VcsException messages, so it is shown in a build log
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 643
diff changeset
174 if (!isEmpty(stderr)) {
1da36037196d TW-30905 include stderr into VcsException messages, so it is shown in a build log
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 643
diff changeset
175 message.append("\n");
1da36037196d TW-30905 include stderr into VcsException messages, so it is shown in a build log
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 643
diff changeset
176 int limit = mySettings.getExceptionOutputLimit();
1da36037196d TW-30905 include stderr into VcsException messages, so it is shown in a build log
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 643
diff changeset
177 if (stderr.length() < limit || limit == -1) {
1da36037196d TW-30905 include stderr into VcsException messages, so it is shown in a build log
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 643
diff changeset
178 message.append("stderr: ").append(stderr);
1da36037196d TW-30905 include stderr into VcsException messages, so it is shown in a build log
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 643
diff changeset
179 } else {
1da36037196d TW-30905 include stderr into VcsException messages, so it is shown in a build log
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 643
diff changeset
180 if (limit > 4)
1da36037196d TW-30905 include stderr into VcsException messages, so it is shown in a build log
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 643
diff changeset
181 message.append("stderr: ").append(StringUtil.truncateStringValueWithDotsAtEnd(stderr, limit));
1da36037196d TW-30905 include stderr into VcsException messages, so it is shown in a build log
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 643
diff changeset
182 message.append("\nSee details in teamcity-vcs.log");
1da36037196d TW-30905 include stderr into VcsException messages, so it is shown in a build log
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 643
diff changeset
183 }
1da36037196d TW-30905 include stderr into VcsException messages, so it is shown in a build log
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 643
diff changeset
184 }
596
a37960e1f0a0 Log stderr when hg command fails to ease troubleshooting
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 577
diff changeset
185 return message.toString();
349
e0464f11206c TW-19698 Handle unrelated repositories
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 346
diff changeset
186 }
e0464f11206c TW-19698 Handle unrelated repositories
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 346
diff changeset
187
367
061e5f3a6bad Make plugin compatible with mercurial 2.1
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 349
diff changeset
188 private void rethrowDetectedError() throws VcsException {
061e5f3a6bad Make plugin compatible with mercurial 2.1
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 349
diff changeset
189 if (!shouldDetectErrors())
349
e0464f11206c TW-19698 Handle unrelated repositories
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 346
diff changeset
190 return;
367
061e5f3a6bad Make plugin compatible with mercurial 2.1
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 349
diff changeset
191 String stderr = getStderr().trim();
349
e0464f11206c TW-19698 Handle unrelated repositories
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 346
diff changeset
192 checkUnrelatedRepository(stderr);
e0464f11206c TW-19698 Handle unrelated repositories
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 346
diff changeset
193 checkUnknownRevision(stderr);
367
061e5f3a6bad Make plugin compatible with mercurial 2.1
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 349
diff changeset
194 checkFileNotUnderTheRoot(stderr);
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 387
diff changeset
195 checkConnectionRefused(stderr);
627
eadc7e5c2236 TW-28975, TW-30345 re-clone repository in case of "abandoned transaction" error
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 596
diff changeset
196 checkAbandonedTransaction(stderr);
643
2f6c4b61686a Don't throw errors for merge into same branch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 631
diff changeset
197 checkMergeWithWorkDirAncestor(stderr);
349
e0464f11206c TW-19698 Handle unrelated repositories
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 346
diff changeset
198 }
e0464f11206c TW-19698 Handle unrelated repositories
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 346
diff changeset
199
e0464f11206c TW-19698 Handle unrelated repositories
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 346
diff changeset
200 private void checkUnrelatedRepository(@NotNull final String stderr) throws UnrelatedRepositoryException {
e0464f11206c TW-19698 Handle unrelated repositories
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 346
diff changeset
201 if (stderr.contains("abort: repository is unrelated"))
e0464f11206c TW-19698 Handle unrelated repositories
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 346
diff changeset
202 throw new UnrelatedRepositoryException();
e0464f11206c TW-19698 Handle unrelated repositories
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 346
diff changeset
203 }
e0464f11206c TW-19698 Handle unrelated repositories
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 346
diff changeset
204
e0464f11206c TW-19698 Handle unrelated repositories
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 346
diff changeset
205 private void checkUnknownRevision(@NotNull final String stderr) throws UnknownRevisionException {
e0464f11206c TW-19698 Handle unrelated repositories
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 346
diff changeset
206 final String message = "abort: unknown revision '";
e0464f11206c TW-19698 Handle unrelated repositories
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 346
diff changeset
207 int idx = stderr.indexOf(message);
e0464f11206c TW-19698 Handle unrelated repositories
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 346
diff changeset
208 if (idx != -1) {
e0464f11206c TW-19698 Handle unrelated repositories
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 346
diff changeset
209 int startIdx = idx + message.length();
e0464f11206c TW-19698 Handle unrelated repositories
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 346
diff changeset
210 int endIdx = stderr.indexOf("'", startIdx);
e0464f11206c TW-19698 Handle unrelated repositories
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 346
diff changeset
211 String revision = stderr.substring(startIdx, endIdx);
e0464f11206c TW-19698 Handle unrelated repositories
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 346
diff changeset
212 throw new UnknownRevisionException(revision);
e0464f11206c TW-19698 Handle unrelated repositories
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 346
diff changeset
213 }
e0464f11206c TW-19698 Handle unrelated repositories
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 346
diff changeset
214 }
e0464f11206c TW-19698 Handle unrelated repositories
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 346
diff changeset
215
367
061e5f3a6bad Make plugin compatible with mercurial 2.1
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 349
diff changeset
216 private void checkFileNotUnderTheRoot(@NotNull final String stderr) throws VcsException {
061e5f3a6bad Make plugin compatible with mercurial 2.1
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 349
diff changeset
217 final String prefix = "abort: ";
061e5f3a6bad Make plugin compatible with mercurial 2.1
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 349
diff changeset
218 int idx = stderr.indexOf("abort: ");
061e5f3a6bad Make plugin compatible with mercurial 2.1
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 349
diff changeset
219 if (idx != -1) {
061e5f3a6bad Make plugin compatible with mercurial 2.1
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 349
diff changeset
220 int startIdx = idx + prefix.length();
061e5f3a6bad Make plugin compatible with mercurial 2.1
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 349
diff changeset
221 int endIdx = stderr.indexOf(" not under root");
061e5f3a6bad Make plugin compatible with mercurial 2.1
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 349
diff changeset
222 if (endIdx != -1) {
061e5f3a6bad Make plugin compatible with mercurial 2.1
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 349
diff changeset
223 String path = stderr.substring(startIdx, endIdx);
061e5f3a6bad Make plugin compatible with mercurial 2.1
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 349
diff changeset
224 throw new UnknownFileException(path);
061e5f3a6bad Make plugin compatible with mercurial 2.1
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 349
diff changeset
225 }
061e5f3a6bad Make plugin compatible with mercurial 2.1
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 349
diff changeset
226 }
346
e8f0eb6d4ca4 Introduce CommandResult that filters out private data from ExecResult
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
227 }
387
88480a85f888 Some exit codes mean errors
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 386
diff changeset
228
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 387
diff changeset
229 private void checkConnectionRefused(@NotNull final String stderr) throws ConnectionRefusedException {
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 387
diff changeset
230 if (stderr.equals("abort: error: Connection refused"))
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 387
diff changeset
231 throw new ConnectionRefusedException();
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 387
diff changeset
232 }
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 387
diff changeset
233
627
eadc7e5c2236 TW-28975, TW-30345 re-clone repository in case of "abandoned transaction" error
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 596
diff changeset
234 private void checkAbandonedTransaction(@NotNull final String stderr) throws AbandonedTransactionFound {
eadc7e5c2236 TW-28975, TW-30345 re-clone repository in case of "abandoned transaction" error
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 596
diff changeset
235 if (stderr.contains("abort: abandoned transaction found - run hg recover"))
eadc7e5c2236 TW-28975, TW-30345 re-clone repository in case of "abandoned transaction" error
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 596
diff changeset
236 throw new AbandonedTransactionFound();
eadc7e5c2236 TW-28975, TW-30345 re-clone repository in case of "abandoned transaction" error
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 596
diff changeset
237 }
eadc7e5c2236 TW-28975, TW-30345 re-clone repository in case of "abandoned transaction" error
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 596
diff changeset
238
643
2f6c4b61686a Don't throw errors for merge into same branch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 631
diff changeset
239 private void checkMergeWithWorkDirAncestor(@NotNull final String stderr) throws MergeWithWorkingDirAncestor {
2f6c4b61686a Don't throw errors for merge into same branch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 631
diff changeset
240 if (stderr.equals("abort: merging with a working directory ancestor has no effect"))
2f6c4b61686a Don't throw errors for merge into same branch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 631
diff changeset
241 throw new MergeWithWorkingDirAncestor();
2f6c4b61686a Don't throw errors for merge into same branch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 631
diff changeset
242 }
2f6c4b61686a Don't throw errors for merge into same branch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 631
diff changeset
243
387
88480a85f888 Some exit codes mean errors
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 386
diff changeset
244 private static Set<Integer> setOf(Integer... ints) {
88480a85f888 Some exit codes mean errors
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 386
diff changeset
245 return new HashSet<Integer>(asList(ints));
88480a85f888 Some exit codes mean errors
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 386
diff changeset
246 }
346
e8f0eb6d4ca4 Introduce CommandResult that filters out private data from ExecResult
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
247 }