Preserve negative approvals when replacing patch sets

Prior versions of Gerrit correctly saved a negative approval when
a replacement patch set was uploaded.  This was a specific feature
we added to allow project leads to reject a change until they are
satisfied with the replacement, even if other developers on that
project were able to review and approve subsequent patch sets.

Since approvals are now per-patch set we have to copy the approval
records from the prior patch set to this one, if the value is < 0.

Signed-off-by: Shawn O. Pearce <sop@google.com>
This commit is contained in:
Shawn O. Pearce
2009-08-10 17:21:55 -07:00
parent 31e55395a0
commit 961904c8fa
2 changed files with 20 additions and 0 deletions

View File

@@ -98,6 +98,14 @@ public final class PatchSetApproval {
setGranted();
}
public PatchSetApproval(final PatchSet.Id psId, final PatchSetApproval src) {
key =
new PatchSetApproval.Key(psId, src.getAccountId(), src.getCategoryId());
changeOpen = true;
value = src.getValue();
granted = src.granted;
}
public PatchSetApproval.Key getKey() {
return key;
}

View File

@@ -810,6 +810,7 @@ final class Receive extends AbstractGitCommand {
change = changeCache.get(changeId);
}
final PatchSet.Id priorPatchSet = change.currentPatchSetId();
final HashSet<ObjectId> existingRevisions = new HashSet<ObjectId>();
for (final PatchSet ps : db.patchSets().byChange(changeId)) {
if (ps.getRevision() != null) {
@@ -893,6 +894,17 @@ final class Receive extends AbstractGitCommand {
oldCC.add(a.getAccountId());
}
if (a.getValue() < 0
&& a.getPatchSetId().equals(priorPatchSet)) {
// If there was a negative vote on the prior patch set, carry it
// into this patch set.
//
db.patchSetApprovals()
.insert(
Collections.singleton(new PatchSetApproval(ps.getId(), a)),
txn);
}
if (!haveAuthor && authorId != null
&& a.getAccountId().equals(authorId)) {
haveAuthor = true;