summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthias Sohn <matthias.sohn@sap.com>2018-06-08 17:45:00 +0200
committerMatthias Sohn <matthias.sohn@sap.com>2018-06-09 01:20:13 +0200
commit62460b42b7a64513e3421aae17082fdc923faf95 (patch)
tree9a09ec56d6e9bd87c734d5606333bbd2298a5691
parent5f27032fb85694a093f827581216d4ffb99db68b (diff)
downloadjgit-62460b42b7a64513e3421aae17082fdc923faf95.tar.gz
jgit-62460b42b7a64513e3421aae17082fdc923faf95.zip
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 <matthias.sohn@sap.com>
-rw-r--r--org.eclipse.jgit.test/tst/org/eclipse/jgit/api/BranchCommandTest.java12
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/api/CreateBranchCommand.java32
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<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,17 +282,34 @@ 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
*
* @param name