Browse Source

Merge "FS: Allow gitPrefix to be set and cached"

stable-0.12
Chris Aniszczyk 14 years ago committed by Code Review
parent
commit
aa5f9ecdf2
  1. 34
      org.eclipse.jgit/src/org/eclipse/jgit/util/FS.java
  2. 2
      org.eclipse.jgit/src/org/eclipse/jgit/util/FS_POSIX.java
  3. 19
      org.eclipse.jgit/src/org/eclipse/jgit/util/FS_Win32.java

34
org.eclipse.jgit/src/org/eclipse/jgit/util/FS.java

@ -101,6 +101,8 @@ public abstract class FS {
private final File userHome; private final File userHome;
private volatile Holder<File> gitPrefix;
/** /**
* Constructs a file system abstraction. * Constructs a file system abstraction.
*/ */
@ -258,7 +260,29 @@ public abstract class FS {
} }
/** @return the $prefix directory C Git would use. */ /** @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. * 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. * populating directory, environment, and then start the process.
*/ */
public abstract ProcessBuilder runInShell(String cmd, String[] args); public abstract ProcessBuilder runInShell(String cmd, String[] args);
private static class Holder<V> {
final V value;
Holder(V value) {
this.value = value;
}
}
} }

2
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 { abstract class FS_POSIX extends FS {
@Override @Override
public File gitPrefix() { protected File discoverGitPrefix() {
String path = SystemReader.getInstance().getenv("PATH"); String path = SystemReader.getInstance().getenv("PATH");
File gitExe = searchPath(path, "git"); File gitExe = searchPath(path, "git");
if (gitExe != null) if (gitExe != null)

19
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; && StringUtils.toLowerCase(osDotName).indexOf("windows") != -1;
} }
private File gitPrefix;
private boolean gitPrefixEvaluated;
public boolean supportsExecute() { public boolean supportsExecute() {
return false; return false;
} }
@ -85,15 +82,12 @@ class FS_Win32 extends FS {
} }
@Override @Override
public File gitPrefix() { protected File discoverGitPrefix() {
if (gitPrefixEvaluated)
return gitPrefix;
String path = SystemReader.getInstance().getenv("PATH"); String path = SystemReader.getInstance().getenv("PATH");
File gitExe = searchPath(path, "git.exe", "git.cmd"); File gitExe = searchPath(path, "git.exe", "git.cmd");
if (gitExe != null) if (gitExe != null)
gitPrefix = gitExe.getParentFile().getParentFile(); return gitExe.getParentFile().getParentFile();
else {
// This isn't likely to work, if bash is in $PATH, git should // This isn't likely to work, if bash is in $PATH, git should
// also be in $PATH. But its worth trying. // also be in $PATH. But its worth trying.
// //
@ -101,11 +95,8 @@ class FS_Win32 extends FS {
new String[] { "bash", "--login", "-c", "which git" }, // new String[] { "bash", "--login", "-c", "which git" }, //
Charset.defaultCharset().name()); Charset.defaultCharset().name());
if (w != null) if (w != null)
gitPrefix = new File(w).getParentFile().getParentFile(); return new File(w).getParentFile().getParentFile();
} return null;
gitPrefixEvaluated = true;
return gitPrefix;
} }
@Override @Override

Loading…
Cancel
Save