Make hooks/events listen to the new API Events.

Create a ChangeHookApiListener to listen to the new API Events and
forward these events to the old legacy ChangeHookRunner.  This decouples
the hooks and stream events from the internal events.  This also
decouples the ChangeHooks interface (and implementations) from all
internal classes except for the new ChangeHookApiListener.  This
decoupling should now make it very easy to move all of these classes to
plugins.

Change-Id: I9153dca45727f1c7ea10a8d003e1acf2171b39ac
This commit is contained in:
Martin Fick
2015-11-10 14:53:43 -07:00
committed by David Pursehouse
parent 59cdd227a9
commit d432c83a72
33 changed files with 465 additions and 387 deletions

View File

@@ -0,0 +1,349 @@
// Copyright (C) 2015 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.common;
import static com.google.gerrit.reviewdb.client.RefNames.REFS_CHANGES;
import static org.eclipse.jgit.lib.Constants.R_HEADS;
import com.google.gerrit.common.ChangeHookRunner.HookResult;
import com.google.gerrit.extensions.common.AccountInfo;
import com.google.gerrit.extensions.common.ApprovalInfo;
import com.google.gerrit.extensions.common.ChangeInfo;
import com.google.gerrit.extensions.common.RevisionInfo;
import com.google.gerrit.extensions.events.AgreementSignupListener;
import com.google.gerrit.extensions.events.ChangeAbandonedListener;
import com.google.gerrit.extensions.events.ChangeMergedListener;
import com.google.gerrit.extensions.events.ChangeRestoredListener;
import com.google.gerrit.extensions.events.CommentAddedListener;
import com.google.gerrit.extensions.events.DraftPublishedListener;
import com.google.gerrit.extensions.events.GitReferenceUpdatedListener;
import com.google.gerrit.extensions.events.HashtagsEditedListener;
import com.google.gerrit.extensions.events.NewProjectCreatedListener;
import com.google.gerrit.extensions.events.ReviewerAddedListener;
import com.google.gerrit.extensions.events.RevisionCreatedListener;
import com.google.gerrit.extensions.events.TopicEditedListener;
import com.google.gerrit.extensions.registration.DynamicSet;
import com.google.gerrit.lifecycle.LifecycleModule;
import com.google.gerrit.reviewdb.client.Account;
import com.google.gerrit.reviewdb.client.Branch;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.reviewdb.client.PatchSet;
import com.google.gerrit.reviewdb.client.Project;
import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gerrit.server.IdentifiedUser;
import com.google.gerrit.server.PatchSetUtil;
import com.google.gwtorm.server.OrmException;
import com.google.gerrit.server.account.AccountCache;
import com.google.gerrit.server.events.CommitReceivedEvent;
import com.google.gerrit.server.git.validators.CommitValidationListener;
import com.google.gerrit.server.git.validators.CommitValidationMessage;
import com.google.gerrit.server.notedb.ChangeNotes;
import com.google.gerrit.server.project.NoSuchChangeException;
import com.google.gerrit.server.git.validators.CommitValidationException;
import com.google.inject.Inject;
import com.google.inject.Provider;
import com.google.inject.Singleton;
import org.eclipse.jgit.lib.ObjectId;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
@Singleton
public class ChangeHookApiListener implements
AgreementSignupListener,
ChangeAbandonedListener,
ChangeMergedListener,
ChangeRestoredListener,
CommentAddedListener,
DraftPublishedListener,
GitReferenceUpdatedListener,
HashtagsEditedListener,
NewProjectCreatedListener,
ReviewerAddedListener,
RevisionCreatedListener,
TopicEditedListener {
/** A logger for this class. */
private static final Logger log =
LoggerFactory.getLogger(ChangeHookApiListener.class);
public static class Module extends LifecycleModule {
@Override
protected void configure() {
DynamicSet.bind(binder(), AgreementSignupListener.class)
.to(ChangeHookApiListener.class);
DynamicSet.bind(binder(), ChangeAbandonedListener.class)
.to(ChangeHookApiListener.class);
DynamicSet.bind(binder(), ChangeMergedListener.class)
.to(ChangeHookApiListener.class);
DynamicSet.bind(binder(), ChangeRestoredListener.class)
.to(ChangeHookApiListener.class);
DynamicSet.bind(binder(), CommentAddedListener.class)
.to(ChangeHookApiListener.class);
DynamicSet.bind(binder(), DraftPublishedListener.class)
.to(ChangeHookApiListener.class);
DynamicSet.bind(binder(), GitReferenceUpdatedListener.class)
.to(ChangeHookApiListener.class);
DynamicSet.bind(binder(), HashtagsEditedListener.class)
.to(ChangeHookApiListener.class);
DynamicSet.bind(binder(), NewProjectCreatedListener.class)
.to(ChangeHookApiListener.class);
DynamicSet.bind(binder(), ReviewerAddedListener.class)
.to(ChangeHookApiListener.class);
DynamicSet.bind(binder(), RevisionCreatedListener.class)
.to(ChangeHookApiListener.class);
DynamicSet.bind(binder(), TopicEditedListener.class)
.to(ChangeHookApiListener.class);
DynamicSet.bind(binder(), CommitValidationListener.class)
.to(ChangeHookValidator.class);
}
}
/** Reject commits that don't pass user-supplied ref-update hook. */
public static class ChangeHookValidator implements
CommitValidationListener {
private final ChangeHooks hooks;
@Inject
public ChangeHookValidator(ChangeHooks hooks) {
this.hooks = hooks;
}
@Override
public List<CommitValidationMessage> onCommitReceived(
CommitReceivedEvent receiveEvent) throws CommitValidationException {
IdentifiedUser user = receiveEvent.user;
String refname = receiveEvent.refName;
ObjectId old = ObjectId.zeroId();
if (receiveEvent.commit.getParentCount() > 0) {
old = receiveEvent.commit.getParent(0);
}
if (receiveEvent.command.getRefName().startsWith(REFS_CHANGES)) {
/*
* If the ref-update hook tries to distinguish behavior between pushes to
* refs/heads/... and refs/for/..., make sure we send it the correct
* refname.
* Also, if this is targetting refs/for/, make sure we behave the same as
* what a push to refs/for/ would behave; in particular, setting oldrev
* to 0000000000000000000000000000000000000000.
*/
refname = refname.replace(R_HEADS, "refs/for/refs/heads/");
old = ObjectId.zeroId();
}
HookResult result = hooks.doRefUpdateHook(receiveEvent.project, refname,
user.getAccount(), old, receiveEvent.commit);
if (result != null && result.getExitValue() != 0) {
throw new CommitValidationException(result.toString().trim());
}
return Collections.emptyList();
}
}
private final Provider<ReviewDb> db;
private final AccountCache accounts;
private final ChangeHooks hooks;
private final PatchSetUtil psUtil;
private final ChangeNotes.Factory changeNotesFactory;
@Inject
public ChangeHookApiListener(
Provider<ReviewDb> db,
AccountCache accounts,
ChangeHooks hooks,
PatchSetUtil psUtil,
ChangeNotes.Factory changeNotesFactory) {
this.db = db;
this.accounts = accounts;
this.hooks = hooks;
this.psUtil = psUtil;
this.changeNotesFactory = changeNotesFactory;
}
@Override
public void onNewProjectCreated(NewProjectCreatedListener.Event ev) {
hooks.doProjectCreatedHook(new Project.NameKey(ev.getProjectName()),
ev.getHeadName());
}
@Override
public void onRevisionCreated(RevisionCreatedListener.Event ev) {
try {
ChangeNotes notes = getNotes(ev.getChange());
hooks.doPatchsetCreatedHook(notes.getChange(),
getPatchSet(notes, ev.getRevision()), db.get());
} catch (OrmException e) {
log.error("PatchsetCreated hook failed to run "
+ ev.getChange()._number, e);
}
}
@Override
public void onDraftPublished(DraftPublishedListener.Event ev) {
try {
ChangeNotes notes = getNotes(ev.getChange());
hooks.doDraftPublishedHook(notes.getChange(),
getPatchSet(notes, ev.getRevision()), db.get());
} catch (OrmException e) {
log.error("DraftPublished hook failed to run "
+ ev.getChange()._number, e);
}
}
@Override
public void onCommentAdded(CommentAddedListener.Event ev) {
Map<String, Short> approvals = convertApprovalsMap(ev.getApprovals());
Map<String, Short> oldApprovals = convertApprovalsMap(ev.getOldApprovals());
try {
ChangeNotes notes = getNotes(ev.getChange());
hooks.doCommentAddedHook(notes.getChange(),
getAccount(ev.getAuthor()),
getPatchSet(notes, ev.getRevision()),
ev.getComment(), approvals, oldApprovals, db.get());
} catch (OrmException e) {
log.error("CommentAdded hook failed to fun" + ev.getChange()._number, e);
}
}
@Override
public void onChangeMerged(ChangeMergedListener.Event ev) {
try {
ChangeNotes notes = getNotes(ev.getChange());
hooks.doChangeMergedHook(notes.getChange(),
getAccount(ev.getMerger()),
getPatchSet(notes, ev.getRevision()),
db.get(), ev.getNewRevisionId());
} catch (OrmException e) {
log.error("ChangeMerged hook failed to run " + ev.getChange()._number, e);
}
}
@Override
public void onChangeAbandoned(ChangeAbandonedListener.Event ev) {
try {
ChangeNotes notes = getNotes(ev.getChange());
hooks.doChangeAbandonedHook(notes.getChange(),
getAccount(ev.getAbandoner()),
getPatchSet(notes, ev.getRevision()),
ev.getReason(), db.get());
} catch (OrmException e) {
log.error("ChangeAbandoned hook failed to run "
+ ev.getChange()._number, e);
}
}
@Override
public void onChangeRestored(ChangeRestoredListener.Event ev) {
try {
ChangeNotes notes = getNotes(ev.getChange());
hooks.doChangeRestoredHook(notes.getChange(),
getAccount(ev.getRestorer()),
getPatchSet(notes, ev.getRevision()),
ev.getReason(), db.get());
} catch (OrmException e) {
log.error("ChangeRestored hook failed to run "
+ ev.getChange()._number, e);
}
}
@Override
public void onGitReferenceUpdated(GitReferenceUpdatedListener.Event ev) {
hooks.doRefUpdatedHook(
new Branch.NameKey(ev.getProjectName(), ev.getRefName()),
ObjectId.fromString(ev.getOldObjectId()),
ObjectId.fromString(ev.getNewObjectId()),
getAccount(ev.getUpdater()));
}
@Override
public void onReviewerAdded(ReviewerAddedListener.Event ev) {
try {
ChangeNotes notes = getNotes(ev.getChange());
hooks.doReviewerAddedHook(notes.getChange(),
getAccount(ev.getReviewer()),
psUtil.current(db.get(), notes),
db.get());
} catch (OrmException e) {
log.error("ReviewerAdded hook failed to run "
+ ev.getChange()._number, e);
}
}
@Override
public void onTopicEdited(TopicEditedListener.Event ev) {
try {
hooks.doTopicChangedHook(getNotes(ev.getChange()).getChange(),
getAccount(ev.getEditor()), ev.getOldTopic(), db.get());
} catch (OrmException e) {
log.error("TopicChanged hook failed to run "
+ ev.getChange()._number, e);
}
}
@Override
public void onHashtagsEdited(HashtagsEditedListener.Event ev) {
try {
hooks.doHashtagsChangedHook(getNotes(ev.getChange()).getChange(),
getAccount(ev.getEditor()),
new HashSet<>(ev.getAddedHashtags()),
new HashSet<>(ev.getRemovedHashtags()),
new HashSet<>(ev.getHashtags()),
db.get());
} catch (OrmException e) {
log.error("HashtagsChanged hook failed to run "
+ ev.getChange()._number, e);
}
}
@Override
public void onAgreementSignup(AgreementSignupListener.Event ev) {
hooks.doClaSignupHook(getAccount(ev.getAccount()), ev.getAgreementName());
}
private ChangeNotes getNotes(ChangeInfo info) throws OrmException {
try {
return changeNotesFactory.createChecked(new Change.Id(info._number));
} catch (NoSuchChangeException e) {
throw new OrmException(e);
}
}
private PatchSet getPatchSet(ChangeNotes notes, RevisionInfo info)
throws OrmException {
return psUtil.get(db.get(), notes, PatchSet.Id.fromRef(info.ref));
}
private Account getAccount(AccountInfo info) {
return accounts.get(new Account.Id(info._accountId)).getAccount();
}
private static Map<String, Short> convertApprovalsMap(
Map<String, ApprovalInfo> approvals) {
Map<String, Short> result = new HashMap<>();
for (Entry<String, ApprovalInfo> e : approvals.entrySet()) {
Short value =
e.getValue().value == null ? null : e.getValue().value.shortValue();
result.put(e.getKey(), value);
}
return result;
}
}

View File

@@ -22,9 +22,7 @@ import com.google.common.util.concurrent.ThreadFactoryBuilder;
import com.google.gerrit.common.data.LabelType;
import com.google.gerrit.common.data.LabelTypes;
import com.google.gerrit.extensions.events.LifecycleListener;
import com.google.gerrit.extensions.events.NewProjectCreatedListener;
import com.google.gerrit.extensions.registration.DynamicItem;
import com.google.gerrit.extensions.registration.DynamicSet;
import com.google.gerrit.lifecycle.LifecycleModule;
import com.google.gerrit.reviewdb.client.Account;
import com.google.gerrit.reviewdb.client.Branch;
@@ -93,8 +91,7 @@ import java.util.concurrent.TimeoutException;
/** Spawns local executables when a hook action occurs. */
@Singleton
public class ChangeHookRunner implements ChangeHooks, LifecycleListener,
NewProjectCreatedListener {
public class ChangeHookRunner implements ChangeHooks, LifecycleListener {
/** A logger for this class. */
private static final Logger log = LoggerFactory.getLogger(ChangeHookRunner.class);
@@ -103,7 +100,6 @@ public class ChangeHookRunner implements ChangeHooks, LifecycleListener,
protected void configure() {
bind(ChangeHookRunner.class);
bind(ChangeHooks.class).to(ChangeHookRunner.class);
DynamicSet.bind(binder(), NewProjectCreatedListener.class).to(ChangeHookRunner.class);
listener().to(ChangeHookRunner.class);
}
}
@@ -1140,10 +1136,4 @@ public class ChangeHookRunner implements ChangeHooks, LifecycleListener,
super.runHook();
}
}
@Override
public void onNewProjectCreated(NewProjectCreatedListener.Event event) {
Project.NameKey project = new Project.NameKey(event.getProjectName());
doProjectCreatedHook(project, event.getHeadName());
}
}

View File

@@ -15,7 +15,6 @@
package com.google.gerrit.server.change;
import com.google.common.base.Strings;
import com.google.gerrit.common.ChangeHooks;
import com.google.gerrit.common.TimeUtil;
import com.google.gerrit.extensions.api.changes.AbandonInput;
import com.google.gerrit.extensions.common.ChangeInfo;
@@ -55,7 +54,6 @@ public class Abandon implements RestModifyView<ChangeResource, AbandonInput>,
UiAction<ChangeResource> {
private static final Logger log = LoggerFactory.getLogger(Abandon.class);
private final ChangeHooks hooks;
private final AbandonedSender.Factory abandonedSenderFactory;
private final Provider<ReviewDb> dbProvider;
private final ChangeJson.Factory json;
@@ -65,15 +63,13 @@ public class Abandon implements RestModifyView<ChangeResource, AbandonInput>,
private final ChangeAbandoned changeAbandoned;
@Inject
Abandon(ChangeHooks hooks,
AbandonedSender.Factory abandonedSenderFactory,
Abandon(AbandonedSender.Factory abandonedSenderFactory,
Provider<ReviewDb> dbProvider,
ChangeJson.Factory json,
ChangeMessagesUtil cmUtil,
PatchSetUtil psUtil,
BatchUpdate.Factory batchUpdateFactory,
ChangeAbandoned changeAbandoned) {
this.hooks = hooks;
this.abandonedSenderFactory = abandonedSenderFactory;
this.dbProvider = dbProvider;
this.json = json;
@@ -176,11 +172,6 @@ public class Abandon implements RestModifyView<ChangeResource, AbandonInput>,
log.error("Cannot email update for change " + change.getId(), e);
}
changeAbandoned.fire(change, patchSet, account, msgTxt);
hooks.doChangeAbandonedHook(change,
account,
patchSet,
Strings.emptyToNull(msgTxt),
ctx.getDb());
}
}

View File

@@ -19,7 +19,6 @@ import static com.google.common.base.Preconditions.checkState;
import static com.google.gerrit.reviewdb.client.Change.INITIAL_PATCH_SET_ID;
import com.google.common.base.MoreObjects;
import com.google.gerrit.common.ChangeHooks;
import com.google.gerrit.common.FooterConstants;
import com.google.gerrit.common.data.LabelType;
import com.google.gerrit.common.data.LabelTypes;
@@ -90,7 +89,6 @@ public class ChangeInserter extends BatchUpdate.InsertChangeOp {
private final ChangeControl.GenericFactory changeControlFactory;
private final PatchSetInfoFactory patchSetInfoFactory;
private final PatchSetUtil psUtil;
private final ChangeHooks hooks;
private final ApprovalsUtil approvalsUtil;
private final ChangeMessagesUtil cmUtil;
private final CreateChangeSender.Factory createChangeSenderFactory;
@@ -132,7 +130,6 @@ public class ChangeInserter extends BatchUpdate.InsertChangeOp {
ChangeControl.GenericFactory changeControlFactory,
PatchSetInfoFactory patchSetInfoFactory,
PatchSetUtil psUtil,
ChangeHooks hooks,
ApprovalsUtil approvalsUtil,
ChangeMessagesUtil cmUtil,
CreateChangeSender.Factory createChangeSenderFactory,
@@ -147,7 +144,6 @@ public class ChangeInserter extends BatchUpdate.InsertChangeOp {
this.changeControlFactory = changeControlFactory;
this.patchSetInfoFactory = patchSetInfoFactory;
this.psUtil = psUtil;
this.hooks = hooks;
this.approvalsUtil = approvalsUtil;
this.cmUtil = cmUtil;
this.createChangeSenderFactory = createChangeSenderFactory;
@@ -406,11 +402,9 @@ public class ChangeInserter extends BatchUpdate.InsertChangeOp {
*/
if (runHooks) {
revisionCreated.fire(change, patchSet, ctx.getUser().getAccountId());
ReviewDb db = ctx.getDb();
hooks.doPatchsetCreatedHook(change, patchSet, db);
if (approvals != null && !approvals.isEmpty()) {
ChangeControl changeControl = changeControlFactory.controlFor(
db, change, ctx.getUser());
ctx.getDb(), change, ctx.getUser());
List<LabelType> labels = changeControl.getLabelTypes().getLabelTypes();
Map<String, Short> allApprovals = new HashMap<>();
Map<String, Short> oldApprovals = new HashMap<>();
@@ -427,9 +421,6 @@ public class ChangeInserter extends BatchUpdate.InsertChangeOp {
commentAdded.fire(change, patchSet,
ctx.getUser().asIdentifiedUser().getAccount(), null,
allApprovals, oldApprovals, ctx.getWhen());
hooks.doCommentAddedHook(change,
ctx.getUser().asIdentifiedUser().getAccount(), patchSet, null,
allApprovals, oldApprovals, db);
}
}
}

View File

@@ -19,7 +19,6 @@ import static com.google.common.base.Preconditions.checkState;
import static com.google.gerrit.server.notedb.ReviewerStateInternal.CC;
import static com.google.gerrit.server.notedb.ReviewerStateInternal.REVIEWER;
import com.google.gerrit.common.ChangeHooks;
import com.google.gerrit.extensions.restapi.ResourceConflictException;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.reviewdb.client.ChangeMessage;
@@ -72,7 +71,6 @@ public class PatchSetInserter extends BatchUpdate.Op {
}
// Injected fields.
private final ChangeHooks hooks;
private final PatchSetInfoFactory patchSetInfoFactory;
private final ReviewDb db;
private final CommitValidators.Factory commitValidatorsFactory;
@@ -111,8 +109,7 @@ public class PatchSetInserter extends BatchUpdate.Op {
private ReviewerSet oldReviewers;
@AssistedInject
public PatchSetInserter(ChangeHooks hooks,
ReviewDb db,
public PatchSetInserter(ReviewDb db,
ApprovalsUtil approvalsUtil,
ApprovalCopier approvalCopier,
ChangeMessagesUtil cmUtil,
@@ -124,7 +121,6 @@ public class PatchSetInserter extends BatchUpdate.Op {
@Assisted ChangeControl ctl,
@Assisted PatchSet.Id psId,
@Assisted RevCommit commit) {
this.hooks = hooks;
this.db = db;
this.approvalsUtil = approvalsUtil;
this.approvalCopier = approvalCopier;
@@ -279,7 +275,6 @@ public class PatchSetInserter extends BatchUpdate.Op {
if (runHooks) {
revisionCreated.fire(change, patchSet, ctx.getUser().getAccountId());
hooks.doPatchsetCreatedHook(change, patchSet, ctx.getDb());
}
}

View File

@@ -28,7 +28,6 @@ import com.google.common.collect.Ordering;
import com.google.common.collect.Sets;
import com.google.common.hash.HashCode;
import com.google.common.hash.Hashing;
import com.google.gerrit.common.ChangeHooks;
import com.google.gerrit.common.Nullable;
import com.google.gerrit.common.TimeUtil;
import com.google.gerrit.common.data.LabelType;
@@ -110,7 +109,6 @@ public class PostReview implements RestModifyView<RevisionResource, ReviewInput>
private final PatchListCache patchListCache;
private final AccountsCollection accounts;
private final EmailReviewComments.Factory email;
private final ChangeHooks hooks;
private final CommentAdded commentAdded;
@Inject
@@ -125,7 +123,6 @@ public class PostReview implements RestModifyView<RevisionResource, ReviewInput>
PatchListCache patchListCache,
AccountsCollection accounts,
EmailReviewComments.Factory email,
ChangeHooks hooks,
CommentAdded commentAdded) {
this.db = db;
this.batchUpdateFactory = batchUpdateFactory;
@@ -138,7 +135,6 @@ public class PostReview implements RestModifyView<RevisionResource, ReviewInput>
this.cmUtil = cmUtil;
this.accounts = accounts;
this.email = email;
this.hooks = hooks;
this.commentAdded = commentAdded;
}
@@ -387,15 +383,9 @@ public class PostReview implements RestModifyView<RevisionResource, ReviewInput>
message,
comments).sendAsync();
}
try {
commentAdded.fire(
notes.getChange(), ps, user.getAccount(), message.getMessage(),
approvals, oldApprovals, ctx.getWhen());
hooks.doCommentAddedHook(notes.getChange(), user.getAccount(), ps,
message.getMessage(), approvals, oldApprovals, ctx.getDb());
} catch (OrmException e) {
log.warn("ChangeHook.doCommentAddedHook invocation failed", e);
}
commentAdded.fire(
notes.getChange(), ps, user.getAccount(), message.getMessage(),
approvals, oldApprovals, ctx.getWhen());
}
private boolean insertComments(ChangeContext ctx) throws OrmException {

View File

@@ -17,7 +17,6 @@ package com.google.gerrit.server.change;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Lists;
import com.google.gerrit.common.ChangeHooks;
import com.google.gerrit.common.TimeUtil;
import com.google.gerrit.common.data.GroupDescription;
import com.google.gerrit.common.errors.NoSuchGroupException;
@@ -89,7 +88,6 @@ public class PostReviewers implements RestModifyView<ChangeResource, AddReviewer
private final Provider<IdentifiedUser> user;
private final IdentifiedUser.GenericFactory identifiedUserFactory;
private final Config cfg;
private final ChangeHooks hooks;
private final AccountCache accountCache;
private final ReviewerJson json;
private final ReviewerAdded reviewerAdded;
@@ -108,7 +106,6 @@ public class PostReviewers implements RestModifyView<ChangeResource, AddReviewer
Provider<IdentifiedUser> user,
IdentifiedUser.GenericFactory identifiedUserFactory,
@GerritServerConfig Config cfg,
ChangeHooks hooks,
AccountCache accountCache,
ReviewerJson json,
ReviewerAdded reviewerAdded) {
@@ -125,7 +122,6 @@ public class PostReviewers implements RestModifyView<ChangeResource, AddReviewer
this.user = user;
this.identifiedUserFactory = identifiedUserFactory;
this.cfg = cfg;
this.hooks = hooks;
this.accountCache = accountCache;
this.json = json;
this.reviewerAdded = reviewerAdded;
@@ -294,8 +290,6 @@ public class PostReviewers implements RestModifyView<ChangeResource, AddReviewer
for (PatchSetApproval psa : added) {
Account account = accountCache.get(psa.getAccountId()).getAccount();
reviewerAdded.fire(rsrc.getChange(), patchSet, account);
hooks.doReviewerAddedHook(
rsrc.getChange(), account, patchSet, dbProvider.get());
}
}
}

View File

@@ -16,7 +16,6 @@ package com.google.gerrit.server.change;
import static com.google.gerrit.server.mail.MailUtil.getRecipientsFromFooters;
import com.google.gerrit.common.ChangeHooks;
import com.google.gerrit.common.Nullable;
import com.google.gerrit.common.TimeUtil;
import com.google.gerrit.common.data.LabelTypes;
@@ -77,7 +76,6 @@ public class PublishDraftPatchSet implements RestModifyView<RevisionResource, In
private final AccountResolver accountResolver;
private final ApprovalsUtil approvalsUtil;
private final BatchUpdate.Factory updateFactory;
private final ChangeHooks hooks;
private final CreateChangeSender.Factory createChangeSenderFactory;
private final PatchSetInfoFactory patchSetInfoFactory;
private final PatchSetUtil psUtil;
@@ -90,7 +88,6 @@ public class PublishDraftPatchSet implements RestModifyView<RevisionResource, In
AccountResolver accountResolver,
ApprovalsUtil approvalsUtil,
BatchUpdate.Factory updateFactory,
ChangeHooks hooks,
CreateChangeSender.Factory createChangeSenderFactory,
PatchSetInfoFactory patchSetInfoFactory,
PatchSetUtil psUtil,
@@ -100,7 +97,6 @@ public class PublishDraftPatchSet implements RestModifyView<RevisionResource, In
this.accountResolver = accountResolver;
this.approvalsUtil = approvalsUtil;
this.updateFactory = updateFactory;
this.hooks = hooks;
this.createChangeSenderFactory = createChangeSenderFactory;
this.patchSetInfoFactory = patchSetInfoFactory;
this.psUtil = psUtil;
@@ -228,7 +224,6 @@ public class PublishDraftPatchSet implements RestModifyView<RevisionResource, In
@Override
public void postUpdate(Context ctx) throws OrmException {
draftPublished.fire(change, patchSet, ctx.getUser().getAccountId());
hooks.doDraftPublishedHook(change, patchSet, ctx.getDb());
if (patchSet.isDraft() && change.getStatus() == Change.Status.DRAFT) {
// Skip emails if the patch set is still a draft.
return;

View File

@@ -15,7 +15,6 @@
package com.google.gerrit.server.change;
import com.google.common.base.Strings;
import com.google.gerrit.common.ChangeHooks;
import com.google.gerrit.common.TimeUtil;
import com.google.gerrit.extensions.restapi.AuthException;
import com.google.gerrit.extensions.restapi.DefaultInput;
@@ -45,7 +44,6 @@ import com.google.inject.Singleton;
public class PutTopic implements RestModifyView<ChangeResource, Input>,
UiAction<ChangeResource> {
private final Provider<ReviewDb> dbProvider;
private final ChangeHooks hooks;
private final ChangeMessagesUtil cmUtil;
private final BatchUpdate.Factory batchUpdateFactory;
private final TopicEdited topicEdited;
@@ -57,12 +55,10 @@ public class PutTopic implements RestModifyView<ChangeResource, Input>,
@Inject
PutTopic(Provider<ReviewDb> dbProvider,
ChangeHooks hooks,
ChangeMessagesUtil cmUtil,
BatchUpdate.Factory batchUpdateFactory,
TopicEdited topicEdited) {
this.dbProvider = dbProvider;
this.hooks = hooks;
this.cmUtil = cmUtil;
this.batchUpdateFactory = batchUpdateFactory;
this.topicEdited = topicEdited;
@@ -131,16 +127,11 @@ public class PutTopic implements RestModifyView<ChangeResource, Input>,
}
@Override
public void postUpdate(Context ctx) throws OrmException {
public void postUpdate(Context ctx) {
if (change != null) {
topicEdited.fire(change,
ctx.getUser().asIdentifiedUser().getAccount(),
oldTopicName);
hooks.doTopicChangedHook(
change,
ctx.getUser().asIdentifiedUser().getAccount(),
oldTopicName,
ctx.getDb());
}
}
}

View File

@@ -15,7 +15,6 @@
package com.google.gerrit.server.change;
import com.google.common.base.Strings;
import com.google.gerrit.common.ChangeHooks;
import com.google.gerrit.common.TimeUtil;
import com.google.gerrit.extensions.api.changes.RestoreInput;
import com.google.gerrit.extensions.common.ChangeInfo;
@@ -54,7 +53,6 @@ public class Restore implements RestModifyView<ChangeResource, RestoreInput>,
UiAction<ChangeResource> {
private static final Logger log = LoggerFactory.getLogger(Restore.class);
private final ChangeHooks hooks;
private final RestoredSender.Factory restoredSenderFactory;
private final Provider<ReviewDb> dbProvider;
private final ChangeJson.Factory json;
@@ -64,15 +62,13 @@ public class Restore implements RestModifyView<ChangeResource, RestoreInput>,
private final ChangeRestored changeRestored;
@Inject
Restore(ChangeHooks hooks,
RestoredSender.Factory restoredSenderFactory,
Restore(RestoredSender.Factory restoredSenderFactory,
Provider<ReviewDb> dbProvider,
ChangeJson.Factory json,
ChangeMessagesUtil cmUtil,
PatchSetUtil psUtil,
BatchUpdate.Factory batchUpdateFactory,
ChangeRestored changeRestored) {
this.hooks = hooks;
this.restoredSenderFactory = restoredSenderFactory;
this.dbProvider = dbProvider;
this.json = json;
@@ -161,11 +157,6 @@ public class Restore implements RestModifyView<ChangeResource, RestoreInput>,
changeRestored.fire(change, patchSet,
ctx.getUser().asIdentifiedUser().getAccount(),
Strings.emptyToNull(input.message));
hooks.doChangeRestoredHook(change,
ctx.getUser().asIdentifiedUser().getAccount(),
patchSet,
Strings.emptyToNull(input.message),
ctx.getDb());
}
}

View File

@@ -20,7 +20,6 @@ import static com.google.gerrit.server.change.HashtagsUtil.extractTags;
import com.google.common.base.Joiner;
import com.google.common.collect.ImmutableSortedSet;
import com.google.common.collect.Ordering;
import com.google.gerrit.common.ChangeHooks;
import com.google.gerrit.common.Nullable;
import com.google.gerrit.extensions.api.changes.HashtagsInput;
import com.google.gerrit.extensions.registration.DynamicSet;
@@ -55,7 +54,6 @@ public class SetHashtagsOp extends BatchUpdate.Op {
private final NotesMigration notesMigration;
private final ChangeMessagesUtil cmUtil;
private final ChangeHooks hooks;
private final DynamicSet<HashtagValidationListener> validationListeners;
private final HashtagsEdited hashtagsEdited;
private final HashtagsInput input;
@@ -71,13 +69,11 @@ public class SetHashtagsOp extends BatchUpdate.Op {
SetHashtagsOp(
NotesMigration notesMigration,
ChangeMessagesUtil cmUtil,
ChangeHooks hooks,
DynamicSet<HashtagValidationListener> validationListeners,
HashtagsEdited hashtagsEdited,
@Assisted @Nullable HashtagsInput input) {
this.notesMigration = notesMigration;
this.cmUtil = cmUtil;
this.hooks = hooks;
this.validationListeners = validationListeners;
this.hashtagsEdited = hashtagsEdited;
this.input = input;
@@ -172,10 +168,6 @@ public class SetHashtagsOp extends BatchUpdate.Op {
if (updated() && runHooks) {
hashtagsEdited.fire(change, ctx.getUser().getAccountId(), updatedHashtags,
toAdd, toRemove);
hooks.doHashtagsChangedHook(
change, ctx.getUser().asIdentifiedUser().getAccount(),
toAdd, toRemove, updatedHashtags,
ctx.getDb());
}
}

View File

@@ -16,8 +16,6 @@ package com.google.gerrit.server.git;
import static com.google.common.base.Preconditions.checkNotNull;
import com.google.gerrit.common.ChangeHooks;
import com.google.gerrit.reviewdb.client.Account;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.reviewdb.client.ChangeMessage;
import com.google.gerrit.reviewdb.client.LabelId;
@@ -62,7 +60,6 @@ public class MergedByPushOp extends BatchUpdate.Op {
private final RequestScopePropagator requestScopePropagator;
private final PatchSetInfoFactory patchSetInfoFactory;
private final ChangeHooks hooks;
private final ChangeMessagesUtil cmUtil;
private final MergedSender.Factory mergedSenderFactory;
private final PatchSetUtil psUtil;
@@ -81,7 +78,6 @@ public class MergedByPushOp extends BatchUpdate.Op {
@AssistedInject
MergedByPushOp(
PatchSetInfoFactory patchSetInfoFactory,
ChangeHooks hooks,
ChangeMessagesUtil cmUtil,
MergedSender.Factory mergedSenderFactory,
PatchSetUtil psUtil,
@@ -91,7 +87,6 @@ public class MergedByPushOp extends BatchUpdate.Op {
@Assisted PatchSet.Id psId,
@Assisted String refName) {
this.patchSetInfoFactory = patchSetInfoFactory;
this.hooks = hooks;
this.cmUtil = cmUtil;
this.mergedSenderFactory = mergedSenderFactory;
this.psUtil = psUtil;
@@ -175,7 +170,7 @@ public class MergedByPushOp extends BatchUpdate.Op {
}
@Override
public void postUpdate(final Context ctx) throws OrmException {
public void postUpdate(final Context ctx) {
if (!correctBranch) {
return;
}
@@ -199,11 +194,9 @@ public class MergedByPushOp extends BatchUpdate.Op {
}
}));
Account account = ctx.getUser().asIdentifiedUser().getAccount();
hooks.doChangeMergedHook(
change, account, patchSet,
ctx.getDb(), patchSet.getRevision().get());
changeMerged.fire(change, patchSet, account, patchSet.getRevision().get());
changeMerged.fire(change, patchSet,
ctx.getUser().asIdentifiedUser().getAccount(),
patchSet.getRevision().get());
}
private PatchSetInfo getPatchSetInfo(ChangeContext ctx) throws IOException {

View File

@@ -52,7 +52,6 @@ import com.google.common.collect.Sets;
import com.google.common.collect.SortedSetMultimap;
import com.google.common.util.concurrent.CheckedFuture;
import com.google.common.util.concurrent.ListeningExecutorService;
import com.google.gerrit.common.ChangeHooks;
import com.google.gerrit.common.Nullable;
import com.google.gerrit.common.TimeUtil;
import com.google.gerrit.common.data.Capable;
@@ -284,7 +283,6 @@ public class ReceiveCommits {
private final CmdLineParser.Factory optionParserFactory;
private final GitReferenceUpdated gitRefUpdated;
private final PatchSetInfoFactory patchSetInfoFactory;
private final ChangeHooks hooks;
private final PatchSetUtil psUtil;
private final GitRepositoryManager repoManager;
private final ProjectCache projectCache;
@@ -348,7 +346,6 @@ public class ReceiveCommits {
CmdLineParser.Factory optionParserFactory,
GitReferenceUpdated gitRefUpdated,
PatchSetInfoFactory patchSetInfoFactory,
ChangeHooks hooks,
PatchSetUtil psUtil,
ProjectCache projectCache,
GitRepositoryManager repoManager,
@@ -387,7 +384,6 @@ public class ReceiveCommits {
this.optionParserFactory = optionParserFactory;
this.gitRefUpdated = gitRefUpdated;
this.patchSetInfoFactory = patchSetInfoFactory;
this.hooks = hooks;
this.psUtil = psUtil;
this.projectCache = projectCache;
this.repoManager = repoManager;
@@ -644,11 +640,6 @@ public class ReceiveCommits {
// Events for change refs are fired when they are created.
//
gitRefUpdated.fire(project.getNameKey(), c, user.getAccount());
hooks.doRefUpdatedHook(
new Branch.NameKey(project.getNameKey(), refName),
c.getOldId(),
c.getNewId(),
user.getAccount());
}
}
}

View File

@@ -16,7 +16,6 @@ package com.google.gerrit.server.git;
import com.google.common.collect.HashMultimap;
import com.google.common.collect.Multimap;
import com.google.gerrit.common.ChangeHooks;
import com.google.gerrit.common.Nullable;
import com.google.gerrit.common.data.SubscribeSection;
import com.google.gerrit.reviewdb.client.Account;
@@ -77,7 +76,6 @@ public class SubmoduleOp {
private final ProjectCache projectCache;
private final ProjectState.Factory projectStateFactory;
private final Account account;
private final ChangeHooks changeHooks;
private final boolean verboseSuperProject;
private final boolean enableSuperProjectSubscriptions;
private final MergeOpRepoManager orm;
@@ -91,7 +89,6 @@ public class SubmoduleOp {
ProjectCache projectCache,
ProjectState.Factory projectStateFactory,
@Nullable Account account,
ChangeHooks changeHooks,
@Assisted MergeOpRepoManager orm) {
this.gitmodulesFactory = gitmodulesFactory;
this.myIdent = myIdent;
@@ -99,7 +96,6 @@ public class SubmoduleOp {
this.projectCache = projectCache;
this.projectStateFactory = projectStateFactory;
this.account = account;
this.changeHooks = changeHooks;
this.verboseSuperProject = cfg.getBoolean("submodule",
"verboseSuperprojectUpdate", true);
this.enableSuperProjectSubscriptions = cfg.getBoolean("submodule",
@@ -370,7 +366,6 @@ public class SubmoduleOp {
case NEW:
case FAST_FORWARD:
gitRefUpdated.fire(subscriber.getParentKey(), rfu, account);
changeHooks.doRefUpdatedHook(subscriber, rfu, account);
// TODO since this is performed "in the background" no mail will be
// sent to inform users about the updated branch
break;

View File

@@ -17,7 +17,6 @@ package com.google.gerrit.server.git.strategy;
import static com.google.common.base.Preconditions.checkNotNull;
import com.google.common.collect.Sets;
import com.google.gerrit.common.ChangeHooks;
import com.google.gerrit.extensions.api.changes.ReviewInput.NotifyHandling;
import com.google.gerrit.extensions.client.SubmitType;
import com.google.gerrit.extensions.config.FactoryModule;
@@ -30,6 +29,7 @@ import com.google.gerrit.server.IdentifiedUser;
import com.google.gerrit.server.PatchSetUtil;
import com.google.gerrit.server.account.AccountCache;
import com.google.gerrit.server.change.RebaseChangeOp;
import com.google.gerrit.server.extensions.events.ChangeMerged;
import com.google.gerrit.server.git.BatchUpdate;
import com.google.gerrit.server.git.CodeReviewCommit;
import com.google.gerrit.server.git.CodeReviewCommit.CodeReviewRevWalk;
@@ -100,7 +100,7 @@ public abstract class SubmitStrategy {
final ApprovalsUtil approvalsUtil;
final BatchUpdate.Factory batchUpdateFactory;
final ChangeControl.GenericFactory changeControlFactory;
final ChangeHooks hooks;
final ChangeMerged changeMerged;
final ChangeMessagesUtil cmUtil;
final EmailMerge.Factory mergedSenderFactory;
final GitRepositoryManager repoManager;
@@ -136,7 +136,7 @@ public abstract class SubmitStrategy {
ApprovalsUtil approvalsUtil,
BatchUpdate.Factory batchUpdateFactory,
ChangeControl.GenericFactory changeControlFactory,
ChangeHooks hooks,
ChangeMerged changeMerged,
ChangeMessagesUtil cmUtil,
EmailMerge.Factory mergedSenderFactory,
GitRepositoryManager repoManager,
@@ -165,7 +165,7 @@ public abstract class SubmitStrategy {
this.approvalsUtil = approvalsUtil;
this.batchUpdateFactory = batchUpdateFactory;
this.changeControlFactory = changeControlFactory;
this.hooks = hooks;
this.changeMerged = changeMerged;
this.mergedSenderFactory = mergedSenderFactory;
this.repoManager = repoManager;
this.cmUtil = cmUtil;

View File

@@ -69,10 +69,6 @@ public class SubmitStrategyListener extends BatchUpdate.Listener {
if (args.mergeTip.getCurrentTip().equals(args.mergeTip.getInitialTip())) {
continue;
}
args.hooks.doRefUpdatedHook(args.destBranch,
args.mergeTip.getInitialTip(),
args.mergeTip.getCurrentTip(),
args.accountCache.get(args.caller.getAccountId()).getAccount());
}
}

View File

@@ -523,13 +523,11 @@ abstract class SubmitStrategyOp extends BatchUpdate.Op {
log.error("Cannot email merged notification for " + getId(), e);
}
if (mergeResultRev != null) {
try {
args.hooks.doChangeMergedHook(updatedChange,
args.accountCache.get(submitter.getAccountId()).getAccount(),
mergedPatchSet, ctx.getDb(), args.mergeTip.getCurrentTip().name());
} catch (OrmException ex) {
logError("Cannot run hook for submitted patch set " + getId(), ex);
}
args.changeMerged.fire(
updatedChange,
mergedPatchSet,
args.accountCache.get(submitter.getAccountId()).getAccount(),
args.mergeTip.getCurrentTip().name());
}
}

View File

@@ -15,13 +15,9 @@
package com.google.gerrit.server.git.validators;
import static com.google.gerrit.reviewdb.client.Change.CHANGE_ID_PATTERN;
import static com.google.gerrit.reviewdb.client.RefNames.REFS_CHANGES;
import static com.google.gerrit.reviewdb.client.RefNames.REFS_CONFIG;
import static org.eclipse.jgit.lib.Constants.R_HEADS;
import com.google.common.base.CharMatcher;
import com.google.gerrit.common.ChangeHookRunner.HookResult;
import com.google.gerrit.common.ChangeHooks;
import com.google.gerrit.common.FooterConstants;
import com.google.gerrit.common.Nullable;
import com.google.gerrit.common.PageLinks;
@@ -45,7 +41,6 @@ import com.jcraft.jsch.HostKey;
import org.eclipse.jgit.errors.ConfigInvalidException;
import org.eclipse.jgit.lib.Config;
import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.PersonIdent;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.notes.NoteMap;
@@ -90,7 +85,6 @@ public class CommitValidators {
private final String installCommitMsgHookCommand;
private final SshInfo sshInfo;
private final Repository repo;
private final ChangeHooks hooks;
private final DynamicSet<CommitValidationListener> commitValidationListeners;
@Inject
@@ -98,7 +92,6 @@ public class CommitValidators {
@CanonicalWebUrl @Nullable final String canonicalWebUrl,
@GerritServerConfig final Config config,
final DynamicSet<CommitValidationListener> commitValidationListeners,
final ChangeHooks hooks,
@Assisted final SshInfo sshInfo,
@Assisted final Repository repo, @Assisted final RefControl refControl) {
this.gerritIdent = gerritIdent;
@@ -108,7 +101,6 @@ public class CommitValidators {
config.getString("gerrit", null, "installCommitMsgHookCommand");
this.sshInfo = sshInfo;
this.repo = repo;
this.hooks = hooks;
this.commitValidationListeners = commitValidationListeners;
}
@@ -133,7 +125,6 @@ public class CommitValidators {
validators.add(new ConfigValidator(refControl, repo));
validators.add(new BannedCommitsValidator(rejectCommits));
validators.add(new PluginCommitValidationListener(commitValidationListeners));
validators.add(new ChangeHookValidator(hooks));
List<CommitValidationMessage> messages = new LinkedList<>();
@@ -167,7 +158,6 @@ public class CommitValidators {
}
validators.add(new ConfigValidator(refControl, repo));
validators.add(new PluginCommitValidationListener(commitValidationListeners));
validators.add(new ChangeHookValidator(hooks));
List<CommitValidationMessage> messages = new LinkedList<>();
@@ -569,45 +559,6 @@ public class CommitValidators {
}
}
/** Reject commits that don't pass user-supplied ref-update hook. */
public static class ChangeHookValidator implements
CommitValidationListener {
private final ChangeHooks hooks;
public ChangeHookValidator(ChangeHooks hooks) {
this.hooks = hooks;
}
@Override
public List<CommitValidationMessage> onCommitReceived(
CommitReceivedEvent receiveEvent) throws CommitValidationException {
IdentifiedUser user = receiveEvent.user;
String refname = receiveEvent.refName;
ObjectId old = ObjectId.zeroId();
if (receiveEvent.commit.getParentCount() > 0) {
old = receiveEvent.commit.getParent(0);
}
if (receiveEvent.command.getRefName().startsWith(REFS_CHANGES)) {
/*
* If the ref-update hook tries to distinguish behavior between pushes to
* refs/heads/... and refs/for/..., make sure we send it the correct refname.
* Also, if this is targetting refs/for/, make sure we behave the same as
* what a push to refs/for/ would behave; in particular, setting oldrev to
* 0000000000000000000000000000000000000000.
*/
refname = refname.replace(R_HEADS, "refs/for/refs/heads/");
old = ObjectId.zeroId();
}
HookResult result = hooks.doRefUpdateHook(receiveEvent.project, refname,
user.getAccount(), old, receiveEvent.commit);
if (result != null && result.getExitValue() != 0) {
throw new CommitValidationException(result.toString().trim());
}
return Collections.emptyList();
}
}
private static CommitValidationMessage getInvalidEmailError(RevCommit c, String type,
PersonIdent who, IdentifiedUser currentUser, String canonicalWebUrl) {
StringBuilder sb = new StringBuilder();

View File

@@ -14,7 +14,6 @@
package com.google.gerrit.server.project;
import com.google.gerrit.common.ChangeHooks;
import com.google.gerrit.extensions.api.projects.BranchInfo;
import com.google.gerrit.extensions.api.projects.BranchInput;
import com.google.gerrit.extensions.restapi.AuthException;
@@ -56,7 +55,6 @@ public class CreateBranch implements RestModifyView<ProjectResource, BranchInput
private final GitRepositoryManager repoManager;
private final Provider<ReviewDb> db;
private final GitReferenceUpdated referenceUpdated;
private final ChangeHooks hooks;
private String ref;
@Inject
@@ -64,13 +62,11 @@ public class CreateBranch implements RestModifyView<ProjectResource, BranchInput
GitRepositoryManager repoManager,
Provider<ReviewDb> db,
GitReferenceUpdated referenceUpdated,
ChangeHooks hooks,
@Assisted String ref) {
this.identifiedUser = identifiedUser;
this.repoManager = repoManager;
this.db = db;
this.referenceUpdated = referenceUpdated;
this.hooks = hooks;
this.ref = ref;
}
@@ -136,7 +132,6 @@ public class CreateBranch implements RestModifyView<ProjectResource, BranchInput
referenceUpdated.fire(
name.getParentKey(), u, ReceiveCommand.Type.CREATE,
identifiedUser.get().getAccount());
hooks.doRefUpdatedHook(name, u, identifiedUser.get().getAccount());
break;
case LOCK_FAILURE:
if (repo.getRefDatabase().exactRef(ref) != null) {

View File

@@ -14,7 +14,6 @@
package com.google.gerrit.server.project;
import com.google.gerrit.common.ChangeHooks;
import com.google.gerrit.extensions.restapi.AuthException;
import com.google.gerrit.extensions.restapi.ResourceConflictException;
import com.google.gerrit.extensions.restapi.Response;
@@ -51,18 +50,16 @@ public class DeleteBranch implements RestModifyView<BranchResource, Input> {
private final GitRepositoryManager repoManager;
private final Provider<InternalChangeQuery> queryProvider;
private final GitReferenceUpdated referenceUpdated;
private final ChangeHooks hooks;
@Inject
DeleteBranch(Provider<IdentifiedUser> identifiedUser,
GitRepositoryManager repoManager,
Provider<InternalChangeQuery> queryProvider,
GitReferenceUpdated referenceUpdated, ChangeHooks hooks) {
GitReferenceUpdated referenceUpdated) {
this.identifiedUser = identifiedUser;
this.repoManager = repoManager;
this.queryProvider = queryProvider;
this.referenceUpdated = referenceUpdated;
this.hooks = hooks;
}
@Override
@@ -110,7 +107,6 @@ public class DeleteBranch implements RestModifyView<BranchResource, Input> {
case FORCED:
referenceUpdated.fire(rsrc.getNameKey(), u, ReceiveCommand.Type.DELETE,
identifiedUser.get().getAccount());
hooks.doRefUpdatedHook(rsrc.getBranchKey(), u, identifiedUser.get().getAccount());
break;
case REJECTED_CURRENT_BRANCH:

View File

@@ -17,7 +17,6 @@ package com.google.gerrit.server.project;
import static java.lang.String.format;
import com.google.common.collect.Lists;
import com.google.gerrit.common.ChangeHooks;
import com.google.gerrit.extensions.api.projects.DeleteBranchesInput;
import com.google.gerrit.extensions.restapi.ResourceConflictException;
import com.google.gerrit.extensions.restapi.Response;
@@ -54,19 +53,16 @@ public class DeleteBranches
private final GitRepositoryManager repoManager;
private final Provider<InternalChangeQuery> queryProvider;
private final GitReferenceUpdated referenceUpdated;
private final ChangeHooks hooks;
@Inject
DeleteBranches(Provider<IdentifiedUser> identifiedUser,
GitRepositoryManager repoManager,
Provider<InternalChangeQuery> queryProvider,
GitReferenceUpdated referenceUpdated,
ChangeHooks hooks) {
GitReferenceUpdated referenceUpdated) {
this.identifiedUser = identifiedUser;
this.repoManager = repoManager;
this.queryProvider = queryProvider;
this.referenceUpdated = referenceUpdated;
this.hooks = hooks;
}
@Override
@@ -157,9 +153,5 @@ public class DeleteBranches
private void postDeletion(ProjectResource project, ReceiveCommand cmd) {
referenceUpdated.fire(project.getNameKey(), cmd,
identifiedUser.get().getAccount());
Branch.NameKey branchKey =
new Branch.NameKey(project.getNameKey(), cmd.getRefName());
hooks.doRefUpdatedHook(branchKey, cmd.getOldId(), cmd.getNewId(),
identifiedUser.get().getAccount());
}
}

View File

@@ -17,7 +17,6 @@ package com.google.gerrit.server.project;
import com.google.common.base.CharMatcher;
import com.google.common.base.Joiner;
import com.google.common.base.Strings;
import com.google.gerrit.common.ChangeHooks;
import com.google.gerrit.extensions.api.projects.ConfigInfo;
import com.google.gerrit.extensions.api.projects.ConfigInput;
import com.google.gerrit.extensions.api.projects.ConfigValue;
@@ -28,16 +27,13 @@ import com.google.gerrit.extensions.restapi.ResourceConflictException;
import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
import com.google.gerrit.extensions.restapi.RestModifyView;
import com.google.gerrit.extensions.restapi.RestView;
import com.google.gerrit.reviewdb.client.Branch;
import com.google.gerrit.reviewdb.client.Project;
import com.google.gerrit.reviewdb.client.RefNames;
import com.google.gerrit.server.CurrentUser;
import com.google.gerrit.server.EnableSignedPush;
import com.google.gerrit.server.config.AllProjectsName;
import com.google.gerrit.server.config.PluginConfig;
import com.google.gerrit.server.config.PluginConfigFactory;
import com.google.gerrit.server.config.ProjectConfigEntry;
import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
import com.google.gerrit.server.git.GitRepositoryManager;
import com.google.gerrit.server.git.MetaDataUpdate;
import com.google.gerrit.server.git.ProjectConfig;
@@ -48,7 +44,6 @@ import com.google.inject.Singleton;
import org.eclipse.jgit.errors.ConfigInvalidException;
import org.eclipse.jgit.errors.RepositoryNotFoundException;
import org.eclipse.jgit.lib.ObjectId;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -57,7 +52,6 @@ import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Objects;
@Singleton
public class PutConfig implements RestModifyView<ProjectResource, ConfigInput> {
@@ -74,8 +68,6 @@ public class PutConfig implements RestModifyView<ProjectResource, ConfigInput> {
private final AllProjectsName allProjects;
private final DynamicMap<RestView<ProjectResource>> views;
private final Provider<CurrentUser> user;
private final ChangeHooks hooks;
private final GitReferenceUpdated gitRefUpdated;
@Inject
PutConfig(@EnableSignedPush boolean serverEnableSignedPush,
@@ -88,8 +80,6 @@ public class PutConfig implements RestModifyView<ProjectResource, ConfigInput> {
PluginConfigFactory cfgFactory,
AllProjectsName allProjects,
DynamicMap<RestView<ProjectResource>> views,
ChangeHooks hooks,
GitReferenceUpdated gitRefUpdated,
Provider<CurrentUser> user) {
this.serverEnableSignedPush = serverEnableSignedPush;
this.metaDataUpdateFactory = metaDataUpdateFactory;
@@ -101,8 +91,6 @@ public class PutConfig implements RestModifyView<ProjectResource, ConfigInput> {
this.cfgFactory = cfgFactory;
this.allProjects = allProjects;
this.views = views;
this.hooks = hooks;
this.gitRefUpdated = gitRefUpdated;
this.user = user;
}
@@ -176,16 +164,7 @@ public class PutConfig implements RestModifyView<ProjectResource, ConfigInput> {
md.setMessage("Modified project settings\n");
try {
ObjectId baseRev = projectConfig.getRevision();
ObjectId commitRev = projectConfig.commit(md);
// Only fire hook if project was actually changed.
if (!Objects.equals(baseRev, commitRev)) {
gitRefUpdated.fire(projectName, RefNames.REFS_CONFIG,
baseRev, commitRev, user.get().asIdentifiedUser().getAccount());
hooks.doRefUpdatedHook(
new Branch.NameKey(projectName, RefNames.REFS_CONFIG),
baseRev, commitRev, user.get().asIdentifiedUser().getAccount());
}
projectConfig.commit(md);
projectCache.evict(projectConfig.getProject());
gitMgr.setProjectDescription(projectName, p.getDescription());
} catch (IOException e) {

View File

@@ -16,18 +16,14 @@ package com.google.gerrit.server.project;
import com.google.common.base.MoreObjects;
import com.google.common.base.Strings;
import com.google.gerrit.common.ChangeHooks;
import com.google.gerrit.extensions.api.projects.DescriptionInput;
import com.google.gerrit.extensions.restapi.AuthException;
import com.google.gerrit.extensions.restapi.ResourceConflictException;
import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
import com.google.gerrit.extensions.restapi.Response;
import com.google.gerrit.extensions.restapi.RestModifyView;
import com.google.gerrit.reviewdb.client.Branch;
import com.google.gerrit.reviewdb.client.Project;
import com.google.gerrit.reviewdb.client.RefNames;
import com.google.gerrit.server.IdentifiedUser;
import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
import com.google.gerrit.server.git.GitRepositoryManager;
import com.google.gerrit.server.git.MetaDataUpdate;
import com.google.gerrit.server.git.ProjectConfig;
@@ -36,29 +32,21 @@ import com.google.inject.Singleton;
import org.eclipse.jgit.errors.ConfigInvalidException;
import org.eclipse.jgit.errors.RepositoryNotFoundException;
import org.eclipse.jgit.lib.ObjectId;
import java.io.IOException;
import java.util.Objects;
@Singleton
public class PutDescription implements RestModifyView<ProjectResource, DescriptionInput> {
private final ProjectCache cache;
private final MetaDataUpdate.Server updateFactory;
private final GitRepositoryManager gitMgr;
private final ChangeHooks hooks;
private final GitReferenceUpdated gitRefUpdated;
@Inject
PutDescription(ProjectCache cache,
MetaDataUpdate.Server updateFactory,
ChangeHooks hooks,
GitReferenceUpdated gitRefUpdated,
GitRepositoryManager gitMgr) {
this.cache = cache;
this.updateFactory = updateFactory;
this.hooks = hooks;
this.gitRefUpdated = gitRefUpdated;
this.gitMgr = gitMgr;
}
@@ -89,16 +77,7 @@ public class PutDescription implements RestModifyView<ProjectResource, Descripti
}
md.setAuthor(user);
md.setMessage(msg);
ObjectId baseRev = config.getRevision();
ObjectId commitRev = config.commit(md);
// Only fire hook if project was actually changed.
if (!Objects.equals(baseRev, commitRev)) {
gitRefUpdated.fire(resource.getNameKey(), RefNames.REFS_CONFIG,
baseRev, commitRev, user.getAccount());
hooks.doRefUpdatedHook(
new Branch.NameKey(resource.getNameKey(), RefNames.REFS_CONFIG),
baseRev, commitRev, user.getAccount());
}
config.commit(md);
cache.evict(ctl.getProject());
gitMgr.setProjectDescription(
resource.getNameKey(),

View File

@@ -16,7 +16,6 @@ package com.google.gerrit.server.project;
import com.google.common.base.MoreObjects;
import com.google.common.base.Strings;
import com.google.gerrit.common.ChangeHooks;
import com.google.gerrit.common.data.AccessSection;
import com.google.gerrit.common.data.GlobalCapability;
import com.google.gerrit.common.data.GroupDescription;
@@ -35,15 +34,10 @@ import com.google.gerrit.extensions.restapi.ResourceConflictException;
import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
import com.google.gerrit.extensions.restapi.RestModifyView;
import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
import com.google.gerrit.reviewdb.client.Account;
import com.google.gerrit.reviewdb.client.Branch;
import com.google.gerrit.reviewdb.client.Project;
import com.google.gerrit.reviewdb.client.RefNames;
import com.google.gerrit.server.CurrentUser;
import com.google.gerrit.server.IdentifiedUser;
import com.google.gerrit.server.account.GroupBackend;
import com.google.gerrit.server.config.AllProjectsName;
import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
import com.google.gerrit.server.git.MetaDataUpdate;
import com.google.gerrit.server.git.ProjectConfig;
import com.google.gerrit.server.group.GroupsCollection;
@@ -52,8 +46,6 @@ import com.google.inject.Provider;
import com.google.inject.Singleton;
import org.eclipse.jgit.errors.ConfigInvalidException;
import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.revwalk.RevCommit;
import java.io.IOException;
import java.util.LinkedList;
@@ -68,8 +60,6 @@ public class SetAccess implements
private final Provider<MetaDataUpdate.User> metaDataUpdateFactory;
private final AllProjectsName allProjects;
private final Provider<SetParent> setParent;
private final ChangeHooks hooks;
private final GitReferenceUpdated gitRefUpdated;
private final GetAccess getAccess;
private final ProjectCache projectCache;
private final Provider<IdentifiedUser> identifiedUser;
@@ -79,8 +69,6 @@ public class SetAccess implements
Provider<MetaDataUpdate.User> metaDataUpdateFactory,
AllProjectsName allProjects,
Provider<SetParent> setParent,
ChangeHooks hooks,
GitReferenceUpdated gitRefUpdated,
GroupsCollection groupsCollection,
ProjectCache projectCache,
GetAccess getAccess,
@@ -90,8 +78,6 @@ public class SetAccess implements
this.allProjects = allProjects;
this.setParent = setParent;
this.groupsCollection = groupsCollection;
this.hooks = hooks;
this.gitRefUpdated = gitRefUpdated;
this.getAccess = getAccess;
this.projectCache = projectCache;
this.identifiedUser = identifiedUser;
@@ -109,14 +95,12 @@ public class SetAccess implements
ProjectControl projectControl = rsrc.getControl();
ProjectConfig config;
ObjectId base;
Project.NameKey newParentProjectName = input.parent == null ?
null : new Project.NameKey(input.parent);
try (MetaDataUpdate md = metaDataUpdateUser.create(rsrc.getNameKey())) {
config = ProjectConfig.read(md);
base = config.getRevision();
// Perform removal checks
for (AccessSection section : removals) {
@@ -225,7 +209,8 @@ public class SetAccess implements
md.setMessage("Modify access rules\n");
}
updateProjectConfig(projectControl.getUser(), config, md, base);
config.commit(md);
projectCache.evict(config.getProject());
} catch (InvalidNameException e) {
throw new BadRequestException(e.toString());
} catch (ConfigInvalidException e) {
@@ -293,25 +278,6 @@ public class SetAccess implements
return sections;
}
private void updateProjectConfig(CurrentUser user,
ProjectConfig config, MetaDataUpdate md, ObjectId base)
throws IOException {
RevCommit commit = config.commit(md);
Account account = user.isIdentifiedUser()
? user.asIdentifiedUser().getAccount()
: null;
gitRefUpdated.fire(config.getProject().getNameKey(), RefNames.REFS_CONFIG,
base, commit.getId(), account);
projectCache.evict(config.getProject());
hooks.doRefUpdatedHook(
new Branch.NameKey(config.getProject().getNameKey(),
RefNames.REFS_CONFIG),
base, commit.getId(), user.asIdentifiedUser().getAccount());
}
private void checkGlobalCapabilityPermissions(Project.NameKey projectName)
throws BadRequestException, AuthException {