diff options
-rw-r--r-- | org.eclipse.jgit/src/org/eclipse/jgit/util/FS.java | 34 | ||||
-rw-r--r-- | org.eclipse.jgit/src/org/eclipse/jgit/util/FS_POSIX.java | 2 | ||||
-rw-r--r-- | org.eclipse.jgit/src/org/eclipse/jgit/util/FS_Win32.java | 31 |
3 files changed, 45 insertions, 22 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 857b980a33..51b5a45ac2 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/util/FS.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/FS.java @@ -101,6 +101,8 @@ public abstract class FS { private final File userHome; + private volatile Holder<File> gitPrefix; + /** * Constructs a file system abstraction. */ @@ -258,7 +260,29 @@ public abstract class FS { } /** @return the $prefix directory C Git would use. */ - public abstract File gitPrefix(); + public File gitPrefix() { + Holder<File> p = gitPrefix; + if (p == null) { + p = new Holder<File>(discoverGitPrefix()); + gitPrefix = p; + } + return p.value; + } + + /** @return the $prefix directory C Git would use. */ + protected abstract File discoverGitPrefix(); + + /** + * Set the $prefix directory C Git uses. + * + * @param path + * the directory. Null if C Git is not installed. + * @return {@code this} + */ + public FS setGitPrefix(File path) { + gitPrefix = new Holder<File>(path); + return this; + } /** * Initialize a ProcesssBuilder to run a command using the system shell. @@ -273,4 +297,12 @@ public abstract class FS { * populating directory, environment, and then start the process. */ public abstract ProcessBuilder runInShell(String cmd, String[] args); + + private static class Holder<V> { + final V value; + + Holder(V value) { + this.value = value; + } + } } diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/util/FS_POSIX.java b/org.eclipse.jgit/src/org/eclipse/jgit/util/FS_POSIX.java index 14fac15df1..180b016bea 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/util/FS_POSIX.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/FS_POSIX.java @@ -52,7 +52,7 @@ import java.util.List; abstract class FS_POSIX extends FS { @Override - public File gitPrefix() { + protected File discoverGitPrefix() { String path = SystemReader.getInstance().getenv("PATH"); File gitExe = searchPath(path, "git"); if (gitExe != null) diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/util/FS_Win32.java b/org.eclipse.jgit/src/org/eclipse/jgit/util/FS_Win32.java index 7e1b6434cb..5838fed6af 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/util/FS_Win32.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/FS_Win32.java @@ -64,9 +64,6 @@ class FS_Win32 extends FS { && StringUtils.toLowerCase(osDotName).indexOf("windows") != -1; } - private File gitPrefix; - private boolean gitPrefixEvaluated; - public boolean supportsExecute() { return false; } @@ -85,27 +82,21 @@ class FS_Win32 extends FS { } @Override - public File gitPrefix() { - if (gitPrefixEvaluated) - return gitPrefix; - + protected File discoverGitPrefix() { String path = SystemReader.getInstance().getenv("PATH"); File gitExe = searchPath(path, "git.exe", "git.cmd"); if (gitExe != null) - gitPrefix = gitExe.getParentFile().getParentFile(); - else { - // This isn't likely to work, if bash is in $PATH, git should - // also be in $PATH. But its worth trying. - // - String w = readPipe(userHome(), // - new String[] { "bash", "--login", "-c", "which git" }, // - Charset.defaultCharset().name()); - if (w != null) - gitPrefix = new File(w).getParentFile().getParentFile(); - } + return gitExe.getParentFile().getParentFile(); - gitPrefixEvaluated = true; - return gitPrefix; + // This isn't likely to work, if bash is in $PATH, git should + // also be in $PATH. But its worth trying. + // + String w = readPipe(userHome(), // + new String[] { "bash", "--login", "-c", "which git" }, // + Charset.defaultCharset().name()); + if (w != null) + return new File(w).getParentFile().getParentFile(); + return null; } @Override |