aboutsummaryrefslogtreecommitdiffstats
path: root/org.eclipse.jgit/src/org/eclipse/jgit
diff options
context:
space:
mode:
authorDave Borowitz <dborowitz@google.com>2015-05-27 09:40:32 -0700
committerDave Borowitz <dborowitz@google.com>2015-05-27 10:04:35 -0700
commitb8c8008115e0c48d3d844af1dc858c700a9428e4 (patch)
treeda07051ae0f19f2411b7cdf8ef1774dbc7d3ff13 /org.eclipse.jgit/src/org/eclipse/jgit
parent0e8ac496cd9bbfa3fa306ac45706f501fc24ac38 (diff)
downloadjgit-b8c8008115e0c48d3d844af1dc858c700a9428e4.tar.gz
jgit-b8c8008115e0c48d3d844af1dc858c700a9428e4.zip
FS: Extract GobblerThread into a private static class
The primary goal is to improve exception readability. Since this is a standalone thread, just logging the stack trace of the caught exception is not very useful: java.io.IOException: Stream closed at java.io.BufferedInputStream.getBufIfOpen(BufferedInputStream.java:162) at java.io.BufferedInputStream.read(BufferedInputStream.java:258) at org.eclipse.jgit.util.FS$2.run(FS.java:451) Providing a named class eliminates the "FS$2", and including the command name provides a little more context in the error message. A future improvement might include the stack trace that created the GobblerThread as well. Change-Id: Ibf16d15b47a85b6f41844a177e398c2fc94f27b0
Diffstat (limited to 'org.eclipse.jgit/src/org/eclipse/jgit')
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/internal/JGitText.java1
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/util/FS.java90
2 files changed, 58 insertions, 33 deletions
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/JGitText.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/JGitText.java
index b53c7c95f0..9f6efef570 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/JGitText.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/JGitText.java
@@ -316,6 +316,7 @@ public class JGitText extends TranslationBundle {
/***/ public String exceptionCaughtDuringExecutionOfRevertCommand;
/***/ public String exceptionCaughtDuringExecutionOfRmCommand;
/***/ public String exceptionCaughtDuringExecutionOfTagCommand;
+ /***/ public String exceptionCaughtDuringExcecutionOfCommand;
/***/ public String exceptionHookExecutionInterrupted;
/***/ public String exceptionOccurredDuringAddingOfOptionToALogCommand;
/***/ public String exceptionOccurredDuringReadingOfGIT_DIR;
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/util/FS.java b/org.eclipse.jgit/src/org/eclipse/jgit/util/FS.java
index fa0292e793..12dfe96b05 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/util/FS.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/FS.java
@@ -440,40 +440,11 @@ public abstract class FS {
if (env != null) {
pb.environment().putAll(env);
}
- final Process p = pb.start();
- final BufferedReader lineRead = new BufferedReader(
+ Process p = pb.start();
+ BufferedReader lineRead = new BufferedReader(
new InputStreamReader(p.getInputStream(), encoding));
p.getOutputStream().close();
- final AtomicBoolean gooblerFail = new AtomicBoolean(false);
- Thread gobbler = new Thread() {
- public void run() {
- InputStream is = p.getErrorStream();
- try {
- int ch;
- if (debug)
- while ((ch = is.read()) != -1)
- System.err.print((char) ch);
- else
- while (is.read() != -1) {
- // ignore
- }
- } catch (IOException e) {
- // Just print on stderr for debugging
- if (debug)
- e.printStackTrace(System.err);
- gooblerFail.set(true);
- }
- try {
- is.close();
- } catch (IOException e) {
- // Just print on stderr for debugging
- if (debug) {
- LOG.debug("Caught exception in gobbler thread", e); //$NON-NLS-1$
- }
- gooblerFail.set(true);
- }
- }
- };
+ GobblerThread gobbler = new GobblerThread(p, command, dir);
gobbler.start();
String r = null;
try {
@@ -498,7 +469,7 @@ public abstract class FS {
int rc = p.waitFor();
gobbler.join();
if (rc == 0 && r != null && r.length() > 0
- && !gooblerFail.get())
+ && !gobbler.fail.get())
return r;
if (debug) {
LOG.debug("readpipe rc=" + rc); //$NON-NLS-1$
@@ -517,6 +488,59 @@ public abstract class FS {
return null;
}
+ private static class GobblerThread extends Thread {
+ private final Process p;
+ private final String desc;
+ private final String dir;
+ private final boolean debug = LOG.isDebugEnabled();
+ private final AtomicBoolean fail = new AtomicBoolean();
+
+ private GobblerThread(Process p, String[] command, File dir) {
+ this.p = p;
+ if (debug) {
+ this.desc = Arrays.asList(command).toString();
+ this.dir = dir.toString();
+ } else {
+ this.desc = null;
+ this.dir = null;
+ }
+ }
+
+ public void run() {
+ InputStream is = p.getErrorStream();
+ try {
+ int ch;
+ if (debug) {
+ while ((ch = is.read()) != -1) {
+ System.err.print((char) ch);
+ }
+ } else {
+ while (is.read() != -1) {
+ // ignore
+ }
+ }
+ } catch (IOException e) {
+ logError(e);
+ fail.set(true);
+ }
+ try {
+ is.close();
+ } catch (IOException e) {
+ logError(e);
+ fail.set(true);
+ }
+ }
+
+ private void logError(Throwable t) {
+ if (!debug) {
+ return;
+ }
+ String msg = MessageFormat.format(
+ JGitText.get().exceptionCaughtDuringExcecutionOfCommand, desc, dir);
+ LOG.debug(msg, t);
+ }
+ }
+
/**
* @return the path to the Git executable or {@code null} if it cannot be
* determined.