diff --git a/src/main/java/be/seeseepuff/webgit/service/GitService.java b/src/main/java/be/seeseepuff/webgit/service/GitService.java index 510794a..0e21bc3 100644 --- a/src/main/java/be/seeseepuff/webgit/service/GitService.java +++ b/src/main/java/be/seeseepuff/webgit/service/GitService.java @@ -464,13 +464,15 @@ public class GitService if (dirPath != null && !dirPath.isEmpty()) { tw.setFilter(PathFilter.create(dirPath)); - // Walk into the directory + // Walk into the directory, entering intermediate subtrees as needed while (tw.next()) { - if (tw.isSubtree() && tw.getPathString().equals(dirPath)) + if (tw.isSubtree()) { + String path = tw.getPathString(); tw.enterSubtree(); - break; + if (path.equals(dirPath)) + break; } } } diff --git a/src/test/java/be/seeseepuff/webgit/service/GitServiceTest.java b/src/test/java/be/seeseepuff/webgit/service/GitServiceTest.java index 96e8927..ffe5d5e 100644 --- a/src/test/java/be/seeseepuff/webgit/service/GitServiceTest.java +++ b/src/test/java/be/seeseepuff/webgit/service/GitServiceTest.java @@ -373,6 +373,23 @@ class GitServiceTest assertTrue(files.stream().anyMatch(f -> f.path().equals("README.md"))); } + @Test + void listFilesAtCommitReturnsNestedDirectoryContents() throws GitAPIException, IOException + { + gitService.cloneRepository(bareRemote.toUri().toString(), "myrepo"); + // Create a file two levels deep: src/main/Hello.txt + Path srcMain = worktreePath.resolve("myrepo/src/main"); + Files.createDirectories(srcMain); + Files.writeString(srcMain.resolve("Hello.txt"), "hello"); + gitService.stageFiles("myrepo", List.of("src/main/Hello.txt")); + gitService.commit("myrepo", "Add nested file"); + + var commits = gitService.listCommits("myrepo"); + var files = gitService.listFilesAtCommit("myrepo", commits.getFirst().hash(), "src/main"); + assertFalse(files.isEmpty()); + assertTrue(files.stream().anyMatch(f -> f.path().equals("src/main/Hello.txt"))); + } + @Test void getFileContentAtCommitReturnsContent() throws GitAPIException, IOException {