changeset 386:00d13c910f5d remote-run/exit-code

Some non-zero exit codes mean error
author Dmitry Neverov <dmitry.neverov@jetbrains.com>
date Thu, 16 Feb 2012 18:20:28 +0400
parents 62f273711a49
children 88480a85f888
files mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/CommandResult.java mercurial-tests/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/CommandResultTest.java
diffstat 2 files changed, 27 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/CommandResult.java	Wed Feb 15 18:18:11 2012 +0400
+++ b/mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/CommandResult.java	Thu Feb 16 18:20:28 2012 +0400
@@ -82,11 +82,16 @@
   }
 
   private boolean isFailure() {
-    //A non-zero exit code is not an error:
+    return getException() != null || isErrorExitCode();
+  }
+
+  private boolean isErrorExitCode() {
+    //A non-zero exit code is not always an error:
     //http://mercurial.selenic.com/bts/issue186
     //http://mercurial.selenic.com/bts/issue2189
     //E.g. pull command in hg 2.1 exits with 1 if no new changes were pulled
-    return getException() != null;
+    int exitCode = myDelegate.getExitCode();
+    return exitCode == -1 || exitCode == 255;
   }
 
   private boolean shouldDetectErrors() {
--- a/mercurial-tests/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/CommandResultTest.java	Wed Feb 15 18:18:11 2012 +0400
+++ b/mercurial-tests/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/CommandResultTest.java	Thu Feb 16 18:20:28 2012 +0400
@@ -8,6 +8,7 @@
 import org.jetbrains.annotations.NonNls;
 import org.jetbrains.annotations.NotNull;
 import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.DataProvider;
 import org.testng.annotations.Test;
 
 import java.io.ByteArrayInputStream;
@@ -38,6 +39,25 @@
     myLogger.assertLogMessagesDontContain(password);
   }
 
+  @DataProvider(name = "exitCodesForErrors")
+  public static Object[][] exitCodesForErrors() {
+    return new Object[][] {
+            new Object[] { -1 },
+            new Object[] { 255}};
+  }
+
+  @Test(expectedExceptions = VcsException.class,
+        dataProvider = "exitCodesForErrors")
+  public void should_detect_error_when_for_exit_code(int exitCode) throws VcsException {
+    CommandResult commandResult = commandResultFor(execResult().withExitCode(exitCode));
+    commandResult.checkCommandFailed();
+  }
+
+  public void exit_code_of_one_is_not_an_error() throws VcsException {
+    CommandResult commandResult = commandResultFor(execResult().withStdout("pull: no new changes").withExitCode(1));
+    commandResult.checkCommandFailed();
+  }
+
   @Test(expectedExceptions = UnrelatedRepositoryException.class)
   public void should_detect_unrelated_repository_error() throws VcsException {
     String unrelatedRepositoryStderr = "abort: repository is unrelated\n";
@@ -64,11 +84,6 @@
     commandResult.checkCommandFailed();
   }
 
-  public void should_detect_failure_with_non_zero_exit_code() throws VcsException {
-    CommandResult commandResult = commandResultFor(execResult().withExitCode(1));
-    commandResult.checkCommandFailed();
-  }
-
 
   ExecResultBuilder execResult() {
     return new ExecResultBuilder();