changeset 682:98887e2c7582 Gaya-8.0.x

TW-30905 include stderr into VcsException messages, so it is shown in a build log
author Dmitry Neverov <dmitry.neverov@jetbrains.com>
date Tue, 26 Nov 2013 15:35:11 +0400
parents 03a544f9eae1
children
files mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/CommandResult.java mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/CommandSettings.java mercurial-tests/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/CommandResultTest.java
diffstat 3 files changed, 38 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/CommandResult.java	Fri Nov 29 15:24:36 2013 +0400
+++ b/mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/CommandResult.java	Tue Nov 26 15:35:11 2013 +0400
@@ -166,6 +166,18 @@
   private String getExceptionMessage() {
     StringBuilder message = new StringBuilder();
     message.append("'").append(getCommand()).append("' command failed.");
+    String stderr = getStderr();
+    if (!isEmpty(stderr)) {
+      message.append("\n");
+      int limit = mySettings.getExceptionOutputLimit();
+      if (stderr.length() < limit || limit == -1) {
+        message.append("stderr: ").append(stderr);
+      } else {
+        if (limit > 4)
+          message.append("stderr: ").append(StringUtil.truncateStringValueWithDotsAtEnd(stderr, limit));
+        message.append("\nSee details in teamcity-vcs.log");
+      }
+    }
     return message.toString();
   }
 
--- a/mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/CommandSettings.java	Fri Nov 29 15:24:36 2013 +0400
+++ b/mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/CommandSettings.java	Tue Nov 26 15:35:11 2013 +0400
@@ -19,6 +19,7 @@
   private String myLogLevel = "debug";
   private Map<String, String> myHgEnv = new HashMap<String, String>();
   private int myLogOutputLimit = -1;
+  private int myExceptionOutputLimit = 5000;
 
   public CommandSettings() {
 
@@ -99,4 +100,12 @@
     myLogOutputLimit = logOutputLimit;
     return this;
   }
+
+  public int getExceptionOutputLimit() {
+    return myExceptionOutputLimit;
+  }
+
+  public void setExceptionOutputLimit(int limit) {
+    myExceptionOutputLimit = limit;
+  }
 }
--- a/mercurial-tests/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/CommandResultTest.java	Fri Nov 29 15:24:36 2013 +0400
+++ b/mercurial-tests/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/CommandResultTest.java	Tue Nov 26 15:35:11 2013 +0400
@@ -101,13 +101,25 @@
   public void exception_should_not_contain_command_stdout_or_stderr() {
     final String stdout = "300Mb of output";
     final String stderr = "300Mb from stderr";
-    CommandResult cr = commandResultFor(execResult().withStdout(stdout).withStderr(stderr));
+    CommandSettings settings = new CommandSettings();
+    settings.setExceptionOutputLimit(0);
+    CommandResult cr = commandResultFor(execResult().withStdout(stdout).withStderr(stderr), settings);
     try {
       cr.checkCommandFailed();
     } catch (VcsException e) {
       assertThat(e.getMessage(), not(containsString(stdout)));
       assertThat(e.getMessage(), not(containsString(stderr)));
     }
+
+    settings = new CommandSettings();
+    settings.setExceptionOutputLimit(14);
+    cr = commandResultFor(execResult().withStdout(stdout).withStderr(stderr), settings);
+    try {
+      cr.checkCommandFailed();
+    } catch (VcsException e) {
+      assertThat(e.getMessage(), containsString("300Mb from..."));
+      assertThat(e.getMessage(), containsString("See details in teamcity-vcs.log"));
+    }
   }
 
   public void when_command_fails_stderr_should_be_logged() {
@@ -128,6 +140,10 @@
     return new CommandResult(myLogger, "", builder.build(), new HashSet<String>(Arrays.asList(privateData)), new CommandSettings());
   }
 
+  CommandResult commandResultFor(ExecResultBuilder builder, CommandSettings settings) {
+    return new CommandResult(myLogger, "", builder.build(), new HashSet<String>(), settings);
+  }
+
   private class ExecResultBuilder {
     private String myStdout = "";
     private String myStderr = "";