annotate mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/CommandUtil.java @ 596:a37960e1f0a0

Log stderr when hg command fails to ease troubleshooting
author Dmitry Neverov <dmitry.neverov@jetbrains.com>
date Mon, 29 Apr 2013 14:23:20 +0400
parents fa40f53ec019
children 31a1aca3305c
rev   line source
266
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 200
diff changeset
1 /*
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 200
diff changeset
2 * Copyright 2000-2011 JetBrains s.r.o.
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 200
diff changeset
3 *
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 200
diff changeset
4 * Licensed under the Apache License, Version 2.0 (the "License");
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 200
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: 200
diff changeset
6 * You may obtain a copy of the License at
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 200
diff changeset
7 *
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 200
diff changeset
8 * http://www.apache.org/licenses/LICENSE-2.0
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 200
diff changeset
9 *
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 200
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: 200
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: 200
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: 200
diff changeset
13 * See the License for the specific language governing permissions and
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 200
diff changeset
14 * limitations under the License.
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 200
diff changeset
15 */
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 200
diff changeset
16 package jetbrains.buildServer.buildTriggers.vcs.mercurial.command;
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 200
diff changeset
17
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 200
diff changeset
18 import jetbrains.buildServer.ExecResult;
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 200
diff changeset
19 import jetbrains.buildServer.SimpleCommandLineProcessRunner;
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 200
diff changeset
20 import jetbrains.buildServer.log.Loggers;
580
fa40f53ec019 fix String index out of range
Pavel.Sher
parents: 578
diff changeset
21 import jetbrains.buildServer.util.StringUtil;
266
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 200
diff changeset
22 import jetbrains.buildServer.vcs.VcsException;
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 200
diff changeset
23 import org.jetbrains.annotations.NotNull;
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 200
diff changeset
24
480
efba721f9a1d TW-23382 agent logs with info, server logs with debug
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 367
diff changeset
25 import java.io.File;
266
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 200
diff changeset
26 import java.util.Set;
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 200
diff changeset
27
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 200
diff changeset
28 public class CommandUtil {
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 200
diff changeset
29
480
efba721f9a1d TW-23382 agent logs with info, server logs with debug
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 367
diff changeset
30 public static CommandResult runCommand(@NotNull MercurialCommandLine cli, @NotNull CommandSettings settings) throws VcsException {
efba721f9a1d TW-23382 agent logs with info, server logs with debug
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 367
diff changeset
31 final String command = removePrivateData(cli.getCommandLineString(), settings.getPrivateData());
efba721f9a1d TW-23382 agent logs with info, server logs with debug
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 367
diff changeset
32 logRunCommand(cli, command, settings);
596
a37960e1f0a0 Log stderr when hg command fails to ease troubleshooting
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 580
diff changeset
33 CommandResult res = run(cli, settings.getTimeout(), command, settings.getPrivateData(), settings);
480
efba721f9a1d TW-23382 agent logs with info, server logs with debug
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 367
diff changeset
34 if (settings.isCheckForFailure() || settings.isFailWithNonEmptyStderr())
efba721f9a1d TW-23382 agent logs with info, server logs with debug
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 367
diff changeset
35 res.checkFailure(settings.isFailWithNonEmptyStderr());
578
40c085517770 Truncate command output in the logs
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 558
diff changeset
36 logCommandOutput(command, res, settings);
347
4a49a0baf30b Merge branch Eluru-6.5.x
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 339 346
diff changeset
37 return res;
4a49a0baf30b Merge branch Eluru-6.5.x
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 339 346
diff changeset
38 }
4a49a0baf30b Merge branch Eluru-6.5.x
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 339 346
diff changeset
39
480
efba721f9a1d TW-23382 agent logs with info, server logs with debug
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 367
diff changeset
40 private static CommandResult run(@NotNull final MercurialCommandLine cli,
efba721f9a1d TW-23382 agent logs with info, server logs with debug
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 367
diff changeset
41 final int executionTimeout,
efba721f9a1d TW-23382 agent logs with info, server logs with debug
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 367
diff changeset
42 @NotNull final String command,
596
a37960e1f0a0 Log stderr when hg command fails to ease troubleshooting
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 580
diff changeset
43 @NotNull final Set<String> privateData,
a37960e1f0a0 Log stderr when hg command fails to ease troubleshooting
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 580
diff changeset
44 @NotNull CommandSettings settings) {
298
9b9fd71911eb Log the duration of executed command
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 297
diff changeset
45 final long start = System.currentTimeMillis();
489
493f78cb64dd Move MercurialBranchSupport to separate module
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
46 ExecResult res = SimpleCommandLineProcessRunner.runCommand(cli, null, new SimpleCommandLineProcessRunner.ProcessRunCallbackAdapter() {
266
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 200
diff changeset
47 @Override
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 200
diff changeset
48 public Integer getOutputIdleSecondsTimeout() {
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 200
diff changeset
49 return executionTimeout;
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 200
diff changeset
50 }
298
9b9fd71911eb Log the duration of executed command
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 297
diff changeset
51 @Override
9b9fd71911eb Log the duration of executed command
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 297
diff changeset
52 public void onProcessFinished(Process ps) {
9b9fd71911eb Log the duration of executed command
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 297
diff changeset
53 long duration = System.currentTimeMillis() - start;
367
061e5f3a6bad Make plugin compatible with mercurial 2.1
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 349
diff changeset
54 Loggers.VCS.debug("Command " + command + " took " + duration + "ms");
298
9b9fd71911eb Log the duration of executed command
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 297
diff changeset
55 }
266
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 200
diff changeset
56 });
596
a37960e1f0a0 Log stderr when hg command fails to ease troubleshooting
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 580
diff changeset
57 return new CommandResult(Loggers.VCS, command, res, privateData, settings);
266
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 200
diff changeset
58 }
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 200
diff changeset
59
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 200
diff changeset
60 public static String removePrivateData(final String str, final Set<String> privateData) {
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 200
diff changeset
61 String result = str;
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 200
diff changeset
62 for (String data: privateData) {
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 200
diff changeset
63 if (data == null || data.length() == 0) continue;
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 200
diff changeset
64 result = result.replace(data, "******");
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 200
diff changeset
65 }
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 200
diff changeset
66 return result;
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 200
diff changeset
67 }
480
efba721f9a1d TW-23382 agent logs with info, server logs with debug
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 367
diff changeset
68
efba721f9a1d TW-23382 agent logs with info, server logs with debug
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 367
diff changeset
69 private static void logRunCommand(@NotNull MercurialCommandLine cmd, @NotNull String command, @NotNull CommandSettings settings) {
efba721f9a1d TW-23382 agent logs with info, server logs with debug
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 367
diff changeset
70 String workingDir = cmd.getWorkingDirectory();
efba721f9a1d TW-23382 agent logs with info, server logs with debug
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 367
diff changeset
71 String dir = workingDir != null ? workingDir : new File(".").getAbsolutePath();
efba721f9a1d TW-23382 agent logs with info, server logs with debug
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 367
diff changeset
72 String message = "[" + dir + "] " + command;
efba721f9a1d TW-23382 agent logs with info, server logs with debug
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 367
diff changeset
73 if ("debug".equals(settings.getLogLevel())) {
efba721f9a1d TW-23382 agent logs with info, server logs with debug
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 367
diff changeset
74 Loggers.VCS.debug(message);
efba721f9a1d TW-23382 agent logs with info, server logs with debug
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 367
diff changeset
75 } else {
efba721f9a1d TW-23382 agent logs with info, server logs with debug
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 367
diff changeset
76 Loggers.VCS.info(message);
efba721f9a1d TW-23382 agent logs with info, server logs with debug
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 367
diff changeset
77 }
efba721f9a1d TW-23382 agent logs with info, server logs with debug
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 367
diff changeset
78 }
efba721f9a1d TW-23382 agent logs with info, server logs with debug
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 367
diff changeset
79
578
40c085517770 Truncate command output in the logs
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 558
diff changeset
80 private static void logCommandOutput(@NotNull String command, @NotNull CommandResult result, @NotNull CommandSettings settings) {
40c085517770 Truncate command output in the logs
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 558
diff changeset
81 int limit = settings.getLogOutputLimit();
40c085517770 Truncate command output in the logs
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 558
diff changeset
82 if (limit == -1) {
40c085517770 Truncate command output in the logs
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 558
diff changeset
83 Loggers.VCS.debug("Command " + command + " output:\n" + result.getStdout());
40c085517770 Truncate command output in the logs
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 558
diff changeset
84 } else {
580
fa40f53ec019 fix String index out of range
Pavel.Sher
parents: 578
diff changeset
85 Loggers.VCS.debug("Command " + command + " output:\n" + StringUtil.truncateStringValueWithDotsAtEnd(result.getStdout(), limit));
578
40c085517770 Truncate command output in the logs
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 558
diff changeset
86 }
480
efba721f9a1d TW-23382 agent logs with info, server logs with debug
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 367
diff changeset
87 }
266
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 200
diff changeset
88 }