diff options
Diffstat (limited to 'src/main/java/com/googlesource/gerrit/plugins/qtcodereview/QtCommandAdminChangeStatus.java')
-rw-r--r-- | src/main/java/com/googlesource/gerrit/plugins/qtcodereview/QtCommandAdminChangeStatus.java | 127 |
1 files changed, 127 insertions, 0 deletions
diff --git a/src/main/java/com/googlesource/gerrit/plugins/qtcodereview/QtCommandAdminChangeStatus.java b/src/main/java/com/googlesource/gerrit/plugins/qtcodereview/QtCommandAdminChangeStatus.java new file mode 100644 index 0000000..255e14e --- /dev/null +++ b/src/main/java/com/googlesource/gerrit/plugins/qtcodereview/QtCommandAdminChangeStatus.java @@ -0,0 +1,127 @@ +// +// Copyright (C) 2019 The Qt Company +// + +package com.googlesource.gerrit.plugins.qtcodereview; + +import com.google.common.flogger.FluentLogger; +import com.google.gerrit.common.data.GlobalCapability; +import com.google.gerrit.extensions.annotations.RequiresCapability; +import com.google.gerrit.extensions.restapi.RestApiException; +import com.google.gerrit.reviewdb.client.Change; +import com.google.gerrit.reviewdb.client.Project; +import com.google.gerrit.reviewdb.server.ReviewDb; +import com.google.gerrit.server.query.change.InternalChangeQuery; +import com.google.gerrit.server.query.change.ChangeData; +import com.google.gerrit.server.update.BatchUpdate; +import com.google.gerrit.server.update.UpdateException; +import com.google.gerrit.server.util.time.TimeUtil; +import com.google.gerrit.sshd.SshCommand; +import com.google.gerrit.sshd.CommandMetaData; +import com.google.gwtorm.server.OrmException; + +import com.google.inject.Inject; +import com.google.inject.Provider; + +import java.lang.NumberFormatException; +import java.util.List; + +import org.kohsuke.args4j.Option; + +@RequiresCapability(GlobalCapability.ADMINISTRATE_SERVER) +@CommandMetaData(name="change-status", description="Modify change status for admins. NOTE: This only affects change attribure. No real git merge or revert will be performed.") +class QtCommandAdminChangeStatus extends SshCommand { + + @Inject + private Provider<ReviewDb> dbProvider; + + @Inject + Provider<InternalChangeQuery> queryProvider; + + @Inject + private BatchUpdate.Factory updateFactory; + + @Inject + private QtChangeUpdateOp.Factory qtUpdateFactory; + + @Option(name = "--project", aliases = {"-p"}, + required = true, usage = "project name") + private String project; + + @Option(name = "--change-id", aliases = {"-c"}, + required = true, usage = "change id (numeric, like in web url)") + private String changeId; + + @Option(name = "--from", + required = true, usage = "new, staged, integrating, merged, abandoned, deferred") + private String fromStr; + + @Option(name = "--to", + required = true, usage = "new, staged, integrating, merged, abandoned, deferred") + private String toStr; + + private static final FluentLogger logger = FluentLogger.forEnclosingClass(); + + @Override + protected void run() throws UnloggedFailure { + logger.atInfo().log("qtcodereview: admin change-status start " + changeId); + + try { + Change.Status to = toStatus(toStr); + if (to == null) throw die("invalid to status"); + + Change.Status from = toStatus(fromStr); + if (from == null) throw die("invalid from status"); + + Change.Id id = Change.Id.parse(changeId); + if (id.get() == 0) throw die("invalid change-id"); + + InternalChangeQuery query = queryProvider.get(); + List<ChangeData> list = query.byLegacyChangeId(id); + if (list.isEmpty()) throw die("change not found"); + if (list.size() > 1) throw die("multiple changes found"); + ChangeData change = list.get(0); + + Project.NameKey projectKey = QtUtil.getProjectKey(project); + QtChangeUpdateOp op = qtUpdateFactory.create(to, null, null, null, null); + try (BatchUpdate u = updateFactory.create(dbProvider.get(), projectKey, user, TimeUtil.nowTs())) { + Change c = change.change(); + if (c.getStatus() == from) { + u.addOp(c.getId(), op); + u.execute(); + } else { + throw die("change status was not " + fromStr); + } + } + logger.atInfo().log("qtcodereview: admin change-status done"); + } catch(NumberFormatException e) { + throw die("change-id not numeric"); + } catch(OrmException e) { + logger.atSevere().log("qtcodereview: change-status error %s", e.getMessage()); + throw die("Database query failed"); + } catch (UpdateException | RestApiException e) { + logger.atSevere().log("qtcodereview: change-status error %s", e.getMessage()); + throw die("Database update failed"); + } + } + + private Change.Status toStatus(String str) { + switch (str) { + case "new": + return Change.Status.NEW; + case "staged": + return Change.Status.STAGED; + case "integrating": + return Change.Status.INTEGRATING; + case "merged": + return Change.Status.MERGED; + case "abandoned": + return Change.Status.ABANDONED; + case "deferred": + return Change.Status.DEFERRED; + default: + return null; + } + } + +} |