IDEA-68767 ProcessHandler.waitFor() return false in the case of exception.
authorKirill Likhodedov <kirill.likhodedov@jetbrains.com>
Thu, 5 May 2011 11:51:09 +0000 (15:51 +0400)
committerKirill Likhodedov <kirill.likhodedov@jetbrains.com>
Thu, 5 May 2011 11:54:20 +0000 (15:54 +0400)
CapturingProcessHandler.runProcess() doesn't check exit value in that case.

platform/platform-api/src/com/intellij/execution/process/CapturingProcessHandler.java
platform/platform-api/src/com/intellij/execution/process/ProcessHandler.java

index 5567d5681f24493262304150c8b33ff39bf5fc64..d6c19c72cec001e1dafef6eaa272e8b9f36142eb 100644 (file)
@@ -15,6 +15,7 @@
  */
 package com.intellij.execution.process;
 
+import com.intellij.openapi.diagnostic.Logger;
 import com.intellij.openapi.util.Key;
 
 import java.nio.charset.Charset;
@@ -25,6 +26,7 @@ import java.nio.charset.Charset;
  * @author yole
  */
 public class CapturingProcessHandler extends OSProcessHandler {
+  private static final Logger LOG = Logger.getInstance(CapturingProcessHandler.class);
   private final Charset myCharset;
   private final ProcessOutput myOutput = new ProcessOutput();
 
@@ -54,8 +56,11 @@ public class CapturingProcessHandler extends OSProcessHandler {
 
   public ProcessOutput runProcess() {
     startNotify();
-    waitFor();
-    myOutput.setExitCode(getProcess().exitValue());
+    if (waitFor()) {
+      myOutput.setExitCode(getProcess().exitValue());
+    } else {
+      LOG.info("runProcess: exit value unavailable");
+    }
     return myOutput;
   }
 
index d1976a2804bdefb19f11f8c2763b24ac3bdb7749..f4d0d81be0c24a7ba199aa19254f8418c7aba6c0 100644 (file)
@@ -74,12 +74,17 @@ public abstract class ProcessHandler extends UserDataHolderBase {
 
   public abstract boolean detachIsDefault();
 
-  public void waitFor() {
+  /**
+   * Wait for process execution.
+   * @return true if target process has actually ended; false if we stopped watching the process execution and don't know if it has completed.
+   */
+  public boolean waitFor() {
     try {
       myWaitSemaphore.waitFor();
+      return true;
     }
     catch (ProcessCanceledException e) {
-      // Ignore
+      return false;
     }
   }