diff options
author | Kevin Sawicki <kevin@github.com> | 2012-05-10 13:32:16 -0700 |
---|---|---|
committer | Chris Aniszczyk <zx@twitter.com> | 2012-06-04 09:15:35 -0700 |
commit | 2a18bb304caea46f9fb6fd5e1d37a13f53dc19e4 (patch) | |
tree | b966dd695daaa9968e5286507e502f9bc1ff28a6 /org.eclipse.jgit/src/org/eclipse | |
parent | 8a0169727f8701030aaf05409c9a4cdf45e4965d (diff) | |
download | jgit-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.java | 57 |
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)); } } |