From e4a341db43d5d8a1e6e9c828e3b3e5ddd52b9186 Mon Sep 17 00:00:00 2001 From: "florian.signoret" Date: Mon, 16 Oct 2023 16:08:14 +0200 Subject: [PATCH] Fix branch ref exist check When a tag with the same name as the branch exists, the branch creation process should work too. We should detect that the branch already exists, and allow to force create it when the force option is used. Bug: 582538 Change-Id: I3b350d03be8edcde10e97b2318343240ca896cb0 --- .../org/eclipse/jgit/api/BranchCommandTest.java | 15 +++++++++++++++ .../org/eclipse/jgit/api/CreateBranchCommand.java | 4 +--- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/BranchCommandTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/BranchCommandTest.java index 87be813c8..7c1cbc37d 100644 --- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/BranchCommandTest.java +++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/BranchCommandTest.java @@ -12,6 +12,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertThrows; import static org.junit.Assert.fail; import java.util.List; @@ -160,6 +161,20 @@ public void testCreateAndList() throws Exception { - allBefore); } + @Test + public void testExistingNameInBothBranchesAndTags() throws Exception { + git.branchCreate().setName("test").call(); + git.tag().setName("test").call(); + + // existing name not allowed w/o force + assertThrows("Create branch with existing ref name should fail", + RefAlreadyExistsException.class, + () -> git.branchCreate().setName("test").call()); + + // existing name allowed with force option + git.branchCreate().setName("test").setForce(true).call(); + } + @Test(expected = InvalidRefNameException.class) public void testInvalidBranchHEAD() throws Exception { git.branchCreate().setName("HEAD").call(); diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/CreateBranchCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/CreateBranchCommand.java index e1efb86cd..013e0ff13 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/api/CreateBranchCommand.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/CreateBranchCommand.java @@ -88,9 +88,7 @@ public Ref call() throws GitAPIException, RefAlreadyExistsException, checkCallable(); processOptions(); try (RevWalk revWalk = new RevWalk(repo)) { - Ref refToCheck = repo.findRef(name); - boolean exists = refToCheck != null - && refToCheck.getName().startsWith(R_HEADS); + boolean exists = repo.findRef(R_HEADS + name) != null; if (!force && exists) throw new RefAlreadyExistsException(MessageFormat.format( JGitText.get().refAlreadyExists1, name));