From 62460b42b7a64513e3421aae17082fdc923faf95 Mon Sep 17 00:00:00 2001 From: Matthias Sohn Date: Fri, 8 Jun 2018 17:45:00 +0200 Subject: [PATCH] Validate branch names on branch creation Since v2.16.0-rc0~89^2~1 (branch: correctly reject refs/heads/{-dash,HEAD}, 2017-11-14), native git does not allow branch names - refs/heads/HEAD - starting with '-' Bug: 535655 Change-Id: Ib1c4ec9ea844073901a4ebe6a29ff6cc8ae58e93 Signed-off-by: Matthias Sohn --- .../eclipse/jgit/api/BranchCommandTest.java | 12 +++++++ .../eclipse/jgit/api/CreateBranchCommand.java | 32 +++++++++++++++---- 2 files changed, 38 insertions(+), 6 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 2fe40b99ed..08f1fdfacf 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 @@ -191,6 +191,18 @@ public class BranchCommandTest extends RepositoryTestCase { - allBefore); } + @Test(expected = InvalidRefNameException.class) + public void testInvalidBranchHEAD() throws Exception { + git.branchCreate().setName("HEAD").call(); + fail("Create branch with invalid ref name should fail"); + } + + @Test(expected = InvalidRefNameException.class) + public void testInvalidBranchDash() throws Exception { + git.branchCreate().setName("-x").call(); + fail("Create branch with invalid ref name should fail"); + } + @Test public void testListAllBranchesShouldNotDie() throws Exception { setUpRepoWithRemote().branchList().setListMode(ListMode.ALL).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 29baf4cd63..ba6f3f11b4 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/api/CreateBranchCommand.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/CreateBranchCommand.java @@ -43,6 +43,9 @@ */ package org.eclipse.jgit.api; +import static org.eclipse.jgit.lib.Constants.HEAD; +import static org.eclipse.jgit.lib.Constants.R_HEADS; + import java.io.IOException; import java.text.MessageFormat; @@ -78,7 +81,7 @@ public class CreateBranchCommand extends GitCommand { private SetupUpstreamMode upstreamMode; - private String startPoint = Constants.HEAD; + private String startPoint = HEAD; private RevCommit startCommit; @@ -121,7 +124,7 @@ public class CreateBranchCommand extends GitCommand { try (RevWalk revWalk = new RevWalk(repo)) { Ref refToCheck = repo.findRef(name); boolean exists = refToCheck != null - && refToCheck.getName().startsWith(Constants.R_HEADS); + && refToCheck.getName().startsWith(R_HEADS); if (!force && exists) throw new RefAlreadyExistsException(MessageFormat.format( JGitText.get().refAlreadyExists1, name)); @@ -153,7 +156,7 @@ public class CreateBranchCommand extends GitCommand { else refLogMessage = "branch: Created from commit " + baseCommit; //$NON-NLS-1$ - } else if (startPointFullName.startsWith(Constants.R_HEADS) + } else if (startPointFullName.startsWith(R_HEADS) || startPointFullName.startsWith(Constants.R_REMOTES)) { baseBranch = startPointFullName; if (exists) @@ -171,7 +174,7 @@ public class CreateBranchCommand extends GitCommand { + startPointFullName; } - RefUpdate updateRef = repo.updateRef(Constants.R_HEADS + name); + RefUpdate updateRef = repo.updateRef(R_HEADS + name); updateRef.setNewObjectId(startAt); updateRef.setRefLogMessage(refLogMessage, false); Result updateResult; @@ -279,16 +282,33 @@ public class CreateBranchCommand extends GitCommand { } private String getStartPointOrHead() { - return startPoint != null ? startPoint : Constants.HEAD; + return startPoint != null ? startPoint : HEAD; } private void processOptions() throws InvalidRefNameException { if (name == null - || !Repository.isValidRefName(Constants.R_HEADS + name)) + || !Repository.isValidRefName(R_HEADS + name) + || !isValidBranchName(name)) throw new InvalidRefNameException(MessageFormat.format(JGitText .get().branchNameInvalid, name == null ? "" : name)); //$NON-NLS-1$ } + /** + * Check if the given branch name is valid + * + * @param branchName + * branch name to check + * @return {@code true} if the branch name is valid + * + * @since 5.0 + */ + public static boolean isValidBranchName(String branchName) { + if (HEAD.equals(branchName)) { + return false; + } + return !branchName.startsWith("-"); //$NON-NLS-1$ + } + /** * Set the name of the new branch * -- 2.39.5