Cache gitPrefix in FS_Win32

readPipe() may consume rather much time, so
gitPrefix should be cached. If the git executable changes,
users should run FS.detect() again to get a new
instance of FS_Win32.
This commit is contained in:
Marc Strapetz 2011-03-10 13:17:57 +01:00
parent ff6ac0aaef
commit 6f066dec02
1 changed files with 19 additions and 11 deletions

View File

@ -64,6 +64,9 @@ public String run() {
&& StringUtils.toLowerCase(osDotName).indexOf("windows") != -1;
}
private File gitPrefix;
private boolean gitPrefixEvaluated;
public boolean supportsExecute() {
return false;
}
@ -83,21 +86,26 @@ public boolean retryFailedLockFileCommit() {
@Override
public File gitPrefix() {
if (gitPrefixEvaluated)
return gitPrefix;
String path = SystemReader.getInstance().getenv("PATH");
File gitExe = searchPath(path, "git.exe", "git.cmd");
if (gitExe != null)
return gitExe.getParentFile().getParentFile();
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();
}
// 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;
gitPrefixEvaluated = true;
return gitPrefix;
}
@Override