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