aboutsummaryrefslogtreecommitdiffstats
path: root/org.eclipse.jgit/src/org/eclipse
diff options
context:
space:
mode:
authorKevin Sawicki <kevin@github.com>2012-05-10 13:32:16 -0700
committerChris Aniszczyk <zx@twitter.com>2012-06-04 09:15:35 -0700
commit2a18bb304caea46f9fb6fd5e1d37a13f53dc19e4 (patch)
treeb966dd695daaa9968e5286507e502f9bc1ff28a6 /org.eclipse.jgit/src/org/eclipse
parent8a0169727f8701030aaf05409c9a4cdf45e4965d (diff)
downloadjgit-2a18bb304caea46f9fb6fd5e1d37a13f53dc19e4.tar.gz
jgit-2a18bb304caea46f9fb6fd5e1d37a13f53dc19e4.zip
Support gitdir: refs in BaseRepositoryBuilder.findGitDir
This allows findGitDir to be used for repositories containing a .git file with a gitdir: ref to the repository's directory such as submodule repositories that point to a folder under the parent repository's .git/modules folder Change-Id: I2f1ec7215a2208aa90511c065cadc7e816522f62 Signed-off-by: Chris Aniszczyk <zx@twitter.com>
Diffstat (limited to 'org.eclipse.jgit/src/org/eclipse')
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/lib/BaseRepositoryBuilder.java57
1 files changed, 32 insertions, 25 deletions
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/BaseRepositoryBuilder.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/BaseRepositoryBuilder.java
index 17e06039b2..f80c803605 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/BaseRepositoryBuilder.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/BaseRepositoryBuilder.java
@@ -100,6 +100,29 @@ public class BaseRepositoryBuilder<B extends BaseRepositoryBuilder, R extends Re
&& ref[7] == ' ';
}
+ private static File getSymRef(File workTree, File dotGit)
+ throws IOException {
+ byte[] content = IO.readFully(dotGit);
+ if (!isSymRef(content))
+ throw new IOException(MessageFormat.format(
+ JGitText.get().invalidGitdirRef, dotGit.getAbsolutePath()));
+
+ int pathStart = 8;
+ int lineEnd = RawParseUtils.nextLF(content, pathStart);
+ if (content[lineEnd - 1] == '\n')
+ lineEnd--;
+ if (lineEnd == pathStart)
+ throw new IOException(MessageFormat.format(
+ JGitText.get().invalidGitdirRef, dotGit.getAbsolutePath()));
+
+ String gitdirPath = RawParseUtils.decode(content, pathStart, lineEnd);
+ File gitdirFile = new File(gitdirPath);
+ if (gitdirFile.isAbsolute())
+ return gitdirFile;
+ else
+ return new File(workTree, gitdirPath).getCanonicalFile();
+ }
+
private FS fs;
private File gitDir;
@@ -491,7 +514,13 @@ public class BaseRepositoryBuilder<B extends BaseRepositoryBuilder, R extends Re
if (FileKey.isGitRepository(dir, tryFS)) {
setGitDir(dir);
break;
- }
+ } else if (dir.isFile())
+ try {
+ setGitDir(getSymRef(current, dir));
+ break;
+ } catch (IOException ignored) {
+ // Continue searching if gitdir ref isn't found
+ }
current = current.getParentFile();
if (current != null && ceilingDirectories != null
@@ -567,30 +596,8 @@ public class BaseRepositoryBuilder<B extends BaseRepositoryBuilder, R extends Re
File dotGit = new File(getWorkTree(), DOT_GIT);
if (!dotGit.isFile())
setGitDir(dotGit);
- else {
- byte[] content = IO.readFully(dotGit);
- if (!isSymRef(content))
- throw new IOException(MessageFormat.format(
- JGitText.get().invalidGitdirRef,
- dotGit.getAbsolutePath()));
- int pathStart = 8;
- int lineEnd = RawParseUtils.nextLF(content, pathStart);
- if (content[lineEnd - 1] == '\n')
- lineEnd--;
- if (lineEnd == pathStart)
- throw new IOException(MessageFormat.format(
- JGitText.get().invalidGitdirRef,
- dotGit.getAbsolutePath()));
-
- String gitdirPath = RawParseUtils.decode(content, pathStart,
- lineEnd);
- File gitdirFile = new File(gitdirPath);
- if (gitdirFile.isAbsolute())
- setGitDir(gitdirFile);
- else
- setGitDir(new File(getWorkTree(), gitdirPath)
- .getCanonicalFile());
- }
+ else
+ setGitDir(getSymRef(getWorkTree(), dotGit));
}
}