diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/ApprovalCopier.java b/gerrit-server/src/main/java/com/google/gerrit/server/ApprovalCopier.java index 03f109cecf..989f6f34c7 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/ApprovalCopier.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/ApprovalCopier.java @@ -76,13 +76,13 @@ public class ApprovalCopier { this.changeDataFactory = changeDataFactory; } - public void copy(ReviewDb db, ChangeControl ctl, PatchSet.Id psId) + public void copy(ReviewDb db, ChangeControl ctl, PatchSet ps) throws OrmException { - db.patchSetApprovals().insert(getForPatchSet(db, ctl, psId)); + db.patchSetApprovals().insert(getForPatchSet(db, ctl, ps)); } private List getForPatchSet(ReviewDb db, ChangeControl ctl, - PatchSet.Id psId) throws OrmException { + PatchSet ps) throws OrmException { ChangeData cd = changeDataFactory.create(db, ctl); try { ProjectState project = @@ -91,23 +91,21 @@ public class ApprovalCopier { Table byUser = HashBasedTable.create(); - for (PatchSetApproval psa : all.get(psId)) { + for (PatchSetApproval psa : all.get(ps.getId())) { byUser.put(psa.getLabel(), psa.getAccountId(), psa); } TreeMap patchSets = getPatchSets(cd); NavigableSet allPsIds = patchSets.navigableKeySet(); - PatchSet currPs = patchSets.get(psId.get()); - if (currPs == null) { - throw new OrmException("missing patch set " + psId); - } Repository repo = repoManager.openRepository(project.getProject().getNameKey()); try { - // Walk patch sets strictly less than psId in descending order. - for (PatchSet priorPs - : patchSets.descendingMap().tailMap(psId.get(), false).values()) { + // Walk patch sets strictly less than current in descending order. + Collection allPrior = patchSets.descendingMap() + .tailMap(ps.getId().get(), false) + .values(); + for (PatchSet priorPs : allPrior) { List priorApprovals = all.get(priorPs.getId()); if (priorApprovals.isEmpty()) { continue; @@ -115,12 +113,13 @@ public class ApprovalCopier { ChangeKind kind = changeKindCache.getChangeKind(project, repo, ObjectId.fromString(priorPs.getRevision().get()), - ObjectId.fromString(currPs.getRevision().get())); + ObjectId.fromString(ps.getRevision().get())); for (PatchSetApproval psa : priorApprovals) { if (!byUser.contains(psa.getLabel(), psa.getAccountId()) - && canCopy(project, psa, psId, allPsIds, kind)) { - byUser.put(psa.getLabel(), psa.getAccountId(), copy(psa, psId)); + && canCopy(project, psa, ps.getId(), allPsIds, kind)) { + byUser.put(psa.getLabel(), psa.getAccountId(), + copy(psa, ps.getId())); } } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/PatchSetInserter.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/PatchSetInserter.java index ccd64ecad2..945c201ba0 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/PatchSetInserter.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/PatchSetInserter.java @@ -272,7 +272,7 @@ public class PatchSetInserter { } if (copyLabels) { - approvalCopier.copy(db, ctl, patchSet.getId()); + approvalCopier.copy(db, ctl, patchSet); } db.commit(); update.commit(); 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 0c0ed07021..a27ea40df6 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 @@ -1862,7 +1862,7 @@ public class ReceiveCommits { ChangeData cd = changeDataFactory.create(db, changeCtl); MailRecipients oldRecipients = getRecipientsFromReviewers(cd.reviewers()); - approvalCopier.copy(db, changeCtl, newPatchSet.getId()); + approvalCopier.copy(db, changeCtl, newPatchSet); approvalsUtil.addReviewers(db, update, labelTypes, change, newPatchSet, info, recipients.getReviewers(), oldRecipients.getAll()); recipients.add(oldRecipients);