diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/project/ProjectIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/project/ProjectIT.java index d2e70c3086..7de4712917 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/project/ProjectIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/project/ProjectIT.java @@ -44,6 +44,17 @@ public class ProjectIT extends AbstractDaemonTest { .name); } + @Test + public void createProjectFooWithGitSuffix() throws Exception { + String name = "foo"; + assertThat(name).isEqualTo( + gApi.projects() + .name(name + ".git") + .create() + .get() + .name); + } + @Test(expected = RestApiException.class) public void createProjectFooBar() throws Exception { ProjectInput in = new ProjectInput(); diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/CreateProjectIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/CreateProjectIT.java index a87e972d79..998c5ea450 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/CreateProjectIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/CreateProjectIT.java @@ -57,6 +57,17 @@ public class CreateProjectIT extends AbstractDaemonTest { assertHead(newProjectName, "refs/heads/master"); } + @Test + public void testCreateProjectApiWithGitSuffix() throws Exception { + final String newProjectName = "newProject"; + ProjectInfo p = gApi.projects().name(newProjectName + ".git").create().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 testCreateProject() throws Exception { final String newProjectName = "newProject"; @@ -70,6 +81,19 @@ public class CreateProjectIT extends AbstractDaemonTest { assertHead(newProjectName, "refs/heads/master"); } + @Test + public void testCreateProjectWithGitSuffix() throws Exception { + final String newProjectName = "newProject"; + RestResponse r = adminSession.put("/projects/" + newProjectName + ".git"); + assertThat(r.getStatusCode()).isEqualTo(HttpStatus.SC_CREATED); + ProjectInfo p = newGson().fromJson(r.getReader(), ProjectInfo.class); + 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 testCreateProjectWithNameMismatch_BadRequest() throws Exception { ProjectInput in = new ProjectInput(); diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/GetProjectIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/GetProjectIT.java new file mode 100644 index 0000000000..761e282189 --- /dev/null +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/GetProjectIT.java @@ -0,0 +1,51 @@ +// Copyright (C) 2015 The Android Open Source Project +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package com.google.gerrit.acceptance.rest.project; + +import static com.google.common.truth.Truth.assertThat; + +import com.google.gerrit.acceptance.AbstractDaemonTest; +import com.google.gerrit.acceptance.RestResponse; +import com.google.gerrit.extensions.common.ProjectInfo; + +import org.apache.http.HttpStatus; +import org.junit.Test; + +public class GetProjectIT extends AbstractDaemonTest { + + @Test + public void getProject() throws Exception { + String name = project.get(); + RestResponse r = adminSession.get("/projects/" + name); + assertThat(r.getStatusCode()).isEqualTo(HttpStatus.SC_OK); + ProjectInfo p = newGson().fromJson(r.getReader(), ProjectInfo.class); + assertThat(p.name).isEqualTo(name); + } + + @Test + public void getProjectWithGitSuffix() throws Exception { + String name = project.get(); + RestResponse r = adminSession.get("/projects/" + name + ".git"); + assertThat(r.getStatusCode()).isEqualTo(HttpStatus.SC_OK); + ProjectInfo p = newGson().fromJson(r.getReader(), ProjectInfo.class); + assertThat(p.name).isEqualTo(name); + } + + @Test + public void getProjectNotExisting() throws Exception { + RestResponse r = adminSession.get("/projects/does-not-exist"); + assertThat(r.getStatusCode()).isEqualTo(HttpStatus.SC_NOT_FOUND); + } +} diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectsCollection.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectsCollection.java index 519f4f21a8..2f0386fc91 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectsCollection.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectsCollection.java @@ -31,6 +31,8 @@ import com.google.inject.Singleton; import java.io.IOException; +import org.eclipse.jgit.lib.Constants; + @Singleton public class ProjectsCollection implements RestCollection, @@ -88,6 +90,9 @@ public class ProjectsCollection implements } private ProjectResource _parse(String id) throws IOException { + if (id.endsWith(Constants.DOT_GIT_EXT)) { + id = id.substring(0, id.length() - Constants.DOT_GIT_EXT.length()); + } ProjectControl ctl; try { ctl = controlFactory.controlFor(