]> source.dussan.org Git - jgit.git/commitdiff
Validate branch names on branch creation 72/124272/7
authorMatthias Sohn <matthias.sohn@sap.com>
Fri, 8 Jun 2018 15:45:00 +0000 (17:45 +0200)
committerMatthias Sohn <matthias.sohn@sap.com>
Fri, 8 Jun 2018 23:20:13 +0000 (01:20 +0200)
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 <matthias.sohn@sap.com>
org.eclipse.jgit.test/tst/org/eclipse/jgit/api/BranchCommandTest.java
org.eclipse.jgit/src/org/eclipse/jgit/api/CreateBranchCommand.java

index 2fe40b99ed4a26df7a5f7728fcf99be13a60c746..08f1fdfacf7a7c77d46239ab4acd845a1c418bd8 100644 (file)
@@ -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();
index 29baf4cd636e8ab479dd0be0f06e07888cdd70e6..ba6f3f11b4304a4ad3e7029b44deb79e109ca258 100644 (file)
@@ -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<Ref> {
 
        private SetupUpstreamMode upstreamMode;
 
-       private String startPoint = Constants.HEAD;
+       private String startPoint = HEAD;
 
        private RevCommit startCommit;
 
@@ -121,7 +124,7 @@ public class CreateBranchCommand extends GitCommand<Ref> {
                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<Ref> {
                                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<Ref> {
                                                        + 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<Ref> {
        }
 
        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 ? "<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
         *