From 2f79cf9900288991e51b8da408511ead05f4d085 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Wed, 8 Feb 2012 23:10:28 +0100 Subject: Support gitdir references in working tree .git file A '.git' file in a repository's working tree root is now parsed as a ref to a folder located elsewhere. This supports submodules having their repository location outside of the parent repository's working directory such as in the parent repository's '.git/modules' directory. This adds support to BaseRepositoryBuilder for repositories created with the '--separate-git-dir' option specified to 'git init'. Change-Id: I73c538f6d845bdbc0c4e2bce5a77f900cf36e1a9 Signed-off-by: Matthias Sohn --- .../resources/org/eclipse/jgit/JGitText.properties | 1 + .../src/org/eclipse/jgit/JGitText.java | 1 + .../eclipse/jgit/lib/BaseRepositoryBuilder.java | 50 ++++++++++++++++++-- .../org/eclipse/jgit/submodule/SubmoduleWalk.java | 53 ++++++++-------------- .../eclipse/jgit/treewalk/FileTreeIterator.java | 2 +- .../eclipse/jgit/treewalk/WorkingTreeIterator.java | 14 +++--- 6 files changed, 74 insertions(+), 47 deletions(-) (limited to 'org.eclipse.jgit') diff --git a/org.eclipse.jgit/resources/org/eclipse/jgit/JGitText.properties b/org.eclipse.jgit/resources/org/eclipse/jgit/JGitText.properties index 5b22801342..8a5e023104 100644 --- a/org.eclipse.jgit/resources/org/eclipse/jgit/JGitText.properties +++ b/org.eclipse.jgit/resources/org/eclipse/jgit/JGitText.properties @@ -234,6 +234,7 @@ invalidChannel=Invalid channel {0} invalidCharacterInBase64Data=Invalid character in Base64 data. invalidCommitParentNumber=Invalid commit parent number invalidEncryption=Invalid encryption +invalidGitdirRef = Invalid .git reference in file ''{0}'' invalidGitType=invalid git type: {0} invalidId=Invalid id {0} invalidIdLength=Invalid id length {0}; should be {1} diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/JGitText.java b/org.eclipse.jgit/src/org/eclipse/jgit/JGitText.java index dbc3bcae62..bcd14c6a4f 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/JGitText.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/JGitText.java @@ -294,6 +294,7 @@ public class JGitText extends TranslationBundle { /***/ public String invalidCharacterInBase64Data; /***/ public String invalidCommitParentNumber; /***/ public String invalidEncryption; + /***/ public String invalidGitdirRef; /***/ public String invalidGitType; /***/ public String invalidId; /***/ public String invalidIdLength; 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 22a2ae505d..7db0b9f87f 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/BaseRepositoryBuilder.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/BaseRepositoryBuilder.java @@ -69,6 +69,8 @@ import org.eclipse.jgit.storage.file.FileBasedConfig; import org.eclipse.jgit.storage.file.FileRepository; import org.eclipse.jgit.storage.file.FileRepositoryBuilder; import org.eclipse.jgit.util.FS; +import org.eclipse.jgit.util.IO; +import org.eclipse.jgit.util.RawParseUtils; import org.eclipse.jgit.util.SystemReader; /** @@ -85,6 +87,19 @@ import org.eclipse.jgit.util.SystemReader; * @see FileRepositoryBuilder */ public class BaseRepositoryBuilder { + private static boolean isSymRef(byte[] ref) { + if (ref.length < 9) + return false; + return /**/ref[0] == 'g' // + && ref[1] == 'i' // + && ref[2] == 't' // + && ref[3] == 'd' // + && ref[4] == 'i' // + && ref[5] == 'r' // + && ref[6] == ':' // + && ref[7] == ' '; + } + private FS fs; private File gitDir; @@ -546,10 +561,37 @@ public class BaseRepositoryBuilder