Add missing call to ref-updated hook for submodule updates

Add call to ref-updated hook when a project ref is updated because of
submodule subscription.

Bug: issue 2831
Change-Id: I176ea044fe4bbb2d5abc596b3da6dcd0a8d3e12f
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/MergeOp.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/MergeOp.java
index d92400e..ac72c2e 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/MergeOp.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/MergeOp.java
@@ -648,14 +648,17 @@
 
   private void fireRefUpdated(RefUpdate branchUpdate) {
     gitRefUpdated.fire(destBranch.getParentKey(), branchUpdate);
+    hooks.doRefUpdatedHook(destBranch, branchUpdate, getAccount(mergeTip));
+  }
 
+  private Account getAccount(CodeReviewCommit codeReviewCommit) {
     Account account = null;
     PatchSetApproval submitter = approvalsUtil.getSubmitter(
-        db, mergeTip.notes(), mergeTip.getPatchsetId());
+        db, codeReviewCommit.notes(), codeReviewCommit.getPatchsetId());
     if (submitter != null) {
       account = accountCache.get(submitter.getAccountId()).getAccount();
     }
-    hooks.doRefUpdatedHook(destBranch, branchUpdate, account);
+    return account;
   }
 
   private void updateChangeStatus(final List<Change> submitted) {
@@ -719,7 +722,8 @@
     if (mergeTip != null && (branchTip == null || branchTip != mergeTip)) {
       SubmoduleOp subOp =
           subOpFactory.create(destBranch, mergeTip, rw, repo,
-              destProject.getProject(), submitted, commits);
+              destProject.getProject(), submitted, commits,
+              getAccount(mergeTip));
       try {
         subOp.update();
       } catch (SubmoduleException e) {
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/ReceiveCommits.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/ReceiveCommits.java
index 625c757..0a8b198 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/ReceiveCommits.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/ReceiveCommits.java
@@ -2258,7 +2258,8 @@
           subOpFactory.create(
               new Branch.NameKey(project.getNameKey(), cmd.getRefName()),
               codeReviewCommit, rw, repo, project, new ArrayList<Change>(),
-              new HashMap<Change.Id, CodeReviewCommit>());
+              new HashMap<Change.Id, CodeReviewCommit>(),
+              currentUser.getAccount());
       subOp.update();
     } catch (InsertException e) {
       log.error("Can't insert patchset", e);
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/SubmoduleOp.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/SubmoduleOp.java
index 5424887..6cf6e25 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/SubmoduleOp.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/SubmoduleOp.java
@@ -14,7 +14,9 @@
 
 package com.google.gerrit.server.git;
 
+import com.google.gerrit.common.ChangeHooks;
 import com.google.gerrit.common.Nullable;
+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.Project;
@@ -67,7 +69,7 @@
   public interface Factory {
     SubmoduleOp create(Branch.NameKey destBranch, RevCommit mergeTip,
         RevWalk rw, Repository db, Project destProject, List<Change> submitted,
-        Map<Change.Id, CodeReviewCommit> commits);
+        Map<Change.Id, CodeReviewCommit> commits, Account account);
   }
 
   private static final Logger log = LoggerFactory.getLogger(SubmoduleOp.class);
@@ -87,6 +89,8 @@
   private final GitReferenceUpdated gitRefUpdated;
   private final SchemaFactory<ReviewDb> schemaFactory;
   private final Set<Branch.NameKey> updatedSubscribers;
+  private final Account account;
+  private final ChangeHooks changeHooks;
 
   @Inject
   public SubmoduleOp(@Assisted final Branch.NameKey destBranch,
@@ -96,7 +100,8 @@
       @Assisted Project destProject, @Assisted List<Change> submitted,
       @Assisted final Map<Change.Id, CodeReviewCommit> commits,
       @GerritPersonIdent final PersonIdent myIdent,
-      GitRepositoryManager repoManager, GitReferenceUpdated gitRefUpdated) {
+      GitRepositoryManager repoManager, GitReferenceUpdated gitRefUpdated,
+      @Assisted Account account, ChangeHooks changeHooks) {
     this.destBranch = destBranch;
     this.mergeTip = mergeTip;
     this.rw = rw;
@@ -109,6 +114,8 @@
     this.myIdent = myIdent;
     this.repoManager = repoManager;
     this.gitRefUpdated = gitRefUpdated;
+    this.account = account;
+    this.changeHooks = changeHooks;
 
     updatedSubscribers = new HashSet<Branch.NameKey>();
   }
@@ -341,6 +348,7 @@
         case NEW:
         case FAST_FORWARD:
           gitRefUpdated.fire(subscriber.getParentKey(), rfu);
+          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;
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/git/SubmoduleOpTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/git/SubmoduleOpTest.java
index 33ba36e..7dc6bf9 100644
--- a/gerrit-server/src/test/java/com/google/gerrit/server/git/SubmoduleOpTest.java
+++ b/gerrit-server/src/test/java/com/google/gerrit/server/git/SubmoduleOpTest.java
@@ -15,6 +15,7 @@
 package com.google.gerrit.server.git;
 
 import static org.easymock.EasyMock.capture;
+import static org.easymock.EasyMock.createNiceMock;
 import static org.easymock.EasyMock.createStrictMock;
 import static org.easymock.EasyMock.eq;
 import static org.easymock.EasyMock.expect;
@@ -22,6 +23,7 @@
 import static org.easymock.EasyMock.verify;
 import static org.junit.Assert.assertEquals;
 
+import com.google.gerrit.common.ChangeHooks;
 import com.google.gerrit.reviewdb.client.Account;
 import com.google.gerrit.reviewdb.client.Branch;
 import com.google.gerrit.reviewdb.client.Change;
@@ -79,6 +81,7 @@
   private Provider<String> urlProvider;
   private GitRepositoryManager repoManager;
   private GitReferenceUpdated gitRefUpdated;
+  private ChangeHooks changeHooks;
 
   @SuppressWarnings("unchecked")
   @Override
@@ -92,6 +95,7 @@
     urlProvider = createStrictMock(Provider.class);
     repoManager = createStrictMock(GitRepositoryManager.class);
     gitRefUpdated = createStrictMock(GitReferenceUpdated.class);
+    changeHooks = createNiceMock(ChangeHooks.class);
   }
 
   private void doReplay() {
@@ -138,7 +142,7 @@
     final SubmoduleOp submoduleOp =
         new SubmoduleOp(branchNameKey, mergeTip, new RevWalk(realDb), urlProvider,
             schemaFactory, realDb, null, new ArrayList<Change>(), null, null,
-            null, null);
+            null, null, null, null);
 
     submoduleOp.update();
 
@@ -665,7 +669,8 @@
         new SubmoduleOp(sourceBranchNameKey, sourceMergeTip, new RevWalk(
             sourceRepository), urlProvider, schemaFactory, sourceRepository,
             new Project(sourceBranchNameKey.getParentKey()), submitted,
-            mergedCommits, myIdent, repoManager, gitRefUpdated);
+            mergedCommits, myIdent, repoManager, gitRefUpdated, null,
+            changeHooks);
 
     submoduleOp.update();
 
@@ -770,7 +775,7 @@
         new SubmoduleOp(sourceBranchNameKey, sourceMergeTip, new RevWalk(
             sourceRepository), urlProvider, schemaFactory, sourceRepository,
             new Project(sourceBranchNameKey.getParentKey()), submitted,
-            mergedCommits, myIdent, repoManager, gitRefUpdated);
+            mergedCommits, myIdent, repoManager, gitRefUpdated, null, changeHooks);
 
     submoduleOp.update();
 
@@ -927,7 +932,7 @@
         new SubmoduleOp(mergedBranch, mergeTip, new RevWalk(realDb),
             urlProvider, schemaFactory, realDb, new Project(mergedBranch
                 .getParentKey()), new ArrayList<Change>(), null, null,
-            repoManager, null);
+            repoManager, null, null, null);
 
     submoduleOp.update();
   }