# HG changeset patch # User Dmitry Neverov # Date 1385465711 -14400 # Node ID 98887e2c75823adcf4df0d5959903d480869af37 # Parent 03a544f9eae1e7be5fe475c631092593442d6062 TW-30905 include stderr into VcsException messages, so it is shown in a build log diff -r 03a544f9eae1 -r 98887e2c7582 mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/CommandResult.java --- 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(); } diff -r 03a544f9eae1 -r 98887e2c7582 mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/CommandSettings.java --- 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 myHgEnv = new HashMap(); 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; + } } diff -r 03a544f9eae1 -r 98887e2c7582 mercurial-tests/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/CommandResultTest.java --- 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(Arrays.asList(privateData)), new CommandSettings()); } + CommandResult commandResultFor(ExecResultBuilder builder, CommandSettings settings) { + return new CommandResult(myLogger, "", builder.build(), new HashSet(), settings); + } + private class ExecResultBuilder { private String myStdout = ""; private String myStderr = "";