From 4c69043e78f45f2af18214788518c6ca131cbb87 Mon Sep 17 00:00:00 2001 From: Sebastian Staudt Date: Tue, 12 Feb 2019 13:56:59 +0100 Subject: [PATCH] Fix resolving the working tree of a linked worktree MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit By default the old behaviour would always cause the working tree to be the parent directory of the POM. The new method resolves the working tree as the parent directory of the worktree’s `GIT_DIR`. --- .../koraktor/mavanagaiata/git/jgit/JGitRepository.java | 9 +++++++-- .../mavanagaiata/git/jgit/JGitRepositoryTest.java | 5 +++++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/github/koraktor/mavanagaiata/git/jgit/JGitRepository.java b/src/main/java/com/github/koraktor/mavanagaiata/git/jgit/JGitRepository.java index 987aa768..432c4689 100644 --- a/src/main/java/com/github/koraktor/mavanagaiata/git/jgit/JGitRepository.java +++ b/src/main/java/com/github/koraktor/mavanagaiata/git/jgit/JGitRepository.java @@ -56,6 +56,7 @@ public class JGitRepository extends AbstractGitRepository { private static final int MAX_DESCRIBE_CANDIDATES = 10; static final String COMMONDIR_FILE = "commondir"; + static final String GITDIR_FILE = "gitdir"; private static final String INDEX_FILE = "index"; static final String REF_LINK_PREFIX = "ref: "; @@ -118,7 +119,11 @@ final void buildRepository(File workTree, File gitDir) throws GitRepositoryExcep realGitDir = new File(realGitDirPath); } - if (realGitDir.exists()) { + File originalGitDirFile = new File(foundGitDir, GITDIR_FILE); + String originalGitDirPath = readFileToString(originalGitDirFile, "UTF-8").trim(); + File originalGitDir = new File(originalGitDirPath); + + if (originalGitDir.exists() && realGitDir.exists()) { if (headRef.equals(HEAD)) { File headFile = new File(foundGitDir, HEAD); String rawHead = readFileToString(headFile, Charset.forName("UTF-8")); @@ -127,7 +132,7 @@ final void buildRepository(File workTree, File gitDir) throws GitRepositoryExcep repositoryBuilder.setGitDir(realGitDir); repositoryBuilder.setIndexFile(new File(foundGitDir, INDEX_FILE)); - repositoryBuilder.setWorkTree(workTree); + repositoryBuilder.setWorkTree(originalGitDir.getParentFile()); } } } else { diff --git a/src/test/java/com/github/koraktor/mavanagaiata/git/jgit/JGitRepositoryTest.java b/src/test/java/com/github/koraktor/mavanagaiata/git/jgit/JGitRepositoryTest.java index 0729c86a..7c80530c 100644 --- a/src/test/java/com/github/koraktor/mavanagaiata/git/jgit/JGitRepositoryTest.java +++ b/src/test/java/com/github/koraktor/mavanagaiata/git/jgit/JGitRepositoryTest.java @@ -11,6 +11,7 @@ import java.io.FileNotFoundException; import java.io.IOException; import java.nio.charset.Charset; +import java.nio.file.Files; import java.util.Date; import java.util.HashMap; import java.util.HashSet; @@ -171,8 +172,12 @@ void testCreateWithLinkedWorktree() throws Exception { workTree.deleteOnExit(); } + File originalGitDir = new File(workTree, DOT_GIT); + Files.createFile(originalGitDir.toPath()); + FileUtils.writeStringToFile(new File(gitDir, HEAD), REF_LINK_PREFIX + R_HEADS + "test", Charset.forName("UTF-8")); FileUtils.writeStringToFile(new File(gitDir, COMMONDIR_FILE), realGitDir.getAbsolutePath(), Charset.forName("UTF-8")); + FileUtils.writeStringToFile(new File(gitDir, GITDIR_FILE), originalGitDir.getAbsolutePath(), Charset.forName("UTF-8")); FileRepositoryBuilder repoBuilder = mock(FileRepositoryBuilder.class, RETURNS_DEEP_STUBS); when(repoBuilder.findGitDir(any())).thenReturn(repoBuilder); when(repoBuilder.getGitDir()).thenReturn(gitDir);