Browse Source

Merge branch 'stable-4.9'

* stable-4.9:
  Fix IllegalThreadStateException if stderr closed without exiting

Change-Id: I8a6a6788c2bb000171233b88d9592ed0640ad15e
stable-4.10
Matthias Sohn 7 years ago
parent
commit
032750acbf
  1. 2
      org.eclipse.jgit/resources/org/eclipse/jgit/internal/JGitText.properties
  2. 2
      org.eclipse.jgit/src/org/eclipse/jgit/internal/JGitText.java
  3. 33
      org.eclipse.jgit/src/org/eclipse/jgit/util/FS.java

2
org.eclipse.jgit/resources/org/eclipse/jgit/internal/JGitText.properties

@ -122,6 +122,7 @@ classCastNotA=Not a {0}
cloneNonEmptyDirectory=Destination path "{0}" already exists and is not an empty directory cloneNonEmptyDirectory=Destination path "{0}" already exists and is not an empty directory
closed=closed closed=closed
collisionOn=Collision on {0} collisionOn=Collision on {0}
commandClosedStderrButDidntExit=Command {0} closed stderr stream but didn''t exit within timeout {1} seconds
commandRejectedByHook=Rejected by "{0}" hook.\n{1} commandRejectedByHook=Rejected by "{0}" hook.\n{1}
commandWasCalledInTheWrongState=Command {0} was called in the wrong state commandWasCalledInTheWrongState=Command {0} was called in the wrong state
commitAlreadyExists=exists {0} commitAlreadyExists=exists {0}
@ -648,6 +649,7 @@ tagAlreadyExists=tag ''{0}'' already exists
tagNameInvalid=tag name {0} is invalid tagNameInvalid=tag name {0} is invalid
tagOnRepoWithoutHEADCurrentlyNotSupported=Tag on repository without HEAD currently not supported tagOnRepoWithoutHEADCurrentlyNotSupported=Tag on repository without HEAD currently not supported
theFactoryMustNotBeNull=The factory must not be null theFactoryMustNotBeNull=The factory must not be null
threadInterruptedWhileRunning="Current thread interrupted while running {0}"
timeIsUncertain=Time is uncertain timeIsUncertain=Time is uncertain
timerAlreadyTerminated=Timer already terminated timerAlreadyTerminated=Timer already terminated
tooManyCommands=Too many commands tooManyCommands=Too many commands

2
org.eclipse.jgit/src/org/eclipse/jgit/internal/JGitText.java

@ -181,6 +181,7 @@ public class JGitText extends TranslationBundle {
/***/ public String cloneNonEmptyDirectory; /***/ public String cloneNonEmptyDirectory;
/***/ public String closed; /***/ public String closed;
/***/ public String collisionOn; /***/ public String collisionOn;
/***/ public String commandClosedStderrButDidntExit;
/***/ public String commandRejectedByHook; /***/ public String commandRejectedByHook;
/***/ public String commandWasCalledInTheWrongState; /***/ public String commandWasCalledInTheWrongState;
/***/ public String commitAlreadyExists; /***/ public String commitAlreadyExists;
@ -708,6 +709,7 @@ public class JGitText extends TranslationBundle {
/***/ public String tagOnRepoWithoutHEADCurrentlyNotSupported; /***/ public String tagOnRepoWithoutHEADCurrentlyNotSupported;
/***/ public String transactionAborted; /***/ public String transactionAborted;
/***/ public String theFactoryMustNotBeNull; /***/ public String theFactoryMustNotBeNull;
/***/ public String threadInterruptedWhileRunning;
/***/ public String timeIsUncertain; /***/ public String timeIsUncertain;
/***/ public String timerAlreadyTerminated; /***/ public String timerAlreadyTerminated;
/***/ public String tooManyCommands; /***/ public String tooManyCommands;

33
org.eclipse.jgit/src/org/eclipse/jgit/util/FS.java

@ -564,6 +564,10 @@ public abstract class FS {
} }
private static class GobblerThread extends Thread { private static class GobblerThread extends Thread {
/* The process has 5 seconds to exit after closing stderr */
private static final int PROCESS_EXIT_TIMEOUT = 5;
private final Process p; private final Process p;
private final String desc; private final String desc;
private final String dir; private final String dir;
@ -586,15 +590,16 @@ public abstract class FS {
err.append((char) ch); err.append((char) ch);
} }
} catch (IOException e) { } catch (IOException e) {
if (p.exitValue() != 0) { if (waitForProcessCompletion(e) && p.exitValue() != 0) {
setError(e, e.getMessage()); setError(e, e.getMessage(), p.exitValue());
fail.set(true); fail.set(true);
} else { } else {
// ignore. command terminated faster and stream was just closed // ignore. command terminated faster and stream was just closed
// or the process didn't terminate within timeout
} }
} finally { } finally {
if (err.length() > 0) { if (waitForProcessCompletion(null) && err.length() > 0) {
setError(null, err.toString()); setError(null, err.toString(), p.exitValue());
if (p.exitValue() != 0) { if (p.exitValue() != 0) {
fail.set(true); fail.set(true);
} }
@ -602,11 +607,27 @@ public abstract class FS {
} }
} }
private void setError(IOException e, String message) { @SuppressWarnings("boxing")
private boolean waitForProcessCompletion(IOException originalError) {
try {
if (!p.waitFor(PROCESS_EXIT_TIMEOUT, TimeUnit.SECONDS)) {
setError(originalError, MessageFormat.format(
JGitText.get().commandClosedStderrButDidntExit,
desc, PROCESS_EXIT_TIMEOUT), -1);
fail.set(true);
}
} catch (InterruptedException e) {
LOG.error(MessageFormat.format(
JGitText.get().threadInterruptedWhileRunning, desc), e);
}
return false;
}
private void setError(IOException e, String message, int exitCode) {
exception.set(e); exception.set(e);
errorMessage.set(MessageFormat.format( errorMessage.set(MessageFormat.format(
JGitText.get().exceptionCaughtDuringExcecutionOfCommand, JGitText.get().exceptionCaughtDuringExcecutionOfCommand,
desc, dir, Integer.valueOf(p.exitValue()), message)); desc, dir, Integer.valueOf(exitCode), message));
} }
} }

Loading…
Cancel
Save