diff options
author | Robin Rosenberg <robin.rosenberg@dewire.com> | 2011-05-02 22:35:54 +0200 |
---|---|---|
committer | Robin Rosenberg <robin.rosenberg@dewire.com> | 2011-05-02 22:50:49 +0200 |
commit | ea5df164045c2942a4956b374b1afa4155664f98 (patch) | |
tree | 84fce08b39d0d5771c7bd50d352418d5dca90a0e /org.eclipse.jgit | |
parent | d05d351f3be5207a168c43b7cc52404195c2d567 (diff) | |
download | jgit-ea5df164045c2942a4956b374b1afa4155664f98.tar.gz jgit-ea5df164045c2942a4956b374b1afa4155664f98.zip |
Attempt to make git prefix detection more reliable
This fix makes sure the readPipe methods drains the stderr
pipe and close the subprocess' stdin stream before reading
the process outputs.
I never managed to repeat the reported problem myself, so this
may help in diagnosing the probelm on other peoples machines.
Bug: 337533
Change-Id: I299555f09768c34d5868327e574326946ee265e1
Diffstat (limited to 'org.eclipse.jgit')
-rw-r--r-- | org.eclipse.jgit/src/org/eclipse/jgit/util/FS.java | 58 |
1 files changed, 55 insertions, 3 deletions
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 d3bfd6fce5..7440fc9d1f 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/util/FS.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/FS.java @@ -46,9 +46,12 @@ package org.eclipse.jgit.util; import java.io.BufferedReader; import java.io.File; import java.io.IOException; +import java.io.InputStream; import java.io.InputStreamReader; import java.security.AccessController; import java.security.PrivilegedAction; +import java.util.Arrays; +import java.util.concurrent.atomic.AtomicBoolean; /** Abstraction to support various file system operations not in Java. */ public abstract class FS { @@ -263,33 +266,82 @@ public abstract class FS { * @return the one-line output of the command */ protected static String readPipe(File dir, String[] command, String encoding) { + final boolean debug = Boolean.parseBoolean(SystemReader.getInstance() + .getProperty("jgit.fs.debug")); try { + if (debug) + System.err.println("readpipe " + Arrays.asList(command) + "," + + dir); final Process p = Runtime.getRuntime().exec(command, null, dir); final 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 + e.printStackTrace(System.err); + gooblerFail.set(true); + } + try { + is.close(); + } catch (IOException e) { + // Just print on stderr for debugging + e.printStackTrace(System.err); + gooblerFail.set(true); + } + } + }; + gobbler.start(); String r = null; try { r = lineRead.readLine(); + if (debug) { + System.err.println("readpipe may return '" + r + "'"); + System.err.println("(ignoring remaing output:"); + } + String l; + while ((l = lineRead.readLine()) != null) { + if (debug) + System.err.println(l); + } } finally { - p.getOutputStream().close(); p.getErrorStream().close(); lineRead.close(); } for (;;) { try { - if (p.waitFor() == 0 && r != null && r.length() > 0) + int rc = p.waitFor(); + gobbler.join(); + if (rc == 0 && r != null && r.length() > 0 + && !gooblerFail.get()) return r; + if (debug) + System.err.println("readpipe rc=" + rc); break; } catch (InterruptedException ie) { // Stop bothering me, I have a zombie to reap. } } } catch (IOException e) { - if (SystemReader.getInstance().getProperty("jgit.fs.debug") != null) + if (debug) System.err.println(e); // Ignore error (but report) } + if (debug) + System.err.println("readpipe returns null"); return null; } |