diff options
author | Chris Aniszczyk <caniszczyk@gmail.com> | 2011-05-03 12:53:49 -0400 |
---|---|---|
committer | Code Review <codereview-daemon@eclipse.org> | 2011-05-03 12:53:49 -0400 |
commit | 7a9ebbfa9f39e67f00ab599f3d65098c55987f03 (patch) | |
tree | 013fa9f9ba973d9e9d7131b5cd053a1990bf73ea | |
parent | f2a146d03372989321f1fa57a6cf33d484097ea8 (diff) | |
parent | ea5df164045c2942a4956b374b1afa4155664f98 (diff) | |
download | jgit-7a9ebbfa9f39e67f00ab599f3d65098c55987f03.tar.gz jgit-7a9ebbfa9f39e67f00ab599f3d65098c55987f03.zip |
Merge "Attempt to make git prefix detection more reliable"
-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; } |