aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Aniszczyk <caniszczyk@gmail.com>2011-05-03 12:53:49 -0400
committerCode Review <codereview-daemon@eclipse.org>2011-05-03 12:53:49 -0400
commit7a9ebbfa9f39e67f00ab599f3d65098c55987f03 (patch)
tree013fa9f9ba973d9e9d7131b5cd053a1990bf73ea
parentf2a146d03372989321f1fa57a6cf33d484097ea8 (diff)
parentea5df164045c2942a4956b374b1afa4155664f98 (diff)
downloadjgit-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.java58
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;
}