Skip to content

Commit 6da080c

Browse files
committed
upload: Don't re-add assignees/reviewers that were removed
If an assignee/reviewer was removed intentionally, don't re-add them. Add a --force-reviewers flag to bypass this that defaults to false
1 parent e7e8717 commit 6da080c

5 files changed

Lines changed: 62 additions & 2 deletions

File tree

‎docs/upload.md‎

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ revup upload - Modify or create code reviews.
99
`[--rebase] [--relative-chain] [--skip-confirm] [--dry-run] [--push-only]`
1010
`[--status] [--no-update-pr-body] [--review-graph]`
1111
`[--trim-tags] [--create-local-branches] [--patchsets] [--auto-add-users=<o>]`
12-
`[--labels=<labels>] [<topics>]`
12+
`[--force-reviewers] [--labels=<labels>] [<topics>]`
1313

1414
# DESCRIPTION
1515

@@ -209,6 +209,9 @@ the above section for details.
209209
: Specifies a comma separated list of colon separated username mappings. These
210210
mappings are used to transform usernames specified in Reviewers/Assignees.
211211

212+
**--force-reviewers**
213+
: Re-add reviewers and assignees even if they were manually removed from the PR.
214+
212215
**--auto-add-users**
213216
: If "no", do nothing extra. If "r2a", add users from the Reviewers tag as assignees.
214217
If "a2r", add users from the Assignees tag as reviewers. If "both", do both of the previous.

‎revup/github_utils.py‎

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,10 @@ class PrInfo:
5050
assignee_ids: Set[str] = field(default_factory=set)
5151
labels: Set[str] = field(default_factory=set)
5252
label_ids: Set[str] = field(default_factory=set)
53+
removed_reviewers: Set[str] = field(default_factory=set)
54+
removed_reviewer_ids: Set[str] = field(default_factory=set)
55+
removed_assignees: Set[str] = field(default_factory=set)
56+
removed_assignee_ids: Set[str] = field(default_factory=set)
5357
is_draft: bool = False
5458
comments: List[PrComment] = field(default_factory=list)
5559

@@ -225,6 +229,26 @@ async def query_everything(
225229
}}
226230
}}
227231
}}
232+
timelineItems(itemTypes: [REVIEW_REQUEST_REMOVED_EVENT, UNASSIGNED_EVENT], first: 50) {{
233+
nodes {{
234+
... on ReviewRequestRemovedEvent {{
235+
requestedReviewer {{
236+
... on User {{
237+
login
238+
id
239+
}}
240+
}}
241+
}}
242+
... on UnassignedEvent {{
243+
assignee {{
244+
... on User {{
245+
login
246+
id
247+
}}
248+
}}
249+
}}
250+
}}
251+
}}
228252
latestReviews (first: 25) {{
229253
nodes {{
230254
author {{
@@ -317,6 +341,20 @@ async def query_everything(
317341
for c in this_node["comments"]["nodes"]:
318342
comments.append(PrComment(c["body"], c["id"]))
319343

344+
removed_reviewers: Set[str] = set()
345+
removed_reviewer_ids: Set[str] = set()
346+
removed_assignees: Set[str] = set()
347+
removed_assignee_ids: Set[str] = set()
348+
for event in this_node["timelineItems"]["nodes"]:
349+
rr = event.get("requestedReviewer")
350+
if rr and "login" in rr and rr["login"] not in reviewers:
351+
removed_reviewers.add(rr["login"])
352+
removed_reviewer_ids.add(rr["id"])
353+
assignee = event.get("assignee")
354+
if assignee and "login" in assignee and assignee["login"] not in assignees:
355+
removed_assignees.add(assignee["login"])
356+
removed_assignee_ids.add(assignee["id"])
357+
320358
prs.append(
321359
PrInfo(
322360
id=this_node["id"],
@@ -333,6 +371,10 @@ async def query_everything(
333371
assignee_ids=assignee_ids,
334372
labels=pr_labels,
335373
label_ids=pr_label_ids,
374+
removed_reviewers=removed_reviewers,
375+
removed_reviewer_ids=removed_reviewer_ids,
376+
removed_assignees=removed_assignees,
377+
removed_assignee_ids=removed_assignee_ids,
336378
is_draft=this_node["isDraft"],
337379
state=this_node["state"],
338380
comments=comments,

‎revup/revup.py‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,7 @@ def build_parser() -> Tuple[RevupArgParser, List[RevupArgParser]]:
192192
upload_parser.add_argument("--pre-upload", "-p")
193193
upload_parser.add_argument("--relative-chain", "-c", action="store_true")
194194
upload_parser.add_argument("--auto-topic", "-a", action="store_true")
195+
upload_parser.add_argument("--force-reviewers", action="store_true")
195196
upload_parser.add_argument("--head", default="HEAD")
196197

197198
restack_parser.add_argument("--topicless-last", "-t", action="store_true")

‎revup/topic_stack.py‎

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1142,6 +1142,7 @@ async def query_github(self) -> None:
11421142
def populate_update_info(
11431143
self,
11441144
update_pr_body_arg: bool,
1145+
force_reviewers: bool = False,
11451146
) -> None:
11461147
"""
11471148
Populate information necessary to do PR creation / update in github.
@@ -1214,6 +1215,19 @@ def populate_update_info(
12141215
topic.tags[TAG_ASSIGNEE], self.names_to_logins
12151216
).difference(review.pr_info.assignees)
12161217

1218+
if not force_reviewers:
1219+
removed = reviewer_logins & review.pr_info.removed_reviewers
1220+
if removed:
1221+
logging.warning(f"Skipping removed reviewer(s) {removed} for {topic.name}")
1222+
reviewer_logins -= removed
1223+
reviewer_ids -= review.pr_info.removed_reviewer_ids
1224+
1225+
removed = assignee_logins & review.pr_info.removed_assignees
1226+
if removed:
1227+
logging.warning(f"Skipping removed assignee(s) {removed} for {topic.name}")
1228+
assignee_logins -= removed
1229+
assignee_ids -= review.pr_info.removed_assignee_ids
1230+
12171231
if TAG_UPDATE_PR_BODY in topic.tags:
12181232
update_pr_body = min(topic.tags[TAG_UPDATE_PR_BODY]).lower() == "true"
12191233
else:

‎revup/upload.py‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ async def main(
7070
return 0
7171

7272
if not args.push_only:
73-
topics.populate_update_info(args.update_pr_body)
73+
topics.populate_update_info(args.update_pr_body, args.force_reviewers)
7474
if not args.skip_confirm and topics.num_reviews_changed() > 0:
7575
topics.print(not args.verbose)
7676
if git_ctx.sh.wait_for_confirmation():

0 commit comments

Comments
 (0)