Spaces:
Running
Running
File size: 2,020 Bytes
cc857c8 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | import json, subprocess, sys, time
OUT = sys.argv[1]
Q = """
query($cursor:String){repository(owner:"huggingface",name:"transformers"){
%s(states:OPEN, first:40, after:$cursor){ totalCount pageInfo{hasNextPage endCursor}
nodes{ number title createdAt updatedAt author{login} %s
timelineItems(first:60, itemTypes:[CROSS_REFERENCED_EVENT, CONNECTED_EVENT, MARKED_AS_DUPLICATE_EVENT]){ nodes{
__typename
... on CrossReferencedEvent{ willCloseTarget source{ __typename ... on PullRequest{number title state merged mergedAt baseRefName}
... on Issue{number title state}}}
... on ConnectedEvent{ subject{ __typename ... on PullRequest{number title state merged mergedAt}}}
... on MarkedAsDuplicateEvent{ canonical{ __typename ... on Issue{number state} ... on PullRequest{number state merged}}}
}}
comments(last:8){nodes{author{login} body createdAt}}
}}}}
"""
PR_EXTRA = "isDraft baseRefName closingIssuesReferences(first:10){nodes{number state closedByPullRequestsReferences(first:5, includeClosedPrs:true){nodes{number merged state}}}}"
def run(kind, extra):
items, cursor, page, t0 = [], None, 0, time.time()
while True:
args = ["gh", "api", "graphql", "-f", f"query={Q % (kind, extra)}"]
if cursor: args += ["-f", f"cursor={cursor}"]
for attempt in range(4):
r = subprocess.run(args, capture_output=True, text=True)
if r.returncode == 0: break
time.sleep(5)
d = json.loads(r.stdout)["data"]["repository"][kind]
items += d["nodes"]; page += 1
total = d["totalCount"]; el = time.time() - t0
eta = el / len(items) * (total - len(items))
print(f"[{kind} {len(items)}/{total}] page {page} | elapsed {el:.0f}s | eta ~{eta:.0f}s", flush=True)
if not d["pageInfo"]["hasNextPage"]: return items
cursor = d["pageInfo"]["endCursor"]
data = {"issues": run("issues", ""), "prs": run("pullRequests", PR_EXTRA)}
json.dump(data, open(OUT, "w"))
print("done", flush=True)
|