diff --git a/vcs/src/main/java/org/openjdk/skara/vcs/git/GitRepository.java b/vcs/src/main/java/org/openjdk/skara/vcs/git/GitRepository.java index 6b82eaf92..6993d5b90 100644 --- a/vcs/src/main/java/org/openjdk/skara/vcs/git/GitRepository.java +++ b/vcs/src/main/java/org/openjdk/skara/vcs/git/GitRepository.java @@ -210,11 +210,24 @@ public List commitMetadata() throws IOException { return result; } + private int numRefs() throws IOException { + try (var p = capture("git", "show-ref", "--hash", "--abbrev")) { + var res = p.await(); + if (res.status() == -1) { + if (res.stdout().size() != 0) { + throw new IOException("Unexpected output\n" + res); + } + return 0; + } else { + return res.stdout().size(); + } + } + } + @Override public boolean isEmpty() throws IOException { int numLooseObjects = -1; int numPackedObjects = -1; - int numRefs = -1; try (var p = capture("git", "count-objects", "-v")) { var res = await(p); @@ -238,19 +251,7 @@ public boolean isEmpty() throws IOException { } } - try (var p = capture("git", "show-ref", "--hash", "--abbrev")) { - var res = p.await(); - if (res.status() == -1) { - if (res.stdout().size() != 0) { - throw new IOException("Unexpected output\n" + res); - } - numRefs = 0; - } else { - numRefs = res.stdout().size(); - } - } - - return numLooseObjects == 0 && numPackedObjects == 0 && numRefs == 0; + return numLooseObjects == 0 && numPackedObjects == 0 && numRefs() == 0; } @Override @@ -258,6 +259,9 @@ public boolean isHealthy() throws IOException { if (isEmpty()) { return true; } + if (numRefs() == 0) { + return true; + } var name = "health-check"; try (var p = capture("git", "branch", name, "HEAD")) { diff --git a/vcs/src/test/java/org/openjdk/skara/vcs/RepositoryTests.java b/vcs/src/test/java/org/openjdk/skara/vcs/RepositoryTests.java index 0f8d45efa..51cfebe43 100644 --- a/vcs/src/test/java/org/openjdk/skara/vcs/RepositoryTests.java +++ b/vcs/src/test/java/org/openjdk/skara/vcs/RepositoryTests.java @@ -663,6 +663,26 @@ void testNonEmptyRepositoryIsHealthy(VCS vcs) throws IOException { } } + @ParameterizedTest + @EnumSource(VCS.class) + void testNonCheckedOutRepositoryIsHealthy(VCS vcs) throws IOException { + try (var dir1 = new TemporaryDirectory(); + var dir2 = new TemporaryDirectory()) { + var r1 = Repository.init(dir1.path(), vcs); + + var readme = dir1.path().resolve("README"); + Files.write(readme, List.of("Hello, readme!")); + + r1.add(readme); + r1.commit("Add README", "duke", "duke@openjdk.java.net"); + + var r2 = Repository.init(dir2.path(), vcs); + r2.fetch(r1.root().toUri(), r1.defaultBranch().name()); + + assertTrue(r2.isHealthy()); + } + } + @ParameterizedTest @EnumSource(VCS.class) void testBranchesOnEmptyRepository(VCS vcs) throws IOException {