diff options
author | Paladox none <thomasmulhall410@yahoo.com> | 2019-03-09 01:50:41 +0000 |
---|---|---|
committer | David Pursehouse <dpursehouse@collab.net> | 2019-03-09 15:24:06 +0900 |
commit | 09e31071c759c9f281e524bbf088f8cac26a8486 (patch) | |
tree | a5b472e8e5668cfcfd12ff0b40e15f0ec1153a38 | |
parent | 5d72078537c18d916945b45f08882c25cdb5d8c8 (diff) |
Strip trailing slash at the end when creating repos
Bug: Issue 7192
Change-Id: I1106899b8afb52f1cf04e46b87b6658f4664af09
5 files changed, 73 insertions, 8 deletions
diff --git a/java/com/google/gerrit/common/ProjectUtil.java b/java/com/google/gerrit/common/ProjectUtil.java index bfd5ef9294..e9d37818b9 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 56203702c3..b92fba8fe4 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 @@ public class CreateProject } 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 6abf102d65..ed317aadc9 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 @@ package com.google.gerrit.server.restapi.project; 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.Inject; 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 @@ public class ProjectsCollection @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 023c5407f6..97558c4a3a 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 @@ public class CreateProjectIT extends AbstractDaemonTest { } @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 e58317989d..0ce05b0d01 100644 --- a/javatests/com/google/gerrit/acceptance/ssh/CreateProjectIT.java +++ b/javatests/com/google/gerrit/acceptance/ssh/CreateProjectIT.java @@ -49,4 +49,38 @@ public class CreateProjectIT extends AbstractDaemonTest { 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); + } } |