[verified] Handle requested reviewer presentation order

This commit is contained in:
2026-10-11 11:30:59 +00:00
parent 17751f65fe
commit d46f5c4a09
3 changed files with 195 additions and 6 deletions
@@ -525,11 +525,12 @@ def _target_snapshot(snapshot, target):
def _projection_contract(contract):
if contract is None:
return False, False, None
return False, False, None, False
if type(contract) is not dict or type(contract.get("version")) is not dict or contract["version"].get("version") != "1.27.3":
_fail("unsupported provider projection contract")
flags = []
for key in ("supersession_same_author_only", "already_dismissed_review_timestamp_projection"):
for key in ("supersession_same_author_only", "already_dismissed_review_timestamp_projection",
"requested_reviewers_presentation_order"):
value = contract.get(key, False)
if type(value) is not bool:
_fail("invalid provider projection contract")
@@ -537,7 +538,7 @@ def _projection_contract(contract):
official = contract.get("expected_official")
if official is not None and type(official) is not bool:
_fail("invalid provider review policy")
return flags[0], flags[1], official
return flags[0], flags[1], official, flags[2]
def verify_publication(before, after, exact_review, result, allowed_paths, reviewer_id, inline_comments, provider_contract=None, *, expected_pr_url):
@@ -553,7 +554,7 @@ def verify_publication(before, after, exact_review, result, allowed_paths, revie
_fail("snapshot PR URL mismatch")
if _user_id(before["pr"]) == reviewer_id:
_fail("reviewer is PR author")
supersede, retouch, expected_official = _projection_contract(provider_contract)
supersede, retouch, expected_official, reviewer_presentation_order = _projection_contract(provider_contract)
old_reviews, reviews = _index(before["reviews"]), _index(after["reviews"])
if type(exact_review) is not dict:
_fail("invalid exact review")
@@ -604,7 +605,16 @@ def verify_publication(before, after, exact_review, result, allowed_paths, revie
_fail("review count projection mismatch")
old_requested = _index(bpr.get("requested_reviewers"))
requested = _index(apr.get("requested_reviewers"))
if not _same(bpr["requested_reviewers"], apr["requested_reviewers"]):
if reviewer_presentation_order:
# Only this explicitly version-bound collection has presentation order.
if set(old_requested) - set(requested) or (set(requested) - set(old_requested)) - {reviewer_id}:
_fail("requested reviewers projection mismatch")
for old_id, old in old_requested.items():
if not _same(old, requested[old_id]):
_fail("previous requested reviewers changed")
if reviewer_id in set(requested) - set(old_requested) and not _same(requested[reviewer_id], exact_review.get("user")):
_fail("new requested reviewer user mismatch")
elif not _same(bpr["requested_reviewers"], apr["requested_reviewers"]):
if reviewer_id in old_requested or set(requested) - set(old_requested) != {reviewer_id} or set(old_requested) - set(requested):
_fail("requested reviewers projection mismatch")
if not _same([x for x in apr["requested_reviewers"] if x["id"] != reviewer_id], bpr["requested_reviewers"]):