Make compatible with Gerrit stable-3.3 branch
In I2379e28b4 `ProjectLevelConfig`'s inheritence was changed to not
extend `VersionedMetaData`. As a result it no longer has a `.commit()`
method on it.
Instead, read the config directly from the git repo and manipulate it
there. This probably makes some subtle cache bugs go away as a side
effect, but it likely isn't important since it would only matter in a
high contention service user creation situation. Such a situation is
difficult to imagine.
Change-Id: I4c7c94dd4db189c4a5e818ac184ddb2c318ebcb4
diff --git a/WORKSPACE b/WORKSPACE
index a8d8194..33be205 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -3,7 +3,7 @@
load("//:bazlets.bzl", "load_bazlets")
load_bazlets(
- commit = "0f81174e3d1b892a1342ebc75bb4bbb158ae0efe",
+ commit = "a511f3c90129d7de7ae67c0637001162980c08d5",
#local_path = "/home/<user>/projects/bazlets",
)
@@ -12,4 +12,4 @@
"gerrit_api",
)
-gerrit_api(version = "3.3.0-SNAPSHOT")
+gerrit_api(version = "3.3.2-SNAPSHOT")
diff --git a/src/main/java/com/googlesource/gerrit/plugins/serviceuser/CreateServiceUser.java b/src/main/java/com/googlesource/gerrit/plugins/serviceuser/CreateServiceUser.java
index 50fc6a0..defb457 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/serviceuser/CreateServiceUser.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/serviceuser/CreateServiceUser.java
@@ -78,12 +78,12 @@
}
private final PluginConfig cfg;
+ private final String pluginName;
private final CreateAccount createAccount;
private final List<String> blockedNames;
private final Provider<CurrentUser> userProvider;
private final MetaDataUpdate.User metaDataUpdateFactory;
private final Project.NameKey allProjects;
- private final ProjectLevelConfig storage;
private final DateFormat rfc2822DateFormatter;
private final Provider<GetConfig> getConfig;
private final AccountLoader.Factory accountLoader;
@@ -100,6 +100,7 @@
Provider<GetConfig> getConfig,
AccountLoader.Factory accountLoader) {
this.cfg = cfgFactory.getFromGerritConfig(pluginName);
+ this.pluginName = pluginName;
this.createAccount = createAccount;
this.blockedNames =
Lists.transform(
@@ -112,7 +113,6 @@
});
this.userProvider = userProvider;
this.metaDataUpdateFactory = metaDataUpdateFactory;
- this.storage = projectCache.getAllProjects().getConfig(pluginName + ".db");
this.allProjects = projectCache.getAllProjects().getProject().getNameKey();
this.rfc2822DateFormatter = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss Z", Locale.US);
this.rfc2822DateFormatter.setCalendar(
@@ -178,16 +178,20 @@
Account.Id creatorId = ((IdentifiedUser) user).getAccountId();
String creationDate = rfc2822DateFormatter.format(new Date());
- Config db = storage.get();
- db.setInt(USER, username, KEY_CREATOR_ID, creatorId.get());
- if (creator != null) {
- db.setString(USER, username, KEY_CREATED_BY, creator);
- }
- db.setString(USER, username, KEY_CREATED_AT, creationDate);
+ try (MetaDataUpdate md = metaDataUpdateFactory.create(allProjects)) {
+ ProjectLevelConfig.Bare update = new ProjectLevelConfig.Bare(pluginName + ".db");
+ update.load(md);
- MetaDataUpdate md = metaDataUpdateFactory.create(allProjects);
- md.setMessage("Create service user '" + username + "'\n");
- storage.commit(md);
+ Config db = update.getConfig();
+ db.setInt(USER, username, KEY_CREATOR_ID, creatorId.get());
+ if (creator != null) {
+ db.setString(USER, username, KEY_CREATED_BY, creator);
+ }
+ db.setString(USER, username, KEY_CREATED_AT, creationDate);
+
+ md.setMessage("Create service user '" + username + "'\n");
+ update.commit(md);
+ }
ServiceUserInfo info = new ServiceUserInfo(response);
AccountLoader al = accountLoader.create(true);
info.createdBy = al.get(creatorId);
diff --git a/src/main/java/com/googlesource/gerrit/plugins/serviceuser/PutOwner.java b/src/main/java/com/googlesource/gerrit/plugins/serviceuser/PutOwner.java
index eb7dbc0..065e2ea 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/serviceuser/PutOwner.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/serviceuser/PutOwner.java
@@ -47,6 +47,7 @@
import com.google.inject.Singleton;
import com.googlesource.gerrit.plugins.serviceuser.PutOwner.Input;
import java.io.IOException;
+import org.eclipse.jgit.errors.ConfigInvalidException;
import org.eclipse.jgit.lib.Config;
@Singleton
@@ -58,7 +59,6 @@
private final Provider<GetConfig> getConfig;
private final GroupsCollection groups;
private final String pluginName;
- private final ProjectCache projectCache;
private final Project.NameKey allProjects;
private final MetaDataUpdate.User metaDataUpdateFactory;
private final GroupJson json;
@@ -78,7 +78,6 @@
this.getConfig = getConfig;
this.groups = groups;
this.pluginName = pluginName;
- this.projectCache = projectCache;
this.allProjects = projectCache.getAllProjects().getProject().getNameKey();
this.metaDataUpdateFactory = metaDataUpdateFactory;
this.json = json;
@@ -89,7 +88,6 @@
@Override
public Response<GroupInfo> apply(ServiceUserResource rsrc, Input input)
throws RestApiException, IOException, PermissionBackendException {
- ProjectLevelConfig storage = projectCache.getAllProjects().getConfig(pluginName + ".db");
Boolean ownerAllowed;
try {
ownerAllowed = getConfig.get().apply(new ConfigResource()).value().allowOwner;
@@ -103,22 +101,32 @@
if (input == null) {
input = new Input();
}
- Config db = storage.get();
- String oldGroup = db.getString(USER, rsrc.getUser().getUserName().get(), KEY_OWNER);
+
GroupDescription.Basic group = null;
- if (Strings.isNullOrEmpty(input.group)) {
- db.unset(USER, rsrc.getUser().getUserName().get(), KEY_OWNER);
- } else {
- group = groups.parse(TopLevelResource.INSTANCE, IdString.fromDecoded(input.group)).getGroup();
- UUID groupUUID = group.getGroupUUID();
- if (!AccountGroup.uuid(groupUUID.get()).isInternalGroup()) {
- throw new MethodNotAllowedException("Group with UUID '" + groupUUID + "' is external");
+ String oldGroup;
+ try (MetaDataUpdate md = metaDataUpdateFactory.create(allProjects)) {
+ ProjectLevelConfig.Bare update = new ProjectLevelConfig.Bare(pluginName + ".db");
+ update.load(md);
+
+ Config db = update.getConfig();
+ oldGroup = db.getString(USER, rsrc.getUser().getUserName().get(), KEY_OWNER);
+ if (Strings.isNullOrEmpty(input.group)) {
+ db.unset(USER, rsrc.getUser().getUserName().get(), KEY_OWNER);
+ } else {
+ group =
+ groups.parse(TopLevelResource.INSTANCE, IdString.fromDecoded(input.group)).getGroup();
+ UUID groupUUID = group.getGroupUUID();
+ if (!AccountGroup.uuid(groupUUID.get()).isInternalGroup()) {
+ throw new MethodNotAllowedException("Group with UUID '" + groupUUID + "' is external");
+ }
+ db.setString(USER, rsrc.getUser().getUserName().get(), KEY_OWNER, groupUUID.get());
}
- db.setString(USER, rsrc.getUser().getUserName().get(), KEY_OWNER, groupUUID.get());
+ md.setMessage("Set owner for service user '" + rsrc.getUser().getUserName() + "'\n");
+ update.commit(md);
+ } catch (ConfigInvalidException e) {
+ throw asRestApiException("Invalid configuration", e);
}
- MetaDataUpdate md = metaDataUpdateFactory.create(allProjects);
- md.setMessage("Set owner for service user '" + rsrc.getUser().getUserName() + "'\n");
- storage.commit(md);
+
return group != null
? (oldGroup != null
? Response.ok(json.format(group))