diff --git a/vcs/src/main/java/org/openjdk/skara/vcs/hg/HgRepository.java b/vcs/src/main/java/org/openjdk/skara/vcs/hg/HgRepository.java index 90a2efba9..f4613b2d7 100644 --- a/vcs/src/main/java/org/openjdk/skara/vcs/hg/HgRepository.java +++ b/vcs/src/main/java/org/openjdk/skara/vcs/hg/HgRepository.java @@ -650,7 +650,9 @@ public Hash amend(String message, String authorName, String authorEmail, String @Override public Tag tag(Hash hash, String name, String message, String authorName, String authorEmail) throws IOException { - var user = authorName + " <" + authorEmail + ">"; + var user = authorEmail != null ? + authorName + " <" + authorEmail + ">" : + authorName; try (var p = capture("hg", "tag", "--message", message, "--user", user, 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 2e60e0661..79738c79a 100644 --- a/vcs/src/test/java/org/openjdk/skara/vcs/RepositoryTests.java +++ b/vcs/src/test/java/org/openjdk/skara/vcs/RepositoryTests.java @@ -2409,4 +2409,19 @@ void testMergeCommitWithRenamedP0AndModifiedP1(VCS vcs) throws IOException { assertEquals(Path.of("README.new"), p1.target().path().get()); } } + + @Test + void testMercurialTagWithoutEmail() throws IOException, InterruptedException { + try (var dir = new TemporaryDirectory()) { + var repo = Repository.init(dir.path(), VCS.HG); + 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"); + var tag = repo.tag(head, "1.0", "Add tag 1.0", "duke", null); + var annotated = repo.annotate(tag).orElseThrow(); + assertEquals("duke", annotated.author().name()); + assertNull(annotated.author().email()); + } + } }