aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/util/FS.java34
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/util/FS_POSIX.java2
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/util/FS_Win32.java31
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