ReviewDbBatchUpdate: Avoid NPE when updating All-Users
If one change-update in a batch affects All-Users it is assumed that
all ChangeTasks updates NoteDb. This is not true when a stack of
changes is pushed and the changes(s) at the bottom of the stack are not
updated, existing last patchset is pushed.
Bug: Issue 11442
Change-Id: I0c828635920cc437da3da20785d3882a2e68d086
diff --git a/java/com/google/gerrit/server/update/ReviewDbBatchUpdate.java b/java/com/google/gerrit/server/update/ReviewDbBatchUpdate.java
index c67ee8a..cab96e5 100644
--- a/java/com/google/gerrit/server/update/ReviewDbBatchUpdate.java
+++ b/java/com/google/gerrit/server/update/ReviewDbBatchUpdate.java
@@ -548,6 +548,9 @@
int objs = 0;
BatchRefUpdate allUsersRefUpdate = allUsersRepo.getRefDatabase().newBatchUpdate();
for (ChangeTask task : tasks) {
+ if (task.noteDbResult == null) {
+ continue;
+ }
for (ReceiveCommand cmd : task.noteDbResult.allUsersCommands()) {
allUsersRefUpdate.addCommand(cmd);
}
diff --git a/javatests/com/google/gerrit/acceptance/git/AbstractPushForReview.java b/javatests/com/google/gerrit/acceptance/git/AbstractPushForReview.java
index 8e14330..398ed84 100644
--- a/javatests/com/google/gerrit/acceptance/git/AbstractPushForReview.java
+++ b/javatests/com/google/gerrit/acceptance/git/AbstractPushForReview.java
@@ -2203,6 +2203,18 @@
}
@Test
+ public void noEditAndUpdateAllUsersInSameChangeStack() throws Exception {
+ assume().that(notesMigration.readChanges()).isTrue();
+ List<RevCommit> commits = createChanges(2, "refs/for/master");
+ String id2 = byCommit(commits.get(1)).change().getKey().get();
+ addDraft(id2, commits.get(1).name(), newDraft(FILE_NAME, 1, "comment2"));
+ // First change in stack unchanged.
+ RevCommit unChanged = commits.remove(0);
+ // Publishing draft comments on change 2 updates All-Users.
+ amendChanges(unChanged.toObjectId(), commits, "refs/for/master%publish-comments");
+ }
+
+ @Test
public void pushWithDraftOptionIsDisabledPerDefault() throws Exception {
for (String ref : ImmutableSet.of("refs/drafts/master", "refs/for/master%draft")) {
PushOneCommit.Result r = pushTo(ref);