Skip to content

Commit bd295bd

Browse files
committed
ci/tag-maintainers: run treefmt
1 parent 03fa28a commit bd295bd

File tree

1 file changed

+92
-36
lines changed

1 file changed

+92
-36
lines changed

ci/tag-maintainers/manage-reviewers.py

Lines changed: 92 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545

4646
class GHError(Exception):
4747
"""Custom exception for errors related to 'gh' CLI commands."""
48+
4849
pass
4950

5051

@@ -75,20 +76,35 @@ def get_manually_requested_reviewers(
7576
) -> set[str]:
7677
"""Fetches a set of reviewers who were manually requested by someone other than the bot."""
7778
try:
78-
result = run_gh_command([
79-
"api", "graphql",
80-
"-f", f"query={MANUAL_REVIEW_REQUEST_QUERY}",
81-
"-F", f"owner={owner}",
82-
"-F", f"repo={repo}",
83-
"-F", f"prNumber={pr_number}",
84-
])
79+
result = run_gh_command(
80+
[
81+
"api",
82+
"graphql",
83+
"-f",
84+
f"query={MANUAL_REVIEW_REQUEST_QUERY}",
85+
"-F",
86+
f"owner={owner}",
87+
"-F",
88+
f"repo={repo}",
89+
"-F",
90+
f"prNumber={pr_number}",
91+
]
92+
)
8593
data = json.loads(result.stdout)
86-
nodes = data.get("data", {}).get("repository", {}).get("pullRequest", {}).get("timelineItems", {}).get("nodes", [])
94+
nodes = (
95+
data.get("data", {})
96+
.get("repository", {})
97+
.get("pullRequest", {})
98+
.get("timelineItems", {})
99+
.get("nodes", [])
100+
)
87101

88102
manually_requested = {
89103
node["requestedReviewer"]["login"]
90104
for node in nodes
91-
if node and node.get("requestedReviewer") and node.get("actor", {}).get("login") != bot_user_name
105+
if node
106+
and node.get("requestedReviewer")
107+
and node.get("actor", {}).get("login") != bot_user_name
92108
}
93109
return manually_requested
94110
except (GHError, json.JSONDecodeError, KeyError) as e:
@@ -109,15 +125,28 @@ def get_users_from_gh(args: list[str], error_message: str) -> set[str]:
109125
def get_pending_reviewers(pr_number: int) -> set[str]:
110126
"""Gets the set of currently pending reviewers for a PR."""
111127
return get_users_from_gh(
112-
["pr", "view", str(pr_number), "--json", "reviewRequests", "--jq", ".reviewRequests[].login"],
128+
[
129+
"pr",
130+
"view",
131+
str(pr_number),
132+
"--json",
133+
"reviewRequests",
134+
"--jq",
135+
".reviewRequests[].login",
136+
],
113137
"Error getting pending reviewers",
114138
)
115139

116140

117141
def get_past_reviewers(owner: str, repo: str, pr_number: int) -> set[str]:
118142
"""Gets the set of users who have already reviewed the PR."""
119143
return get_users_from_gh(
120-
["api", f"repos/{owner}/{repo}/pulls/{pr_number}/reviews", "--jq", ".[].user.login"],
144+
[
145+
"api",
146+
f"repos/{owner}/{repo}/pulls/{pr_number}/reviews",
147+
"--jq",
148+
".[].user.login",
149+
],
121150
"Error getting past reviewers",
122151
)
123152

@@ -128,17 +157,14 @@ def is_collaborator(owner: str, repo: str, username: str) -> bool:
128157
Handles 404 as a non-collaborator, while other errors are raised.
129158
"""
130159
result = run_gh_command(
131-
["api", f"repos/{owner}/{repo}/collaborators/{username}"],
132-
check=False
160+
["api", f"repos/{owner}/{repo}/collaborators/{username}"], check=False
133161
)
134162

135163
if result.returncode == 0:
136164
return True
137165

138166
if "HTTP 404" in result.stderr:
139-
logging.error(
140-
"'%s' is not a collaborator in this repository.", username
141-
)
167+
logging.error("'%s' is not a collaborator in this repository.", username)
142168
return False
143169
else:
144170
logging.error(
@@ -161,22 +187,32 @@ def update_reviewers(
161187
if reviewers_to_add:
162188
logging.info("Requesting reviews from: %s", ", ".join(reviewers_to_add))
163189
try:
164-
run_gh_command([
165-
"pr", "edit", str(pr_number),
166-
"--add-reviewer", ",".join(reviewers_to_add)
167-
])
190+
run_gh_command(
191+
[
192+
"pr",
193+
"edit",
194+
str(pr_number),
195+
"--add-reviewer",
196+
",".join(reviewers_to_add),
197+
]
198+
)
168199
except GHError as e:
169200
logging.error("Failed to add reviewers: %s", e)
170201

171202
if reviewers_to_remove and owner and repo:
172-
logging.info("Removing review requests from: %s", ", ".join(reviewers_to_remove))
203+
logging.info(
204+
"Removing review requests from: %s", ", ".join(reviewers_to_remove)
205+
)
173206
payload = json.dumps({"reviewers": list(reviewers_to_remove)})
174207
try:
175208
run_gh_command(
176209
[
177-
"api", "--method", "DELETE",
210+
"api",
211+
"--method",
212+
"DELETE",
178213
f"repos/{owner}/{repo}/pulls/{pr_number}/requested_reviewers",
179-
"--input", "-",
214+
"--input",
215+
"-",
180216
],
181217
input_data=payload,
182218
)
@@ -186,14 +222,28 @@ def update_reviewers(
186222

187223
def main() -> None:
188224
"""Main function to handle command-line arguments and manage reviewers."""
189-
parser = argparse.ArgumentParser(description="Manage pull request reviewers for Nixvim.")
225+
parser = argparse.ArgumentParser(
226+
description="Manage pull request reviewers for Nixvim."
227+
)
190228
parser.add_argument("--owner", required=True, help="Repository owner.")
191229
parser.add_argument("--repo", required=True, help="Repository name.")
192-
parser.add_argument("--pr-number", type=int, required=True, help="Pull request number.")
230+
parser.add_argument(
231+
"--pr-number", type=int, required=True, help="Pull request number."
232+
)
193233
parser.add_argument("--pr-author", required=True, help="PR author's username.")
194-
parser.add_argument("--current-maintainers", default="", help="Space-separated list of current maintainers.")
195-
parser.add_argument("--changed-files", default="", help="Newline-separated list of changed files.")
196-
parser.add_argument("--bot-user-name", default="", help="Bot user name to distinguish manual vs automated review requests.")
234+
parser.add_argument(
235+
"--current-maintainers",
236+
default="",
237+
help="Space-separated list of current maintainers.",
238+
)
239+
parser.add_argument(
240+
"--changed-files", default="", help="Newline-separated list of changed files."
241+
)
242+
parser.add_argument(
243+
"--bot-user-name",
244+
default="",
245+
help="Bot user name to distinguish manual vs automated review requests.",
246+
)
197247
args = parser.parse_args()
198248

199249
no_plugin_files = not args.changed_files.strip()
@@ -202,12 +252,14 @@ def main() -> None:
202252
maintainers: set[str] = set(args.current_maintainers.split())
203253
pending_reviewers = get_pending_reviewers(args.pr_number)
204254
past_reviewers = get_past_reviewers(args.owner, args.repo, args.pr_number)
205-
manually_requested = get_manually_requested_reviewers(args.owner, args.repo, args.pr_number, args.bot_user_name)
255+
manually_requested = get_manually_requested_reviewers(
256+
args.owner, args.repo, args.pr_number, args.bot_user_name
257+
)
206258

207-
logging.info("Current Maintainers: %s", ' '.join(maintainers) or "None")
208-
logging.info("Pending Reviewers: %s", ' '.join(pending_reviewers) or "None")
209-
logging.info("Past Reviewers: %s", ' '.join(past_reviewers) or "None")
210-
logging.info("Manually Requested: %s", ' '.join(manually_requested) or "None")
259+
logging.info("Current Maintainers: %s", " ".join(maintainers) or "None")
260+
logging.info("Pending Reviewers: %s", " ".join(pending_reviewers) or "None")
261+
logging.info("Past Reviewers: %s", " ".join(past_reviewers) or "None")
262+
logging.info("Manually Requested: %s", " ".join(manually_requested) or "None")
211263

212264
# --- 2. Determine reviewers to remove ---
213265
reviewers_to_remove: set[str] = set()
@@ -224,7 +276,7 @@ def main() -> None:
224276
args.pr_number,
225277
owner=args.owner,
226278
repo=args.repo,
227-
reviewers_to_remove=reviewers_to_remove
279+
reviewers_to_remove=reviewers_to_remove,
228280
)
229281
else:
230282
logging.info("No reviewers to remove.")
@@ -236,12 +288,16 @@ def main() -> None:
236288
potential_reviewers = maintainers - users_to_exclude
237289

238290
reviewers_to_add = {
239-
user for user in potential_reviewers if is_collaborator(args.owner, args.repo, user)
291+
user
292+
for user in potential_reviewers
293+
if is_collaborator(args.owner, args.repo, user)
240294
}
241295

242296
non_collaborators = potential_reviewers - reviewers_to_add
243297
if non_collaborators:
244-
logging.warning("Ignoring non-collaborators: %s", ", ".join(non_collaborators))
298+
logging.warning(
299+
"Ignoring non-collaborators: %s", ", ".join(non_collaborators)
300+
)
245301

246302
if reviewers_to_add:
247303
update_reviewers(args.pr_number, reviewers_to_add=reviewers_to_add)

0 commit comments

Comments
 (0)