Strip trailing slash at the end when creating repos
Bug: Issue 7192
Change-Id: I1106899b8afb52f1cf04e46b87b6658f4664af09
diff --git a/java/com/google/gerrit/common/ProjectUtil.java b/java/com/google/gerrit/common/ProjectUtil.java
index bfd5ef9..e9d3781 100644
--- a/java/com/google/gerrit/common/ProjectUtil.java
+++ b/java/com/google/gerrit/common/ProjectUtil.java
@@ -15,15 +15,26 @@
package com.google.gerrit.common;
public class ProjectUtil {
+ public static String sanitizeProjectName(String name) {
+ name = stripGitSuffix(name);
+ name = stripTrailingSlash(name);
+ return name;
+ }
+
public static String stripGitSuffix(String name) {
if (name.endsWith(".git")) {
// Be nice and drop the trailing ".git" suffix, which we never keep
// in our database, but clients might mistakenly provide anyway.
//
name = name.substring(0, name.length() - 4);
- while (name.endsWith("/")) {
- name = name.substring(0, name.length() - 1);
- }
+ name = stripTrailingSlash(name);
+ }
+ return name;
+ }
+
+ private static String stripTrailingSlash(String name) {
+ while (name.endsWith("/")) {
+ name = name.substring(0, name.length() - 1);
}
return name;
}
diff --git a/java/com/google/gerrit/server/restapi/project/CreateProject.java b/java/com/google/gerrit/server/restapi/project/CreateProject.java
index 5620370..b92fba8 100644
--- a/java/com/google/gerrit/server/restapi/project/CreateProject.java
+++ b/java/com/google/gerrit/server/restapi/project/CreateProject.java
@@ -168,7 +168,7 @@
}
CreateProjectArgs args = new CreateProjectArgs();
- args.setProjectName(ProjectUtil.stripGitSuffix(name));
+ args.setProjectName(ProjectUtil.sanitizeProjectName(name));
String parentName =
MoreObjects.firstNonNull(Strings.emptyToNull(input.parent), allProjects.get());
diff --git a/java/com/google/gerrit/server/restapi/project/ProjectsCollection.java b/java/com/google/gerrit/server/restapi/project/ProjectsCollection.java
index 6abf102..ed317aa 100644
--- a/java/com/google/gerrit/server/restapi/project/ProjectsCollection.java
+++ b/java/com/google/gerrit/server/restapi/project/ProjectsCollection.java
@@ -17,6 +17,7 @@
import com.google.common.collect.ListMultimap;
import com.google.common.flogger.FluentLogger;
import com.google.gerrit.common.Nullable;
+import com.google.gerrit.common.ProjectUtil;
import com.google.gerrit.extensions.registration.DynamicMap;
import com.google.gerrit.extensions.restapi.AuthException;
import com.google.gerrit.extensions.restapi.BadRequestException;
@@ -42,7 +43,6 @@
import com.google.inject.Provider;
import com.google.inject.Singleton;
import java.io.IOException;
-import org.eclipse.jgit.lib.Constants;
@Singleton
public class ProjectsCollection
@@ -136,9 +136,7 @@
@Nullable
private ProjectResource _parse(String id, boolean checkAccess)
throws IOException, PermissionBackendException, ResourceConflictException {
- if (id.endsWith(Constants.DOT_GIT_EXT)) {
- id = id.substring(0, id.length() - Constants.DOT_GIT_EXT.length());
- }
+ id = ProjectUtil.sanitizeProjectName(id);
Project.NameKey nameKey = new Project.NameKey(id);
ProjectState state = projectCache.checkedGet(nameKey);
diff --git a/javatests/com/google/gerrit/acceptance/rest/project/CreateProjectIT.java b/javatests/com/google/gerrit/acceptance/rest/project/CreateProjectIT.java
index 023c540..97558c4 100644
--- a/javatests/com/google/gerrit/acceptance/rest/project/CreateProjectIT.java
+++ b/javatests/com/google/gerrit/acceptance/rest/project/CreateProjectIT.java
@@ -178,6 +178,28 @@
}
@Test
+ public void createProjectThatEndsWithSlash() throws Exception {
+ String newProjectName = name("newProject");
+ ProjectInfo p = gApi.projects().create(newProjectName + "/").get();
+ assertThat(p.name).isEqualTo(newProjectName);
+ ProjectState projectState = projectCache.get(new Project.NameKey(newProjectName));
+ assertThat(projectState).isNotNull();
+ assertProjectInfo(projectState.getProject(), p);
+ assertHead(newProjectName, "refs/heads/master");
+ }
+
+ @Test
+ public void createProjectThatContainsSlash() throws Exception {
+ String newProjectName = name("newProject/newProject");
+ ProjectInfo p = gApi.projects().create(newProjectName).get();
+ assertThat(p.name).isEqualTo(newProjectName);
+ ProjectState projectState = projectCache.get(new Project.NameKey(newProjectName));
+ assertThat(projectState).isNotNull();
+ assertProjectInfo(projectState.getProject(), p);
+ assertHead(newProjectName, "refs/heads/master");
+ }
+
+ @Test
public void createProjectWithProperties() throws Exception {
String newProjectName = name("newProject");
ProjectInput in = new ProjectInput();
diff --git a/javatests/com/google/gerrit/acceptance/ssh/CreateProjectIT.java b/javatests/com/google/gerrit/acceptance/ssh/CreateProjectIT.java
index e583179..0ce05b0 100644
--- a/javatests/com/google/gerrit/acceptance/ssh/CreateProjectIT.java
+++ b/javatests/com/google/gerrit/acceptance/ssh/CreateProjectIT.java
@@ -49,4 +49,38 @@
ProjectState projectState = projectCache.get(new Project.NameKey(newProjectName));
assertThat(projectState).isNull();
}
+
+ @Test
+ public void withDotGit() throws Exception {
+ String newGroupName = "newGroup";
+ adminRestSession.put("/groups/" + newGroupName);
+ String newProjectName = name("newProject");
+ adminSshSession.exec(
+ "gerrit create-project --branch master --owner "
+ + newGroupName
+ + " "
+ + newProjectName
+ + ".git");
+ adminSshSession.assertSuccess();
+ ProjectState projectState = projectCache.get(new Project.NameKey(newProjectName));
+ assertThat(projectState).isNotNull();
+ assertThat(projectState.getName()).isEqualTo(newProjectName);
+ }
+
+ @Test
+ public void withTrailingSlash() throws Exception {
+ String newGroupName = "newGroup";
+ adminRestSession.put("/groups/" + newGroupName);
+ String newProjectName = name("newProject");
+ adminSshSession.exec(
+ "gerrit create-project --branch master --owner "
+ + newGroupName
+ + " "
+ + newProjectName
+ + "/");
+ adminSshSession.assertSuccess();
+ ProjectState projectState = projectCache.get(new Project.NameKey(newProjectName));
+ assertThat(projectState).isNotNull();
+ assertThat(projectState.getName()).isEqualTo(newProjectName);
+ }
}