Do not decode project name during filtering
The project name was assumed to be URL-encoded when passed
from the replication filtering API. The URL-decoding did not have any
side-effects for project names without special characters; however, it
caused projects to have a malformed name when it contained a '+'
which was decoded as a space.
Bug: Issue 15716
Change-Id: I4790bc6335706cbe9da66d14a8a6bdbd1a20cae2
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/validation/MultisiteReplicationPushFilter.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/validation/MultisiteReplicationPushFilter.java
index b85ec89..cbbc73c 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/multisite/validation/MultisiteReplicationPushFilter.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/validation/MultisiteReplicationPushFilter.java
@@ -62,7 +62,7 @@
public List<RemoteRefUpdate> filter(String projectName, List<RemoteRefUpdate> remoteUpdatesList) {
Set<String> outdatedChanges = new HashSet<>();
try (Repository repository =
- gitRepositoryManager.openRepository(Project.NameKey.parse(projectName))) {
+ gitRepositoryManager.openRepository(new Project.NameKey(projectName))) {
List<RemoteRefUpdate> filteredRefUpdates =
remoteUpdatesList.stream()
.filter(
diff --git a/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/dfsrefdb/MultisiteReplicationPushFilterTest.java b/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/dfsrefdb/MultisiteReplicationPushFilterTest.java
index d6b92e4..5c3bff1 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/dfsrefdb/MultisiteReplicationPushFilterTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/dfsrefdb/MultisiteReplicationPushFilterTest.java
@@ -22,6 +22,7 @@
import static org.mockito.Mockito.verify;
import com.google.gerrit.extensions.registration.DynamicItem;
+import com.google.gerrit.reviewdb.client.Project;
import com.google.gerrit.testing.InMemoryRepositoryManager;
import com.google.gerrit.testing.InMemoryTestEnvironment;
import com.google.inject.Inject;
@@ -59,14 +60,19 @@
@Inject private InMemoryRepositoryManager gitRepositoryManager;
- String project = A_TEST_PROJECT_NAME;
+ String project;
private TestRepository<InMemoryRepository> repo;
+ @Override
@Before
public void setUp() throws Exception {
- InMemoryRepository inMemoryRepo =
- gitRepositoryManager.createRepository(A_TEST_PROJECT_NAME_KEY);
+ setUp(A_TEST_PROJECT_NAME, A_TEST_PROJECT_NAME_KEY);
+ }
+
+ private void setUp(String projectName, Project.NameKey projectNameKey) throws Exception {
+ project = projectName;
+ InMemoryRepository inMemoryRepo = gitRepositoryManager.createRepository(projectNameKey);
repo = new TestRepository<>(inMemoryRepo);
}
@@ -143,6 +149,19 @@
assertThat(filteredRefUpdates).containsExactly(refUpToDate, refChangeUpToDate);
}
+ @Test
+ public void shouldFilterProjectNameEndingWithPlus() throws Exception {
+ setUp("testrepo+", new Project.NameKey("testrepo+"));
+ RemoteRefUpdate refUpdate = refUpdate("refs/heads/foo");
+ doReturn(true).when(sharedRefDatabaseMock).isUpToDate(eq(project), any());
+
+ MultisiteReplicationPushFilter pushFilter =
+ new MultisiteReplicationPushFilter(sharedRefDatabaseMock, gitRepositoryManager);
+ List<RemoteRefUpdate> filteredRefUpdates = pushFilter.filter(project, Arrays.asList(refUpdate));
+
+ assertThat(filteredRefUpdates).contains(refUpdate);
+ }
+
private SharedRefDatabaseWrapper newSharedRefDatabase(String... rejectedRefs) {
Set<String> rejectedSet = new HashSet<>();
rejectedSet.addAll(Arrays.asList(rejectedRefs));