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 {
* @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;
}