-
Notifications
You must be signed in to change notification settings - Fork 394
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add script to find external issues we haven't commented on
We should make people who file issues feel seen by commenting on them Example output: ``` #1529 by rasmusgo has 0 comments #1544 by cortwave has 0 comments #1571 by pablovela5620 has 0 comments ```
- Loading branch information
Showing
1 changed file
with
105 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,105 @@ | ||
#!/usr/bin/env python3 | ||
|
||
"""Generate a list of GitHub issues that needs attention.""" | ||
from __future__ import annotations | ||
|
||
import multiprocessing | ||
import sys | ||
|
||
import requests | ||
from tqdm import tqdm | ||
|
||
OWNER = "rerun-io" | ||
REPO = "rerun" | ||
OFFICIAL_RERUN_DEVS = [ | ||
"abey79", | ||
"emilk", | ||
"jleibs", | ||
"jondo2010", | ||
"jprochazk", | ||
"karimo87", | ||
"nikolausWest", | ||
"roym899", | ||
"teh-cmc", | ||
"Wumpf", | ||
] | ||
|
||
|
||
def get_github_token() -> str: | ||
import os | ||
|
||
token = os.environ.get("GH_ACCESS_TOKEN", "") | ||
if token != "": | ||
return token | ||
|
||
home_dir = os.path.expanduser("~") | ||
token_file = os.path.join(home_dir, ".githubtoken") | ||
|
||
try: | ||
with open(token_file) as f: | ||
token = f.read().strip() | ||
return token | ||
except Exception: | ||
pass | ||
|
||
print("ERROR: expected a GitHub token in the environment variable GH_ACCESS_TOKEN or in ~/.githubtoken") | ||
sys.exit(1) | ||
|
||
|
||
def fetch_issue(issue_json: dict) -> dict: | ||
url = issue_json["url"] | ||
gh_access_token = get_github_token() | ||
headers = {"Authorization": f"Token {gh_access_token}"} | ||
response = requests.get(url, headers=headers) | ||
return response.json() | ||
|
||
|
||
def main() -> None: | ||
access_token = get_github_token() | ||
|
||
headers = {"Authorization": f"Bearer {access_token}"} | ||
|
||
all_issues = [] | ||
|
||
urls = [f"https://api.github.com/repos/{OWNER}/{REPO}/issues"] | ||
|
||
while urls: | ||
page_url = urls.pop() | ||
|
||
print(f"Fetching {page_url}…") | ||
response = requests.get(page_url, headers=headers) | ||
json = response.json() | ||
|
||
all_issues += list(json) | ||
|
||
# Check if there is a next page: | ||
if "Link" in response.headers: | ||
links = response.headers["Link"].split(", ") | ||
for link in links: | ||
if 'rel="next"' in link: | ||
next_url = link.split(";")[0][1:-1] | ||
urls += [next_url] | ||
|
||
pool = multiprocessing.Pool() | ||
issues_list = list( | ||
tqdm( | ||
pool.imap(fetch_issue, all_issues), | ||
total=len(all_issues), | ||
desc="Fetching issue details", | ||
) | ||
) | ||
|
||
issues_list.sort(key=lambda issue: issue["number"]) | ||
|
||
# Print the response content | ||
for issue in issues_list: | ||
author = issue["user"]["login"] | ||
html_url = issue["html_url"] | ||
comments = issue["comments"] | ||
state = issue["state"] | ||
if comments == 0 and state == "open" and author not in OFFICIAL_RERUN_DEVS: | ||
print(f"{html_url} by {author} has {comments} comments") | ||
|
||
|
||
if __name__ == "__main__": | ||
main() |