aboutsummaryrefslogtreecommitdiffstats
path: root/org.eclipse.jgit/src/org/eclipse/jgit/util/FS.java
diff options
context:
space:
mode:
Diffstat (limited to 'org.eclipse.jgit/src/org/eclipse/jgit/util/FS.java')
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/util/FS.java34
1 files changed, 33 insertions, 1 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;
+ }
+ }
}