CreateProject: Don't remove description when setting plugin configs

When a project is created, and plugin configs are given in the input,
the project config endpoint is invoked on the newly created project
to set the plugin configs. As a side effect of this, because nothing
else is set in the config input, the description is removed (null means
remove it).

To fix this, explicitly also set the description on the config input.

Also add a test that exposes the issue.

Bug: Issue 11644
Change-Id: I9c2e370c783a29dfefd13215fcefd15747893ef5
This commit is contained in:
David Pursehouse
2019-10-01 17:31:35 +09:00
parent 47ed6c00f1
commit 2692403395
2 changed files with 40 additions and 0 deletions

View File

@@ -179,6 +179,7 @@ public class CreateProject
if (input.pluginConfigValues != null) { if (input.pluginConfigValues != null) {
ConfigInput in = new ConfigInput(); ConfigInput in = new ConfigInput();
in.pluginConfigValues = input.pluginConfigValues; in.pluginConfigValues = input.pluginConfigValues;
in.description = args.projectDescription;
putConfig.get().apply(projectState, in); putConfig.get().apply(projectState, in);
} }
return Response.created(json.format(projectState)); return Response.created(json.format(projectState));

View File

@@ -35,15 +35,18 @@ import com.google.gerrit.acceptance.testsuite.project.ProjectOperations;
import com.google.gerrit.acceptance.testsuite.request.RequestScopeOperations; import com.google.gerrit.acceptance.testsuite.request.RequestScopeOperations;
import com.google.gerrit.common.Nullable; import com.google.gerrit.common.Nullable;
import com.google.gerrit.common.data.Permission; import com.google.gerrit.common.data.Permission;
import com.google.gerrit.extensions.annotations.Exports;
import com.google.gerrit.extensions.api.projects.BranchInput; import com.google.gerrit.extensions.api.projects.BranchInput;
import com.google.gerrit.extensions.api.projects.CommentLinkInfo; import com.google.gerrit.extensions.api.projects.CommentLinkInfo;
import com.google.gerrit.extensions.api.projects.ConfigInfo; import com.google.gerrit.extensions.api.projects.ConfigInfo;
import com.google.gerrit.extensions.api.projects.ConfigInput; import com.google.gerrit.extensions.api.projects.ConfigInput;
import com.google.gerrit.extensions.api.projects.ConfigValue;
import com.google.gerrit.extensions.api.projects.DescriptionInput; import com.google.gerrit.extensions.api.projects.DescriptionInput;
import com.google.gerrit.extensions.api.projects.ProjectInput; import com.google.gerrit.extensions.api.projects.ProjectInput;
import com.google.gerrit.extensions.client.InheritableBoolean; import com.google.gerrit.extensions.client.InheritableBoolean;
import com.google.gerrit.extensions.client.ProjectState; import com.google.gerrit.extensions.client.ProjectState;
import com.google.gerrit.extensions.client.SubmitType; import com.google.gerrit.extensions.client.SubmitType;
import com.google.gerrit.extensions.common.ProjectInfo;
import com.google.gerrit.extensions.events.ProjectIndexedListener; import com.google.gerrit.extensions.events.ProjectIndexedListener;
import com.google.gerrit.extensions.registration.DynamicSet; import com.google.gerrit.extensions.registration.DynamicSet;
import com.google.gerrit.extensions.registration.RegistrationHandle; import com.google.gerrit.extensions.registration.RegistrationHandle;
@@ -53,10 +56,13 @@ import com.google.gerrit.extensions.restapi.ResourceConflictException;
import com.google.gerrit.extensions.restapi.UnprocessableEntityException; import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
import com.google.gerrit.reviewdb.client.Project; import com.google.gerrit.reviewdb.client.Project;
import com.google.gerrit.reviewdb.client.RefNames; import com.google.gerrit.reviewdb.client.RefNames;
import com.google.gerrit.server.config.ProjectConfigEntry;
import com.google.gerrit.server.group.SystemGroupBackend; import com.google.gerrit.server.group.SystemGroupBackend;
import com.google.gerrit.server.index.IndexExecutor; import com.google.gerrit.server.index.IndexExecutor;
import com.google.gerrit.server.project.CommentLinkInfoImpl; import com.google.gerrit.server.project.CommentLinkInfoImpl;
import com.google.inject.AbstractModule;
import com.google.inject.Inject; import com.google.inject.Inject;
import com.google.inject.Module;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import org.eclipse.jgit.revwalk.RevCommit; import org.eclipse.jgit.revwalk.RevCommit;
@@ -86,6 +92,18 @@ public class ProjectIT extends AbstractDaemonTest {
private ProjectIndexedCounter projectIndexedCounter; private ProjectIndexedCounter projectIndexedCounter;
private RegistrationHandle projectIndexedCounterHandle; private RegistrationHandle projectIndexedCounterHandle;
@Override
public Module createModule() {
return new AbstractModule() {
@Override
protected void configure() {
bind(ProjectConfigEntry.class)
.annotatedWith(Exports.named("test-plugin-key"))
.toInstance(new ProjectConfigEntry("Test Plugin Config Item", true));
}
};
}
@Before @Before
public void addProjectIndexedCounter() { public void addProjectIndexedCounter() {
projectIndexedCounter = new ProjectIndexedCounter(); projectIndexedCounter = new ProjectIndexedCounter();
@@ -161,6 +179,17 @@ public class ProjectIT extends AbstractDaemonTest {
eventRecorder.assertRefUpdatedEvents(name, "refs/heads/master", null, head); eventRecorder.assertRefUpdatedEvents(name, "refs/heads/master", null, head);
} }
@Test
public void createProjectWithPluginConfigs() throws Exception {
String name = name("foo");
ProjectInput input = new ProjectInput();
input.name = name;
input.description = "foo description";
input.pluginConfigValues = newPluginConfigValues();
ProjectInfo info = gApi.projects().create(input).get();
assertThat(info.description).isEqualTo(input.description);
}
@Test @Test
public void createProjectWithMismatchedInput() throws Exception { public void createProjectWithMismatchedInput() throws Exception {
ProjectInput in = new ProjectInput(); ProjectInput in = new ProjectInput();
@@ -683,6 +712,16 @@ public class ProjectIT extends AbstractDaemonTest {
return setConfig(name, input); return setConfig(name, input);
} }
private static Map<String, Map<String, ConfigValue>> newPluginConfigValues() {
Map<String, Map<String, ConfigValue>> pluginConfigValues = new HashMap<>();
Map<String, ConfigValue> configValues = new HashMap<>();
ConfigValue value = new ConfigValue();
value.value = "true";
configValues.put("test-plugin-key", value);
pluginConfigValues.put("gerrit", configValues);
return pluginConfigValues;
}
private static class ProjectIndexedCounter implements ProjectIndexedListener { private static class ProjectIndexedCounter implements ProjectIndexedListener {
private final AtomicLongMap<String> countsByProject = AtomicLongMap.create(); private final AtomicLongMap<String> countsByProject = AtomicLongMap.create();