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 2287f68fa..0a3fad001 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/util/FS.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/FS.java @@ -43,7 +43,10 @@ package org.eclipse.jgit.util; +import java.io.BufferedReader; import java.io.File; +import java.io.IOException; +import java.io.InputStreamReader; import java.security.AccessController; import java.security.PrivilegedAction; @@ -210,4 +213,43 @@ public abstract class FS { } return null; } + + /** + * Execute a command and return a single line of output as a String + * + * @param dir + * Working directory for the command + * @param command + * as component array + * @param encoding + * @return the one-line output of the command + */ + protected static String readPipe(File dir, String[] command, String encoding) { + try { + final Process p = Runtime.getRuntime().exec(command, null, dir); + final BufferedReader lineRead = new BufferedReader( + new InputStreamReader(p.getInputStream(), encoding)); + String r = null; + try { + r = lineRead.readLine(); + } finally { + p.getOutputStream().close(); + p.getErrorStream().close(); + lineRead.close(); + } + + for (;;) { + try { + if (p.waitFor() == 0 && r != null && r.length() > 0) + return r; + break; + } catch (InterruptedException ie) { + // Stop bothering me, I have a zombie to reap. + } + } + } catch (IOException e) { + // ignore + } + return null; + } } diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/util/FS_Win32_Cygwin.java b/org.eclipse.jgit/src/org/eclipse/jgit/util/FS_Win32_Cygwin.java index 0af955f94..15da505f5 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/util/FS_Win32_Cygwin.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/FS_Win32_Cygwin.java @@ -43,10 +43,7 @@ package org.eclipse.jgit.util; -import java.io.BufferedReader; import java.io.File; -import java.io.IOException; -import java.io.InputStreamReader; import java.security.AccessController; import java.security.PrivilegedAction; @@ -69,36 +66,11 @@ class FS_Win32_Cygwin extends FS_Win32 { } public File resolve(final File dir, final String pn) { - try { - final Process p; - - p = Runtime.getRuntime().exec( - new String[] { cygpath, "--windows", "--absolute", pn }, - null, dir); - p.getOutputStream().close(); - - final BufferedReader lineRead = new BufferedReader( - new InputStreamReader(p.getInputStream(), "UTF-8")); - String r = null; - try { - r = lineRead.readLine(); - } finally { - lineRead.close(); - } - - for (;;) { - try { - if (p.waitFor() == 0 && r != null && r.length() > 0) - return new File(r); - break; - } catch (InterruptedException ie) { - // Stop bothering me, I have a zombie to reap. - } - } - } catch (IOException ioe) { - // Fall through and use the default return. - // - } + String w = readPipe(dir, // + new String[] { cygpath, "--windows", "--absolute", pn }, // + "UTF-8"); + if (w != null) + return new File(w); return super.resolve(dir, pn); }