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 dab1ce021..d9a67b7a5 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 @@ -1399,11 +1399,19 @@ public Optional annotate(Tag tag) throws IOException { var lines = await(p).stdout(); if (lines.size() >= 4) { var name = lines.get(0); - var target = new Hash(lines.get(1)); - var author = Author.fromString(lines.get(2)); + var targetLine = lines.get(1); + var authorLine = lines.get(2); + var dateLine = lines.get(3); + if (targetLine.isEmpty() && authorLine.equals(" ") && dateLine.isEmpty()) { + // Must be a lightweight tag, no metadata present + return Optional.empty(); + } + + var target = new Hash(targetLine); + var author = Author.fromString(authorLine); var formatter = DateTimeFormatter.ISO_OFFSET_DATE_TIME; - var date = ZonedDateTime.parse(lines.get(3), formatter); + var date = ZonedDateTime.parse(dateLine, formatter); var message = String.join("\n", lines.subList(4, lines.size())); return Optional.of(new Tag.Annotated(name, target, author, date, message)); 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 dfb449031..ab04ce3bd 100644 --- a/vcs/src/test/java/org/openjdk/skara/vcs/RepositoryTests.java +++ b/vcs/src/test/java/org/openjdk/skara/vcs/RepositoryTests.java @@ -2323,4 +2323,31 @@ void testCommitterDate() throws IOException { assertEquals(committed, commit.committed()); } } + + @Test + void testLightweightTags() throws IOException, InterruptedException { + try (var dir = new TemporaryDirectory()) { + var repo = Repository.init(dir.path(), VCS.GIT); + var readme = dir.path().resolve("README"); + Files.write(readme, List.of("Hello, readme!")); + + repo.add(readme); + var head = repo.commit("Add README", "author", "author@openjdk.java.net"); + + // We don't want to expose making lightweight tags via the Repository class, + // so use a ProcessBuilder and invoke git directly here + var pb = new ProcessBuilder("git", "tag", "test-tag", head.hex()); + pb.directory(repo.root().toFile()); + assertEquals(0, pb.start().waitFor()); + + var tags = repo.tags(); + assertEquals(1, tags.size()); + + var tag = tags.get(0); + assertEquals("test-tag", tag.name()); + + // Lightweight tags can't be annotated + assertEquals(Optional.empty(), repo.annotate(tag)); + } + } }