Skip to content

Commit 942ff20

Browse files
committed
contrib: gh-merge: Use pagination to fetch all review comments
1 parent 0c9de67 commit 942ff20

File tree

1 file changed

+30
-11
lines changed

1 file changed

+30
-11
lines changed

contrib/devtools/github-merge.py

Lines changed: 30 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -47,17 +47,36 @@ def git_config_get(option, default=None):
4747
except subprocess.CalledProcessError:
4848
return default
4949

50-
def retrieve_json(req, ghtoken):
50+
def get_response(req_url, ghtoken):
51+
req = Request(req_url)
52+
if ghtoken is not None:
53+
req.add_header('Authorization', 'token ' + ghtoken)
54+
return urlopen(req)
55+
56+
def retrieve_json(req_url, ghtoken, use_pagination=False):
5157
'''
5258
Retrieve json from github.
5359
Return None if an error happens.
5460
'''
5561
try:
56-
if ghtoken is not None:
57-
req.add_header('Authorization', 'token ' + ghtoken)
58-
result = urlopen(req)
5962
reader = codecs.getreader('utf-8')
60-
obj = json.load(reader(result))
63+
if not use_pagination:
64+
return json.load(reader(get_response(req_url, ghtoken)))
65+
66+
obj = []
67+
page_num = 1
68+
while True:
69+
req_url_page = '{}?page={}'.format(req_url, page_num)
70+
result = get_response(req_url_page, ghtoken)
71+
obj.extend(json.load(reader(result)))
72+
73+
link = result.headers.get('link', None)
74+
if link is not None:
75+
link_next = [l for l in link.split(',') if 'rel="next"' in l]
76+
if len(link_next) > 0:
77+
page_num = int(link_next[0][link_next[0].find("page=")+5:link_next[0].find(">")])
78+
continue
79+
break
6180
return obj
6281
except HTTPError as e:
6382
error_message = e.read()
@@ -69,16 +88,16 @@ def retrieve_json(req, ghtoken):
6988
return None
7089

7190
def retrieve_pr_info(repo,pull,ghtoken):
72-
req = Request("https://api.github.com/repos/"+repo+"/pulls/"+pull)
73-
return retrieve_json(req,ghtoken)
91+
req_url = "https://api.github.com/repos/"+repo+"/pulls/"+pull
92+
return retrieve_json(req_url,ghtoken)
7493

7594
def retrieve_pr_comments(repo,pull,ghtoken):
76-
req = Request("https://api.github.com/repos/"+repo+"/issues/"+pull+"/comments")
77-
return retrieve_json(req,ghtoken)
95+
req_url = "https://api.github.com/repos/"+repo+"/issues/"+pull+"/comments"
96+
return retrieve_json(req_url,ghtoken,use_pagination=True)
7897

7998
def retrieve_pr_reviews(repo,pull,ghtoken):
80-
req = Request("https://api.github.com/repos/"+repo+"/pulls/"+pull+"/reviews")
81-
return retrieve_json(req,ghtoken)
99+
req_url = "https://api.github.com/repos/"+repo+"/pulls/"+pull+"/reviews"
100+
return retrieve_json(req_url,ghtoken,use_pagination=True)
82101

83102
def ask_prompt(text):
84103
print(text,end=" ",file=stderr)

0 commit comments

Comments
 (0)