Break out parts of ReceiveCommits.insertChange()
Break out parts of ReceiveCommits.insertChange() to a new ChangeInserter class. Other features in Gerrit use very similar (and redundant code) for inserting a new change into the db, making maintenance a burden. This new class will be used by the new CherryPick feature (in upcoming changes), but other features in Gerrit should be able to make use of the code too. Change-Id: Iabae3b59e875514d6df215921b910ec44231a167
This commit is contained in:
@@ -0,0 +1,76 @@
|
||||
// Copyright (C) 2013 The Android Open Source Project
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
package com.google.gerrit.server.change;
|
||||
|
||||
import com.google.gerrit.common.ChangeHooks;
|
||||
import com.google.gerrit.common.data.LabelTypes;
|
||||
import com.google.gerrit.reviewdb.client.Account;
|
||||
import com.google.gerrit.reviewdb.client.Change;
|
||||
import com.google.gerrit.reviewdb.client.PatchSet;
|
||||
import com.google.gerrit.reviewdb.client.PatchSetInfo;
|
||||
import com.google.gerrit.reviewdb.server.ReviewDb;
|
||||
import com.google.gerrit.server.ApprovalsUtil;
|
||||
import com.google.gerrit.server.ChangeUtil;
|
||||
import com.google.gerrit.server.config.TrackingFooters;
|
||||
import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
|
||||
import com.google.gwtorm.server.OrmException;
|
||||
import com.google.inject.Inject;
|
||||
|
||||
import org.eclipse.jgit.lib.ObjectId;
|
||||
import org.eclipse.jgit.revwalk.FooterLine;
|
||||
import org.eclipse.jgit.revwalk.RevCommit;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
public class ChangeInserter {
|
||||
private final GitReferenceUpdated gitRefUpdated;
|
||||
private final ChangeHooks hooks;
|
||||
private final ApprovalsUtil approvalsUtil;
|
||||
private final TrackingFooters trackingFooters;
|
||||
|
||||
@Inject
|
||||
public ChangeInserter(final GitReferenceUpdated gitRefUpdated,
|
||||
ChangeHooks hooks, ApprovalsUtil approvalsUtil,
|
||||
TrackingFooters trackingFooters) {
|
||||
this.gitRefUpdated = gitRefUpdated;
|
||||
this.hooks = hooks;
|
||||
this.approvalsUtil = approvalsUtil;
|
||||
this.trackingFooters = trackingFooters;
|
||||
}
|
||||
|
||||
public void insertChange(ReviewDb db, Change change, PatchSet ps,
|
||||
RevCommit commit, LabelTypes labelTypes, List<FooterLine> footerLines,
|
||||
PatchSetInfo info, Set<Account.Id> reviewers) throws OrmException {
|
||||
|
||||
db.changes().beginTransaction(change.getId());
|
||||
try {
|
||||
ChangeUtil.insertAncestors(db, ps.getId(), commit);
|
||||
db.patchSets().insert(Collections.singleton(ps));
|
||||
db.changes().insert(Collections.singleton(change));
|
||||
ChangeUtil.updateTrackingIds(db, change, trackingFooters, footerLines);
|
||||
approvalsUtil.addReviewers(db, labelTypes, change, ps, info, reviewers,
|
||||
Collections.<Account.Id> emptySet());
|
||||
db.commit();
|
||||
} finally {
|
||||
db.rollback();
|
||||
}
|
||||
|
||||
gitRefUpdated.fire(change.getProject(), ps.getRefName(), ObjectId.zeroId(),
|
||||
commit);
|
||||
hooks.doPatchsetCreatedHook(change, ps, db);
|
||||
}
|
||||
}
|
||||
@@ -19,6 +19,7 @@ import static com.google.inject.Scopes.SINGLETON;
|
||||
import com.google.gerrit.server.ApprovalsUtil;
|
||||
import com.google.gerrit.server.IdentifiedUser;
|
||||
import com.google.gerrit.server.RequestCleanup;
|
||||
import com.google.gerrit.server.change.ChangeInserter;
|
||||
import com.google.gerrit.server.changedetail.DeleteDraftPatchSet;
|
||||
import com.google.gerrit.server.changedetail.PublishDraft;
|
||||
import com.google.gerrit.server.git.BanCommit;
|
||||
@@ -39,6 +40,7 @@ public class GerritRequestModule extends FactoryModule {
|
||||
bind(RequestScopedReviewDbProvider.class);
|
||||
bind(IdentifiedUser.RequestFactory.class).in(SINGLETON);
|
||||
bind(ApprovalsUtil.class);
|
||||
bind(ChangeInserter.class);
|
||||
|
||||
bind(PerRequestProjectControlCache.class).in(RequestScoped.class);
|
||||
bind(ChangeControl.Factory.class).in(SINGLETON);
|
||||
|
||||
@@ -60,6 +60,7 @@ import com.google.gerrit.server.ChangeUtil;
|
||||
import com.google.gerrit.server.GerritPersonIdent;
|
||||
import com.google.gerrit.server.IdentifiedUser;
|
||||
import com.google.gerrit.server.account.AccountResolver;
|
||||
import com.google.gerrit.server.change.ChangeInserter;
|
||||
import com.google.gerrit.server.config.AllProjectsName;
|
||||
import com.google.gerrit.server.config.CanonicalWebUrl;
|
||||
import com.google.gerrit.server.config.TrackingFooters;
|
||||
@@ -252,6 +253,7 @@ public class ReceiveCommits {
|
||||
private final CommitValidators.Factory commitValidatorsFactory;
|
||||
private final TrackingFooters trackingFooters;
|
||||
private final TagCache tagCache;
|
||||
private final ChangeInserter changeInserter;
|
||||
private final WorkQueue workQueue;
|
||||
private final ListeningExecutorService changeUpdateExector;
|
||||
private final RequestScopePropagator requestScopePropagator;
|
||||
@@ -303,6 +305,7 @@ public class ReceiveCommits {
|
||||
final GitRepositoryManager repoManager,
|
||||
final TagCache tagCache,
|
||||
final ChangeCache changeCache,
|
||||
final ChangeInserter changeInserter,
|
||||
final CommitValidators.Factory commitValidatorsFactory,
|
||||
@CanonicalWebUrl @Nullable final String canonicalWebUrl,
|
||||
@GerritPersonIdent final PersonIdent gerritIdent,
|
||||
@@ -333,6 +336,7 @@ public class ReceiveCommits {
|
||||
this.canonicalWebUrl = canonicalWebUrl;
|
||||
this.trackingFooters = trackingFooters;
|
||||
this.tagCache = tagCache;
|
||||
this.changeInserter = changeInserter;
|
||||
this.commitValidatorsFactory = commitValidatorsFactory;
|
||||
this.workQueue = workQueue;
|
||||
this.changeUpdateExector = changeUpdateExector;
|
||||
@@ -1461,23 +1465,11 @@ public class ReceiveCommits {
|
||||
recipients.add(getRecipientsFromFooters(accountResolver, ps, footerLines));
|
||||
recipients.remove(me);
|
||||
|
||||
db.changes().beginTransaction(change.getId());
|
||||
try {
|
||||
ChangeUtil.insertAncestors(db, ps.getId(), commit);
|
||||
db.patchSets().insert(Collections.singleton(ps));
|
||||
db.changes().insert(Collections.singleton(change));
|
||||
ChangeUtil.updateTrackingIds(db, change, trackingFooters, footerLines);
|
||||
approvalsUtil.addReviewers(db, labelTypes, change, ps, info,
|
||||
recipients.getReviewers(), Collections.<Account.Id> emptySet());
|
||||
db.commit();
|
||||
} finally {
|
||||
db.rollback();
|
||||
}
|
||||
changeInserter.insertChange(db, change, ps, commit, labelTypes,
|
||||
footerLines, info, recipients.getReviewers());
|
||||
|
||||
created = true;
|
||||
gitRefUpdated.fire(project.getNameKey(), ps.getRefName(),
|
||||
ObjectId.zeroId(), commit);
|
||||
hooks.doPatchsetCreatedHook(change, ps, db);
|
||||
|
||||
workQueue.getDefaultQueue()
|
||||
.submit(requestScopePropagator.wrap(new Runnable() {
|
||||
@Override
|
||||
|
||||
Reference in New Issue
Block a user