Skip to content

Commit 0d5ae36

Browse files
authored
workflows/commit-access-review: Use Python APIs for graphql queries (#108903)
1 parent c49d809 commit 0d5ae36

File tree

3 files changed

+55
-76
lines changed

3 files changed

+55
-76
lines changed

.github/workflows/commit-access-review.py

Lines changed: 46 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -62,57 +62,9 @@ def __repr__(self):
6262
)
6363

6464

65-
def run_graphql_query(
66-
query: str, variables: dict, token: str, retry: bool = True
67-
) -> dict:
68-
"""
69-
This function submits a graphql query and returns the results as a
70-
dictionary.
71-
"""
72-
s = requests.Session()
73-
retries = requests.adapters.Retry(total=8, backoff_factor=2, status_forcelist=[504])
74-
s.mount("https://", requests.adapters.HTTPAdapter(max_retries=retries))
75-
76-
headers = {
77-
"Authorization": "bearer {}".format(token),
78-
# See
79-
# https://github.blog/2021-11-16-graphql-global-id-migration-update/
80-
"X-Github-Next-Global-ID": "1",
81-
}
82-
request = s.post(
83-
url="https://api.github.com/graphql",
84-
json={"query": query, "variables": variables},
85-
headers=headers,
86-
)
87-
88-
rate_limit = request.headers.get("X-RateLimit-Remaining")
89-
print(rate_limit)
90-
if rate_limit and int(rate_limit) < 10:
91-
reset_time = int(request.headers["X-RateLimit-Reset"])
92-
while reset_time - int(time.time()) > 0:
93-
time.sleep(60)
94-
print(
95-
"Waiting until rate limit reset",
96-
reset_time - int(time.time()),
97-
"seconds remaining",
98-
)
99-
100-
if request.status_code == 200:
101-
if "data" not in request.json():
102-
print(request.json())
103-
sys.exit(1)
104-
return request.json()["data"]
105-
elif retry:
106-
return run_graphql_query(query, variables, token, False)
107-
else:
108-
raise Exception(
109-
"Failed to run graphql query\nquery: {}\nerror: {}".format(
110-
query, request.json()
111-
)
112-
)
113-
114-
115-
def check_manual_requests(start_date: datetime.datetime, token: str) -> list[str]:
65+
def check_manual_requests(
66+
gh: github.Github, start_date: datetime.datetime
67+
) -> list[str]:
11668
"""
11769
Return a list of users who have been asked since ``start_date`` if they
11870
want to keep their commit access.
@@ -140,15 +92,18 @@ def check_manual_requests(start_date: datetime.datetime, token: str) -> list[str
14092
"query": f"type:issue created:>{formatted_start_date} org:llvm repo:llvm-project label:infra:commit-access"
14193
}
14294

143-
data = run_graphql_query(query, variables, token)
95+
res_header, res_data = gh._Github__requester.graphql_query(
96+
query=query, variables=variables
97+
)
98+
data = res_data["data"]
14499
users = []
145100
for issue in data["search"]["nodes"]:
146101
users.extend([user[1:] for user in re.findall("@[^ ,\n]+", issue["body"])])
147102

148103
return users
149104

150105

151-
def get_num_commits(user: str, start_date: datetime.datetime, token: str) -> int:
106+
def get_num_commits(gh: github.Github, user: str, start_date: datetime.datetime) -> int:
152107
"""
153108
Get number of commits that ``user`` has been made since ``start_date`.
154109
"""
@@ -166,7 +121,10 @@ def get_num_commits(user: str, start_date: datetime.datetime, token: str) -> int
166121
}
167122
"""
168123

169-
data = run_graphql_query(user_query, variables, token)
124+
res_header, res_data = gh._Github__requester.graphql_query(
125+
query=user_query, variables=variables
126+
)
127+
data = res_data["data"]
170128
variables["user_id"] = data["user"]["id"]
171129

172130
query = """
@@ -193,7 +151,10 @@ def get_num_commits(user: str, start_date: datetime.datetime, token: str) -> int
193151
}
194152
"""
195153
count = 0
196-
data = run_graphql_query(query, variables, token)
154+
res_header, res_data = gh._Github__requester.graphql_query(
155+
query=query, variables=variables
156+
)
157+
data = res_data["data"]
197158
for repo in data["organization"]["teams"]["nodes"][0]["repositories"]["nodes"]:
198159
count += int(repo["ref"]["target"]["history"]["totalCount"])
199160
if count >= User.THRESHOLD:
@@ -202,7 +163,7 @@ def get_num_commits(user: str, start_date: datetime.datetime, token: str) -> int
202163

203164

204165
def is_new_committer_query_repo(
205-
user: str, start_date: datetime.datetime, token: str
166+
gh: github.Github, user: str, start_date: datetime.datetime
206167
) -> bool:
207168
"""
208169
Determine if ``user`` is a new committer. A new committer can keep their
@@ -220,7 +181,10 @@ def is_new_committer_query_repo(
220181
}
221182
"""
222183

223-
data = run_graphql_query(user_query, variables, token)
184+
res_header, res_data = gh._Github__requester.graphql_query(
185+
query=user_query, variables=variables
186+
)
187+
data = res_data["data"]
224188
variables["owner"] = "llvm"
225189
variables["user_id"] = data["user"]["id"]
226190
variables["start_date"] = start_date.strftime("%Y-%m-%dT%H:%M:%S")
@@ -245,7 +209,10 @@ def is_new_committer_query_repo(
245209
}
246210
"""
247211

248-
data = run_graphql_query(query, variables, token)
212+
res_header, res_data = gh._Github__requester.graphql_query(
213+
query=query, variables=variables
214+
)
215+
data = res_data["data"]
249216
repo = data["organization"]["repository"]
250217
commits = repo["ref"]["target"]["history"]["nodes"]
251218
if len(commits) == 0:
@@ -256,18 +223,22 @@ def is_new_committer_query_repo(
256223
return True
257224

258225

259-
def is_new_committer(user: str, start_date: datetime.datetime, token: str) -> bool:
226+
def is_new_committer(
227+
gh: github.Github, user: str, start_date: datetime.datetime
228+
) -> bool:
260229
"""
261230
Wrapper around is_new_commiter_query_repo to handle exceptions.
262231
"""
263232
try:
264-
return is_new_committer_query_repo(user, start_date, token)
233+
return is_new_committer_query_repo(gh, user, start_date)
265234
except:
266235
pass
267236
return True
268237

269238

270-
def get_review_count(user: str, start_date: datetime.datetime, token: str) -> int:
239+
def get_review_count(
240+
gh: github.Github, user: str, start_date: datetime.datetime
241+
) -> int:
271242
"""
272243
Return the number of reviews that ``user`` has done since ``start_date``.
273244
"""
@@ -286,11 +257,14 @@ def get_review_count(user: str, start_date: datetime.datetime, token: str) -> in
286257
"query": f"type:pr commenter:{user} -author:{user} merged:>{formatted_start_date} org:llvm",
287258
}
288259

289-
data = run_graphql_query(query, variables, token)
260+
res_header, res_data = gh._Github__requester.graphql_query(
261+
query=query, variables=variables
262+
)
263+
data = res_data["data"]
290264
return int(data["search"]["issueCount"])
291265

292266

293-
def count_prs(triage_list: dict, start_date: datetime.datetime, token: str):
267+
def count_prs(gh: github.Github, triage_list: dict, start_date: datetime.datetime):
294268
"""
295269
Fetch all the merged PRs for the project since ``start_date`` and update
296270
``triage_list`` with the number of PRs merged for each user.
@@ -329,7 +303,10 @@ def count_prs(triage_list: dict, start_date: datetime.datetime, token: str):
329303
has_next_page = True
330304
while has_next_page:
331305
print(variables)
332-
data = run_graphql_query(query, variables, token)
306+
res_header, res_data = gh._Github__requester.graphql_query(
307+
query=query, variables=variables
308+
)
309+
data = res_data["data"]
333310
for pr in data["search"]["nodes"]:
334311
# Users can be None if the user has been deleted.
335312
if not pr["author"]:
@@ -365,14 +342,14 @@ def main():
365342

366343
print("Start:", len(triage_list), "triagers")
367344
# Step 0 Check if users have requested commit access in the last year.
368-
for user in check_manual_requests(one_year_ago, token):
345+
for user in check_manual_requests(gh, one_year_ago):
369346
if user in triage_list:
370347
print(user, "requested commit access in the last year.")
371348
del triage_list[user]
372349
print("After Request Check:", len(triage_list), "triagers")
373350

374351
# Step 1 count all PRs authored or merged
375-
count_prs(triage_list, one_year_ago, token)
352+
count_prs(gh, triage_list, one_year_ago)
376353

377354
print("After PRs:", len(triage_list), "triagers")
378355

@@ -381,7 +358,7 @@ def main():
381358

382359
# Step 2 check for reviews
383360
for user in list(triage_list.keys()):
384-
review_count = get_review_count(user, one_year_ago, token)
361+
review_count = get_review_count(gh, user, one_year_ago)
385362
triage_list[user].add_reviewed(review_count)
386363

387364
print("After Reviews:", len(triage_list), "triagers")
@@ -391,7 +368,7 @@ def main():
391368

392369
# Step 3 check for number of commits
393370
for user in list(triage_list.keys()):
394-
num_commits = get_num_commits(user, one_year_ago, token)
371+
num_commits = get_num_commits(gh, user, one_year_ago)
395372
# Override the total number of commits to not double count commits and
396373
# authored PRs.
397374
triage_list[user].set_authored(num_commits)
@@ -401,7 +378,7 @@ def main():
401378
# Step 4 check for new committers
402379
for user in list(triage_list.keys()):
403380
print("Checking", user)
404-
if is_new_committer(user, one_year_ago, token):
381+
if is_new_committer(gh, user, one_year_ago):
405382
print("Removing new committer: ", user)
406383
del triage_list[user]
407384

llvm/utils/git/requirements.txt

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -222,9 +222,9 @@ pycparser==2.22 \
222222
--hash=sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6 \
223223
--hash=sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc
224224
# via cffi
225-
pygithub==2.2.0 \
226-
--hash=sha256:41042ea53e4c372219db708c38d2ca1fd4fadab75475bac27d89d339596cfad1 \
227-
--hash=sha256:e39be7c4dc39418bdd6e3ecab5931c636170b8b21b4d26f9ecf7e6102a3b51c3
225+
pygithub==2.4.0 \
226+
--hash=sha256:6601e22627e87bac192f1e2e39c6e6f69a43152cfb8f307cee575879320b3051 \
227+
--hash=sha256:81935aa4bdc939fba98fee1cb47422c09157c56a27966476ff92775602b9ee24
228228
# via -r requirements.txt.in
229229
pyjwt[crypto]==2.9.0 \
230230
--hash=sha256:3b02fb0f44517787776cf48f2ae25d8e14f300e6d7545a4315cee571a415e850 \
@@ -254,9 +254,9 @@ typing-extensions==4.12.2 \
254254
--hash=sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d \
255255
--hash=sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8
256256
# via pygithub
257-
urllib3==2.2.2 \
258-
--hash=sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472 \
259-
--hash=sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168
257+
urllib3==2.2.3 \
258+
--hash=sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac \
259+
--hash=sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9
260260
# via
261261
# pygithub
262262
# requests

llvm/utils/git/requirements.txt.in

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
# pip-compile -o requirements.txt requirements.txt.in
55

66
certifi>=2023.7.22 # https://security.snyk.io/vuln/SNYK-PYTHON-CERTIFI-5805047
7-
PyGithub==2.2.0 # >=1.59.1 For WorkflowRun.name
7+
PyGithub==2.4.0 # >=1.59.1 For WorkflowRun.name
88
# >= 2.2.0 for permission arg to Repository.get_collaborators
9+
# >= Fix for https://github.com/PyGithub/PyGithub/issues/3001
10+
# (variables in graphql query).
911
GitPython>=3.1.32 # https://security.snyk.io/vuln/SNYK-PYTHON-GITPYTHON-5840584

0 commit comments

Comments
 (0)