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 | |
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>
-rw-r--r-- | org.eclipse.jgit.test/tst/org/eclipse/jgit/storage/file/FileRepositoryBuilderTest.java | 57 | ||||
-rw-r--r-- | org.eclipse.jgit/src/org/eclipse/jgit/lib/BaseRepositoryBuilder.java | 57 |
2 files changed, 89 insertions, 25 deletions
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/storage/file/FileRepositoryBuilderTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/storage/file/FileRepositoryBuilderTest.java index aed48aa5fb..b6377482dc 100644 --- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/storage/file/FileRepositoryBuilderTest.java +++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/storage/file/FileRepositoryBuilderTest.java @@ -45,13 +45,16 @@ package org.eclipse.jgit.storage.file; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.io.File; +import java.io.FileWriter; import java.io.IOException; import org.eclipse.jgit.junit.LocalDiskRepositoryTestCase; import org.eclipse.jgit.lib.ConfigConstants; +import org.eclipse.jgit.lib.Constants; import org.eclipse.jgit.util.FileUtils; import org.junit.Test; @@ -108,4 +111,58 @@ public class FileRepositoryBuilderTest extends LocalDiskRepositoryTestCase { assertNotNull(e.getMessage()); } } + + @Test + public void absoluteGitDirRef() throws Exception { + FileRepository repo1 = createWorkRepository(); + File dir = createTempDirectory("dir"); + File dotGit = new File(dir, Constants.DOT_GIT); + new FileWriter(dotGit).append( + "gitdir: " + repo1.getDirectory().getAbsolutePath()).close(); + FileRepositoryBuilder builder = new FileRepositoryBuilder(); + + builder.setWorkTree(dir); + builder.setMustExist(true); + FileRepository repo2 = builder.build(); + + assertEquals(repo1.getDirectory(), repo2.getDirectory()); + assertEquals(dir, repo2.getWorkTree()); + } + + @Test + public void relativeGitDirRef() throws Exception { + FileRepository repo1 = createWorkRepository(); + File dir = new File(repo1.getWorkTree(), "dir"); + assertTrue(dir.mkdir()); + File dotGit = new File(dir, Constants.DOT_GIT); + new FileWriter(dotGit).append("gitdir: ../" + Constants.DOT_GIT) + .close(); + + FileRepositoryBuilder builder = new FileRepositoryBuilder(); + builder.setWorkTree(dir); + builder.setMustExist(true); + FileRepository repo2 = builder.build(); + + assertEquals(repo1.getDirectory(), repo2.getDirectory()); + assertEquals(dir, repo2.getWorkTree()); + } + + @Test + public void scanWithGitDirRef() throws Exception { + FileRepository repo1 = createWorkRepository(); + File dir = createTempDirectory("dir"); + File dotGit = new File(dir, Constants.DOT_GIT); + new FileWriter(dotGit).append( + "gitdir: " + repo1.getDirectory().getAbsolutePath()).close(); + FileRepositoryBuilder builder = new FileRepositoryBuilder(); + + builder.setWorkTree(dir); + builder.findGitDir(dir); + assertEquals(repo1.getDirectory(), builder.getGitDir()); + builder.setMustExist(true); + FileRepository repo2 = builder.build(); + + assertEquals(repo1.getDirectory(), repo2.getDirectory()); + assertEquals(dir, repo2.getWorkTree()); + } } 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)); } } |