Convert most revision modify views to retrying helper

Change-Id: I4e24beb1ef38831633a3e8945ba8cbff55c8226c
This commit is contained in:
Dave Borowitz
2017-05-02 12:40:02 -04:00
parent ae52afc058
commit 3c23f1dd79
10 changed files with 78 additions and 51 deletions

View File

@@ -380,7 +380,7 @@ public class CommentsIT extends AbstractDaemonTest {
ChangeResource changeRsrc = ChangeResource changeRsrc =
changes.get().parse(TopLevelResource.INSTANCE, IdString.fromDecoded(changeId)); changes.get().parse(TopLevelResource.INSTANCE, IdString.fromDecoded(changeId));
RevisionResource revRsrc = revisions.parse(changeRsrc, IdString.fromDecoded(revId)); RevisionResource revRsrc = revisions.parse(changeRsrc, IdString.fromDecoded(revId));
postReview.get().apply(revRsrc, input, timestamp); postReview.get().apply(batchUpdateFactory, revRsrc, input, timestamp);
Map<String, List<CommentInfo>> result = getPublishedComments(changeId, revId); Map<String, List<CommentInfo>> result = getPublishedComments(changeId, revId);
assertThat(result).isNotEmpty(); assertThat(result).isNotEmpty();
CommentInfo actual = Iterables.getOnlyElement(result.get(comment.path)); CommentInfo actual = Iterables.getOnlyElement(result.get(comment.path));

View File

@@ -752,7 +752,7 @@ public class ChangeRebuilderIT extends AbstractDaemonTest {
assertThat(ts).isGreaterThan(c.getCreatedOn()); assertThat(ts).isGreaterThan(c.getCreatedOn());
assertThat(ts).isLessThan(db.patchSets().get(psId).getCreatedOn()); assertThat(ts).isLessThan(db.patchSets().get(psId).getCreatedOn());
RevisionResource revRsrc = parseCurrentRevisionResource(r.getChangeId()); RevisionResource revRsrc = parseCurrentRevisionResource(r.getChangeId());
postReview.get().apply(revRsrc, rin, ts); postReview.get().apply(batchUpdateFactory, revRsrc, rin, ts);
checker.rebuildAndCheckChanges(id); checker.rebuildAndCheckChanges(id);
} }
@@ -770,7 +770,7 @@ public class ChangeRebuilderIT extends AbstractDaemonTest {
Timestamp ts = new Timestamp(c.getCreatedOn().getTime() - 10000); Timestamp ts = new Timestamp(c.getCreatedOn().getTime() - 10000);
RevisionResource revRsrc = parseCurrentRevisionResource(r.getChangeId()); RevisionResource revRsrc = parseCurrentRevisionResource(r.getChangeId());
setApiUser(user); setApiUser(user);
postReview.get().apply(revRsrc, rin, ts); postReview.get().apply(batchUpdateFactory, revRsrc, rin, ts);
checker.rebuildAndCheckChanges(id); checker.rebuildAndCheckChanges(id);
} }

View File

@@ -224,6 +224,8 @@ class RevisionApiImpl implements RevisionApi {
@Override @Override
public void submit(SubmitInput in) throws RestApiException { public void submit(SubmitInput in) throws RestApiException {
try { try {
// TODO(dborowitz): Convert to RetryingRestModifyHandler. Requires converting MergeOp to a
// Factory that takes BatchUpdate.Factory. (Enough Factories yet?)
submit.apply(revision, in); submit.apply(revision, in);
} catch (Exception e) { } catch (Exception e) {
throw asRestApiException("Cannot submit change", e); throw asRestApiException("Cannot submit change", e);
@@ -238,6 +240,8 @@ class RevisionApiImpl implements RevisionApi {
@Override @Override
public BinaryResult submitPreview(String format) throws RestApiException { public BinaryResult submitPreview(String format) throws RestApiException {
try { try {
// TODO(dborowitz): Convert to RetryingRestModifyHandler. Requires converting MergeOp to a
// Factory that takes BatchUpdate.Factory.
submitPreview.setFormat(format); submitPreview.setFormat(format);
return submitPreview.apply(revision); return submitPreview.apply(revision);
} catch (Exception e) { } catch (Exception e) {

View File

@@ -21,7 +21,6 @@ import com.google.gerrit.extensions.restapi.AuthException;
import com.google.gerrit.extensions.restapi.BadRequestException; import com.google.gerrit.extensions.restapi.BadRequestException;
import com.google.gerrit.extensions.restapi.ResourceConflictException; import com.google.gerrit.extensions.restapi.ResourceConflictException;
import com.google.gerrit.extensions.restapi.RestApiException; import com.google.gerrit.extensions.restapi.RestApiException;
import com.google.gerrit.extensions.restapi.RestModifyView;
import com.google.gerrit.extensions.webui.UiAction; import com.google.gerrit.extensions.webui.UiAction;
import com.google.gerrit.reviewdb.client.Change; import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.reviewdb.client.RefNames; import com.google.gerrit.reviewdb.client.RefNames;
@@ -32,6 +31,9 @@ import com.google.gerrit.server.project.InvalidChangeOperationException;
import com.google.gerrit.server.project.NoSuchChangeException; import com.google.gerrit.server.project.NoSuchChangeException;
import com.google.gerrit.server.project.ProjectControl; import com.google.gerrit.server.project.ProjectControl;
import com.google.gerrit.server.project.RefControl; import com.google.gerrit.server.project.RefControl;
import com.google.gerrit.server.update.BatchUpdate;
import com.google.gerrit.server.update.RetryHelper;
import com.google.gerrit.server.update.RetryingRestModifyView;
import com.google.gerrit.server.update.UpdateException; import com.google.gerrit.server.update.UpdateException;
import com.google.gwtorm.server.OrmException; import com.google.gwtorm.server.OrmException;
import com.google.inject.Inject; import com.google.inject.Inject;
@@ -41,21 +43,27 @@ import java.io.IOException;
@Singleton @Singleton
public class CherryPick public class CherryPick
implements RestModifyView<RevisionResource, CherryPickInput>, UiAction<RevisionResource> { extends RetryingRestModifyView<RevisionResource, CherryPickInput, ChangeInfo>
implements UiAction<RevisionResource> {
private final Provider<ReviewDb> dbProvider; private final Provider<ReviewDb> dbProvider;
private final CherryPickChange cherryPickChange; private final CherryPickChange cherryPickChange;
private final ChangeJson.Factory json; private final ChangeJson.Factory json;
@Inject @Inject
CherryPick( CherryPick(
Provider<ReviewDb> dbProvider, CherryPickChange cherryPickChange, ChangeJson.Factory json) { RetryHelper retryHelper,
Provider<ReviewDb> dbProvider,
CherryPickChange cherryPickChange,
ChangeJson.Factory json) {
super(retryHelper);
this.dbProvider = dbProvider; this.dbProvider = dbProvider;
this.cherryPickChange = cherryPickChange; this.cherryPickChange = cherryPickChange;
this.json = json; this.json = json;
} }
@Override @Override
public ChangeInfo apply(RevisionResource revision, CherryPickInput input) protected ChangeInfo applyImpl(
BatchUpdate.Factory updateFactory, RevisionResource revision, CherryPickInput input)
throws OrmException, IOException, UpdateException, RestApiException { throws OrmException, IOException, UpdateException, RestApiException {
final ChangeControl control = revision.getControl(); final ChangeControl control = revision.getControl();
int parent = input.parent == null ? 1 : input.parent; int parent = input.parent == null ? 1 : input.parent;
@@ -88,6 +96,7 @@ public class CherryPick
try { try {
Change.Id cherryPickedChangeId = Change.Id cherryPickedChangeId =
// TODO(dborowitz): Pass updateFactory here.
cherryPickChange.cherryPick( cherryPickChange.cherryPick(
revision.getChange(), revision.getChange(),
revision.getPatchSet(), revision.getPatchSet(),

View File

@@ -24,7 +24,6 @@ import com.google.gerrit.extensions.restapi.BadRequestException;
import com.google.gerrit.extensions.restapi.ResourceNotFoundException; import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
import com.google.gerrit.extensions.restapi.Response; import com.google.gerrit.extensions.restapi.Response;
import com.google.gerrit.extensions.restapi.RestApiException; import com.google.gerrit.extensions.restapi.RestApiException;
import com.google.gerrit.extensions.restapi.RestModifyView;
import com.google.gerrit.extensions.restapi.UnprocessableEntityException; import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
import com.google.gerrit.extensions.restapi.Url; import com.google.gerrit.extensions.restapi.Url;
import com.google.gerrit.reviewdb.client.Comment; import com.google.gerrit.reviewdb.client.Comment;
@@ -37,6 +36,8 @@ import com.google.gerrit.server.patch.PatchListCache;
import com.google.gerrit.server.update.BatchUpdate; import com.google.gerrit.server.update.BatchUpdate;
import com.google.gerrit.server.update.BatchUpdateOp; import com.google.gerrit.server.update.BatchUpdateOp;
import com.google.gerrit.server.update.ChangeContext; import com.google.gerrit.server.update.ChangeContext;
import com.google.gerrit.server.update.RetryHelper;
import com.google.gerrit.server.update.RetryingRestModifyView;
import com.google.gerrit.server.update.UpdateException; import com.google.gerrit.server.update.UpdateException;
import com.google.gwtorm.server.OrmException; import com.google.gwtorm.server.OrmException;
import com.google.inject.Inject; import com.google.inject.Inject;
@@ -45,9 +46,9 @@ import com.google.inject.Singleton;
import java.util.Collections; import java.util.Collections;
@Singleton @Singleton
public class CreateDraftComment implements RestModifyView<RevisionResource, DraftInput> { public class CreateDraftComment
extends RetryingRestModifyView<RevisionResource, DraftInput, Response<CommentInfo>> {
private final Provider<ReviewDb> db; private final Provider<ReviewDb> db;
private final BatchUpdate.Factory updateFactory;
private final Provider<CommentJson> commentJson; private final Provider<CommentJson> commentJson;
private final CommentsUtil commentsUtil; private final CommentsUtil commentsUtil;
private final PatchSetUtil psUtil; private final PatchSetUtil psUtil;
@@ -56,13 +57,13 @@ public class CreateDraftComment implements RestModifyView<RevisionResource, Draf
@Inject @Inject
CreateDraftComment( CreateDraftComment(
Provider<ReviewDb> db, Provider<ReviewDb> db,
BatchUpdate.Factory updateFactory, RetryHelper retryHelper,
Provider<CommentJson> commentJson, Provider<CommentJson> commentJson,
CommentsUtil commentsUtil, CommentsUtil commentsUtil,
PatchSetUtil psUtil, PatchSetUtil psUtil,
PatchListCache patchListCache) { PatchListCache patchListCache) {
super(retryHelper);
this.db = db; this.db = db;
this.updateFactory = updateFactory;
this.commentJson = commentJson; this.commentJson = commentJson;
this.commentsUtil = commentsUtil; this.commentsUtil = commentsUtil;
this.psUtil = psUtil; this.psUtil = psUtil;
@@ -70,7 +71,8 @@ public class CreateDraftComment implements RestModifyView<RevisionResource, Draf
} }
@Override @Override
public Response<CommentInfo> apply(RevisionResource rsrc, DraftInput in) protected Response<CommentInfo> applyImpl(
BatchUpdate.Factory updateFactory, RevisionResource rsrc, DraftInput in)
throws RestApiException, UpdateException, OrmException { throws RestApiException, UpdateException, OrmException {
if (Strings.isNullOrEmpty(in.path)) { if (Strings.isNullOrEmpty(in.path)) {
throw new BadRequestException("path must be non-empty"); throw new BadRequestException("path must be non-empty");

View File

@@ -24,7 +24,6 @@ import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
import com.google.gerrit.extensions.restapi.ResourceConflictException; import com.google.gerrit.extensions.restapi.ResourceConflictException;
import com.google.gerrit.extensions.restapi.Response; import com.google.gerrit.extensions.restapi.Response;
import com.google.gerrit.extensions.restapi.RestApiException; import com.google.gerrit.extensions.restapi.RestApiException;
import com.google.gerrit.extensions.restapi.RestModifyView;
import com.google.gerrit.extensions.webui.UiAction; import com.google.gerrit.extensions.webui.UiAction;
import com.google.gerrit.reviewdb.client.Change; import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.reviewdb.client.PatchSet; import com.google.gerrit.reviewdb.client.PatchSet;
@@ -43,6 +42,8 @@ import com.google.gerrit.server.update.BatchUpdateOp;
import com.google.gerrit.server.update.ChangeContext; import com.google.gerrit.server.update.ChangeContext;
import com.google.gerrit.server.update.Order; import com.google.gerrit.server.update.Order;
import com.google.gerrit.server.update.RepoContext; import com.google.gerrit.server.update.RepoContext;
import com.google.gerrit.server.update.RetryHelper;
import com.google.gerrit.server.update.RetryingRestModifyView;
import com.google.gerrit.server.update.UpdateException; import com.google.gerrit.server.update.UpdateException;
import com.google.gwtorm.server.OrmException; import com.google.gwtorm.server.OrmException;
import com.google.inject.Inject; import com.google.inject.Inject;
@@ -56,11 +57,11 @@ import org.eclipse.jgit.lib.ObjectId;
@Singleton @Singleton
public class DeleteDraftPatchSet public class DeleteDraftPatchSet
implements RestModifyView<RevisionResource, Input>, UiAction<RevisionResource> { extends RetryingRestModifyView<RevisionResource, Input, Response<?>>
implements UiAction<RevisionResource> {
public static class Input {} public static class Input {}
private final Provider<ReviewDb> db; private final Provider<ReviewDb> db;
private final BatchUpdate.Factory updateFactory;
private final PatchSetInfoFactory patchSetInfoFactory; private final PatchSetInfoFactory patchSetInfoFactory;
private final PatchSetUtil psUtil; private final PatchSetUtil psUtil;
private final Provider<DeleteChangeOp> deleteChangeOpProvider; private final Provider<DeleteChangeOp> deleteChangeOpProvider;
@@ -70,14 +71,14 @@ public class DeleteDraftPatchSet
@Inject @Inject
public DeleteDraftPatchSet( public DeleteDraftPatchSet(
Provider<ReviewDb> db, Provider<ReviewDb> db,
BatchUpdate.Factory updateFactory, RetryHelper retryHelper,
PatchSetInfoFactory patchSetInfoFactory, PatchSetInfoFactory patchSetInfoFactory,
PatchSetUtil psUtil, PatchSetUtil psUtil,
Provider<DeleteChangeOp> deleteChangeOpProvider, Provider<DeleteChangeOp> deleteChangeOpProvider,
DynamicItem<AccountPatchReviewStore> accountPatchReviewStore, DynamicItem<AccountPatchReviewStore> accountPatchReviewStore,
@GerritServerConfig Config cfg) { @GerritServerConfig Config cfg) {
super(retryHelper);
this.db = db; this.db = db;
this.updateFactory = updateFactory;
this.patchSetInfoFactory = patchSetInfoFactory; this.patchSetInfoFactory = patchSetInfoFactory;
this.psUtil = psUtil; this.psUtil = psUtil;
this.deleteChangeOpProvider = deleteChangeOpProvider; this.deleteChangeOpProvider = deleteChangeOpProvider;
@@ -86,7 +87,8 @@ public class DeleteDraftPatchSet
} }
@Override @Override
public Response<?> apply(RevisionResource rsrc, Input input) protected Response<?> applyImpl(
BatchUpdate.Factory updateFactory, RevisionResource rsrc, Input input)
throws RestApiException, UpdateException, OrmException, PermissionBackendException { throws RestApiException, UpdateException, OrmException, PermissionBackendException {
if (isDeletingOnlyPatchSet(rsrc)) { if (isDeletingOnlyPatchSet(rsrc)) {
// A change cannot have zero patch sets; the change is deleted instead. // A change cannot have zero patch sets; the change is deleted instead.

View File

@@ -61,7 +61,6 @@ import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
import com.google.gerrit.extensions.restapi.ResourceConflictException; import com.google.gerrit.extensions.restapi.ResourceConflictException;
import com.google.gerrit.extensions.restapi.Response; import com.google.gerrit.extensions.restapi.Response;
import com.google.gerrit.extensions.restapi.RestApiException; import com.google.gerrit.extensions.restapi.RestApiException;
import com.google.gerrit.extensions.restapi.RestModifyView;
import com.google.gerrit.extensions.restapi.UnprocessableEntityException; import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
import com.google.gerrit.extensions.restapi.Url; import com.google.gerrit.extensions.restapi.Url;
import com.google.gerrit.reviewdb.client.Account; import com.google.gerrit.reviewdb.client.Account;
@@ -101,10 +100,11 @@ import com.google.gerrit.server.permissions.PermissionBackendException;
import com.google.gerrit.server.project.ChangeControl; import com.google.gerrit.server.project.ChangeControl;
import com.google.gerrit.server.query.change.ChangeData; import com.google.gerrit.server.query.change.ChangeData;
import com.google.gerrit.server.update.BatchUpdate; import com.google.gerrit.server.update.BatchUpdate;
import com.google.gerrit.server.update.BatchUpdate.Factory;
import com.google.gerrit.server.update.BatchUpdateOp; import com.google.gerrit.server.update.BatchUpdateOp;
import com.google.gerrit.server.update.ChangeContext; import com.google.gerrit.server.update.ChangeContext;
import com.google.gerrit.server.update.Context; import com.google.gerrit.server.update.Context;
import com.google.gerrit.server.update.RetryHelper;
import com.google.gerrit.server.update.RetryingRestModifyView;
import com.google.gerrit.server.update.UpdateException; import com.google.gerrit.server.update.UpdateException;
import com.google.gerrit.server.util.LabelVote; import com.google.gerrit.server.util.LabelVote;
import com.google.gson.Gson; import com.google.gson.Gson;
@@ -131,13 +131,13 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@Singleton @Singleton
public class PostReview implements RestModifyView<RevisionResource, ReviewInput> { public class PostReview
extends RetryingRestModifyView<RevisionResource, ReviewInput, Response<ReviewResult>> {
private static final Logger log = LoggerFactory.getLogger(PostReview.class); private static final Logger log = LoggerFactory.getLogger(PostReview.class);
private static final Gson GSON = OutputFormat.JSON_COMPACT.newGson(); private static final Gson GSON = OutputFormat.JSON_COMPACT.newGson();
private static final int DEFAULT_ROBOT_COMMENT_SIZE_LIMIT_IN_BYTES = 1024 * 1024; private static final int DEFAULT_ROBOT_COMMENT_SIZE_LIMIT_IN_BYTES = 1024 * 1024;
private final Provider<ReviewDb> db; private final Provider<ReviewDb> db;
private final BatchUpdate.Factory batchUpdateFactory;
private final ChangesCollection changes; private final ChangesCollection changes;
private final ChangeData.Factory changeDataFactory; private final ChangeData.Factory changeDataFactory;
private final ApprovalsUtil approvalsUtil; private final ApprovalsUtil approvalsUtil;
@@ -156,7 +156,7 @@ public class PostReview implements RestModifyView<RevisionResource, ReviewInput>
@Inject @Inject
PostReview( PostReview(
Provider<ReviewDb> db, Provider<ReviewDb> db,
Factory batchUpdateFactory, RetryHelper retryHelper,
ChangesCollection changes, ChangesCollection changes,
ChangeData.Factory changeDataFactory, ChangeData.Factory changeDataFactory,
ApprovalsUtil approvalsUtil, ApprovalsUtil approvalsUtil,
@@ -171,8 +171,8 @@ public class PostReview implements RestModifyView<RevisionResource, ReviewInput>
NotesMigration migration, NotesMigration migration,
NotifyUtil notifyUtil, NotifyUtil notifyUtil,
@GerritServerConfig Config gerritConfig) { @GerritServerConfig Config gerritConfig) {
super(retryHelper);
this.db = db; this.db = db;
this.batchUpdateFactory = batchUpdateFactory;
this.changes = changes; this.changes = changes;
this.changeDataFactory = changeDataFactory; this.changeDataFactory = changeDataFactory;
this.commentsUtil = commentsUtil; this.commentsUtil = commentsUtil;
@@ -190,13 +190,15 @@ public class PostReview implements RestModifyView<RevisionResource, ReviewInput>
} }
@Override @Override
public Response<ReviewResult> apply(RevisionResource revision, ReviewInput input) protected Response<ReviewResult> applyImpl(
BatchUpdate.Factory updateFactory, RevisionResource revision, ReviewInput input)
throws RestApiException, UpdateException, OrmException, IOException, throws RestApiException, UpdateException, OrmException, IOException,
PermissionBackendException { PermissionBackendException {
return apply(revision, input, TimeUtil.nowTs()); return apply(updateFactory, revision, input, TimeUtil.nowTs());
} }
public Response<ReviewResult> apply(RevisionResource revision, ReviewInput input, Timestamp ts) public Response<ReviewResult> apply(
BatchUpdate.Factory updateFactory, RevisionResource revision, ReviewInput input, Timestamp ts)
throws RestApiException, UpdateException, OrmException, IOException, throws RestApiException, UpdateException, OrmException, IOException,
PermissionBackendException { PermissionBackendException {
// Respect timestamp, but truncate at change created-on time. // Respect timestamp, but truncate at change created-on time.
@@ -264,8 +266,7 @@ public class PostReview implements RestModifyView<RevisionResource, ReviewInput>
output.labels = input.labels; output.labels = input.labels;
try (BatchUpdate bu = try (BatchUpdate bu =
batchUpdateFactory.create( updateFactory.create(db.get(), revision.getChange().getProject(), revision.getUser(), ts)) {
db.get(), revision.getChange().getProject(), revision.getUser(), ts)) {
Account.Id id = revision.getUser().getAccountId(); Account.Id id = revision.getUser().getAccountId();
boolean ccOrReviewer = false; boolean ccOrReviewer = false;
if (input.labels != null && !input.labels.isEmpty()) { if (input.labels != null && !input.labels.isEmpty()) {

View File

@@ -25,7 +25,6 @@ import com.google.gerrit.extensions.restapi.ResourceConflictException;
import com.google.gerrit.extensions.restapi.ResourceNotFoundException; import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
import com.google.gerrit.extensions.restapi.Response; import com.google.gerrit.extensions.restapi.Response;
import com.google.gerrit.extensions.restapi.RestApiException; import com.google.gerrit.extensions.restapi.RestApiException;
import com.google.gerrit.extensions.restapi.RestModifyView;
import com.google.gerrit.extensions.webui.UiAction; import com.google.gerrit.extensions.webui.UiAction;
import com.google.gerrit.reviewdb.client.Account; import com.google.gerrit.reviewdb.client.Account;
import com.google.gerrit.reviewdb.client.Change; import com.google.gerrit.reviewdb.client.Change;
@@ -67,14 +66,14 @@ import org.slf4j.LoggerFactory;
@Singleton @Singleton
public class PublishDraftPatchSet public class PublishDraftPatchSet
implements RestModifyView<RevisionResource, Input>, UiAction<RevisionResource> { extends RetryingRestModifyView<RevisionResource, Input, Response<?>>
implements UiAction<RevisionResource> {
private static final Logger log = LoggerFactory.getLogger(PublishDraftPatchSet.class); private static final Logger log = LoggerFactory.getLogger(PublishDraftPatchSet.class);
public static class Input {} public static class Input {}
private final AccountResolver accountResolver; private final AccountResolver accountResolver;
private final ApprovalsUtil approvalsUtil; private final ApprovalsUtil approvalsUtil;
private final BatchUpdate.Factory updateFactory;
private final CreateChangeSender.Factory createChangeSenderFactory; private final CreateChangeSender.Factory createChangeSenderFactory;
private final PatchSetInfoFactory patchSetInfoFactory; private final PatchSetInfoFactory patchSetInfoFactory;
private final PatchSetUtil psUtil; private final PatchSetUtil psUtil;
@@ -86,16 +85,16 @@ public class PublishDraftPatchSet
public PublishDraftPatchSet( public PublishDraftPatchSet(
AccountResolver accountResolver, AccountResolver accountResolver,
ApprovalsUtil approvalsUtil, ApprovalsUtil approvalsUtil,
BatchUpdate.Factory updateFactory, RetryHelper retryHelper,
CreateChangeSender.Factory createChangeSenderFactory, CreateChangeSender.Factory createChangeSenderFactory,
PatchSetInfoFactory patchSetInfoFactory, PatchSetInfoFactory patchSetInfoFactory,
PatchSetUtil psUtil, PatchSetUtil psUtil,
Provider<ReviewDb> dbProvider, Provider<ReviewDb> dbProvider,
ReplacePatchSetSender.Factory replacePatchSetFactory, ReplacePatchSetSender.Factory replacePatchSetFactory,
DraftPublished draftPublished) { DraftPublished draftPublished) {
super(retryHelper);
this.accountResolver = accountResolver; this.accountResolver = accountResolver;
this.approvalsUtil = approvalsUtil; this.approvalsUtil = approvalsUtil;
this.updateFactory = updateFactory;
this.createChangeSenderFactory = createChangeSenderFactory; this.createChangeSenderFactory = createChangeSenderFactory;
this.patchSetInfoFactory = patchSetInfoFactory; this.patchSetInfoFactory = patchSetInfoFactory;
this.psUtil = psUtil; this.psUtil = psUtil;
@@ -105,12 +104,19 @@ public class PublishDraftPatchSet
} }
@Override @Override
public Response<?> apply(RevisionResource rsrc, Input input) protected Response<?> applyImpl(
BatchUpdate.Factory updateFactory, RevisionResource rsrc, Input input)
throws RestApiException, UpdateException { throws RestApiException, UpdateException {
return apply(rsrc.getUser(), rsrc.getChange(), rsrc.getPatchSet().getId(), rsrc.getPatchSet()); return apply(
updateFactory,
rsrc.getUser(),
rsrc.getChange(),
rsrc.getPatchSet().getId(),
rsrc.getPatchSet());
} }
private Response<?> apply(CurrentUser u, Change c, PatchSet.Id psId, PatchSet ps) private Response<?> apply(
BatchUpdate.Factory updateFactory, CurrentUser u, Change c, PatchSet.Id psId, PatchSet ps)
throws RestApiException, UpdateException { throws RestApiException, UpdateException {
try (BatchUpdate bu = try (BatchUpdate bu =
updateFactory.create(dbProvider.get(), c.getProject(), u, TimeUtil.nowTs())) { updateFactory.create(dbProvider.get(), c.getProject(), u, TimeUtil.nowTs())) {
@@ -148,6 +154,7 @@ public class PublishDraftPatchSet
BatchUpdate.Factory updateFactory, ChangeResource rsrc, Input input) BatchUpdate.Factory updateFactory, ChangeResource rsrc, Input input)
throws RestApiException, UpdateException { throws RestApiException, UpdateException {
return publish.apply( return publish.apply(
updateFactory,
rsrc.getControl().getUser(), rsrc.getControl().getUser(),
rsrc.getChange(), rsrc.getChange(),
rsrc.getChange().currentPatchSetId(), rsrc.getChange().currentPatchSetId(),

View File

@@ -19,7 +19,6 @@ import com.google.gerrit.common.TimeUtil;
import com.google.gerrit.extensions.restapi.DefaultInput; import com.google.gerrit.extensions.restapi.DefaultInput;
import com.google.gerrit.extensions.restapi.Response; import com.google.gerrit.extensions.restapi.Response;
import com.google.gerrit.extensions.restapi.RestApiException; import com.google.gerrit.extensions.restapi.RestApiException;
import com.google.gerrit.extensions.restapi.RestModifyView;
import com.google.gerrit.extensions.webui.UiAction; import com.google.gerrit.extensions.webui.UiAction;
import com.google.gerrit.reviewdb.client.ChangeMessage; import com.google.gerrit.reviewdb.client.ChangeMessage;
import com.google.gerrit.reviewdb.client.PatchSet; import com.google.gerrit.reviewdb.client.PatchSet;
@@ -33,6 +32,8 @@ import com.google.gerrit.server.project.ChangeControl;
import com.google.gerrit.server.update.BatchUpdate; import com.google.gerrit.server.update.BatchUpdate;
import com.google.gerrit.server.update.BatchUpdateOp; import com.google.gerrit.server.update.BatchUpdateOp;
import com.google.gerrit.server.update.ChangeContext; import com.google.gerrit.server.update.ChangeContext;
import com.google.gerrit.server.update.RetryHelper;
import com.google.gerrit.server.update.RetryingRestModifyView;
import com.google.gerrit.server.update.UpdateException; import com.google.gerrit.server.update.UpdateException;
import com.google.gwtorm.server.OrmException; import com.google.gwtorm.server.OrmException;
import com.google.inject.Inject; import com.google.inject.Inject;
@@ -42,10 +43,10 @@ import java.util.Collections;
@Singleton @Singleton
public class PutDescription public class PutDescription
implements RestModifyView<RevisionResource, PutDescription.Input>, UiAction<RevisionResource> { extends RetryingRestModifyView<RevisionResource, PutDescription.Input, Response<String>>
implements UiAction<RevisionResource> {
private final Provider<ReviewDb> dbProvider; private final Provider<ReviewDb> dbProvider;
private final ChangeMessagesUtil cmUtil; private final ChangeMessagesUtil cmUtil;
private final BatchUpdate.Factory batchUpdateFactory;
private final PatchSetUtil psUtil; private final PatchSetUtil psUtil;
public static class Input { public static class Input {
@@ -56,23 +57,24 @@ public class PutDescription
PutDescription( PutDescription(
Provider<ReviewDb> dbProvider, Provider<ReviewDb> dbProvider,
ChangeMessagesUtil cmUtil, ChangeMessagesUtil cmUtil,
BatchUpdate.Factory batchUpdateFactory, RetryHelper retryHelper,
PatchSetUtil psUtil) { PatchSetUtil psUtil) {
super(retryHelper);
this.dbProvider = dbProvider; this.dbProvider = dbProvider;
this.cmUtil = cmUtil; this.cmUtil = cmUtil;
this.batchUpdateFactory = batchUpdateFactory;
this.psUtil = psUtil; this.psUtil = psUtil;
} }
@Override @Override
public Response<String> apply(RevisionResource rsrc, Input input) protected Response<String> applyImpl(
BatchUpdate.Factory updateFactory, RevisionResource rsrc, Input input)
throws UpdateException, RestApiException, PermissionBackendException { throws UpdateException, RestApiException, PermissionBackendException {
rsrc.permissions().check(ChangePermission.EDIT_DESCRIPTION); rsrc.permissions().check(ChangePermission.EDIT_DESCRIPTION);
ChangeControl ctl = rsrc.getControl(); ChangeControl ctl = rsrc.getControl();
Op op = new Op(input != null ? input : new Input(), rsrc.getPatchSet().getId()); Op op = new Op(input != null ? input : new Input(), rsrc.getPatchSet().getId());
try (BatchUpdate u = try (BatchUpdate u =
batchUpdateFactory.create( updateFactory.create(
dbProvider.get(), rsrc.getChange().getProject(), ctl.getUser(), TimeUtil.nowTs())) { dbProvider.get(), rsrc.getChange().getProject(), ctl.getUser(), TimeUtil.nowTs())) {
u.addOp(rsrc.getChange().getId(), op); u.addOp(rsrc.getChange().getId(), op);
u.execute(); u.execute();

View File

@@ -59,13 +59,12 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@Singleton @Singleton
public class Rebase public class Rebase extends RetryingRestModifyView<RevisionResource, RebaseInput, ChangeInfo>
implements RestModifyView<RevisionResource, RebaseInput>, UiAction<RevisionResource> { implements RestModifyView<RevisionResource, RebaseInput>, UiAction<RevisionResource> {
private static final Logger log = LoggerFactory.getLogger(Rebase.class); private static final Logger log = LoggerFactory.getLogger(Rebase.class);
private static final ImmutableSet<ListChangesOption> OPTIONS = private static final ImmutableSet<ListChangesOption> OPTIONS =
Sets.immutableEnumSet(ListChangesOption.CURRENT_REVISION, ListChangesOption.CURRENT_COMMIT); Sets.immutableEnumSet(ListChangesOption.CURRENT_REVISION, ListChangesOption.CURRENT_COMMIT);
private final BatchUpdate.Factory updateFactory;
private final GitRepositoryManager repoManager; private final GitRepositoryManager repoManager;
private final RebaseChangeOp.Factory rebaseFactory; private final RebaseChangeOp.Factory rebaseFactory;
private final RebaseUtil rebaseUtil; private final RebaseUtil rebaseUtil;
@@ -74,13 +73,13 @@ public class Rebase
@Inject @Inject
public Rebase( public Rebase(
BatchUpdate.Factory updateFactory, RetryHelper retryHelper,
GitRepositoryManager repoManager, GitRepositoryManager repoManager,
RebaseChangeOp.Factory rebaseFactory, RebaseChangeOp.Factory rebaseFactory,
RebaseUtil rebaseUtil, RebaseUtil rebaseUtil,
ChangeJson.Factory json, ChangeJson.Factory json,
Provider<ReviewDb> dbProvider) { Provider<ReviewDb> dbProvider) {
this.updateFactory = updateFactory; super(retryHelper);
this.repoManager = repoManager; this.repoManager = repoManager;
this.rebaseFactory = rebaseFactory; this.rebaseFactory = rebaseFactory;
this.rebaseUtil = rebaseUtil; this.rebaseUtil = rebaseUtil;
@@ -89,7 +88,8 @@ public class Rebase
} }
@Override @Override
public ChangeInfo apply(RevisionResource rsrc, RebaseInput input) protected ChangeInfo applyImpl(
BatchUpdate.Factory updateFactory, RevisionResource rsrc, RebaseInput input)
throws EmailException, OrmException, UpdateException, RestApiException, IOException, throws EmailException, OrmException, UpdateException, RestApiException, IOException,
NoSuchChangeException, PermissionBackendException { NoSuchChangeException, PermissionBackendException {
rsrc.permissions().database(dbProvider).check(ChangePermission.REBASE); rsrc.permissions().database(dbProvider).check(ChangePermission.REBASE);
@@ -235,7 +235,7 @@ public class Rebase
} else if (!rsrc.getControl().isPatchVisible(ps, rebase.dbProvider.get())) { } else if (!rsrc.getControl().isPatchVisible(ps, rebase.dbProvider.get())) {
throw new AuthException("current revision not accessible"); throw new AuthException("current revision not accessible");
} }
return rebase.apply(new RevisionResource(rsrc, ps), input); return rebase.applyImpl(updateFactory, new RevisionResource(rsrc, ps), input);
} }
} }
} }