[verified] Handle requested reviewer presentation order
This commit is contained in:
+15
-5
@@ -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"]):
|
||||
|
||||
Reference in New Issue
Block a user