Skip to content

Commit 77d53c8

Browse files
committed
Handle refs/releases/assets count greater than 30 adding support for pagination
1 parent 3138ac6 commit 77d53c8

3 files changed

Lines changed: 51 additions & 19 deletions

File tree

CHANGES.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,15 @@
1+
Next Release
2+
============
3+
4+
Features (CLI and Python API)
5+
-----------------------------
6+
7+
* Support projects having more than 30 assets, releases or refs.
8+
9+
* Introduce dependency to [LinkHeader](https://pypi.python.org/pypi/LinkHeader/) python
10+
package to handle [GitHub pagination information](https://developer.github.com/v3/guides/traversing-with-pagination/).
11+
12+
113
1.5.4
214
=====
315

github_release.py

Lines changed: 38 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
from pprint import pprint
1717

1818
import click
19+
import link_header
1920
import requests
2021
from requests import request
2122

@@ -145,6 +146,22 @@ def formatPos(_self):
145146
return bar
146147

147148

149+
def _recursive_gh_get(href, items):
150+
"""Recursively get list of GitHub objects.
151+
152+
See https://developer.github.com/v3/guides/traversing-with-pagination/
153+
"""
154+
response = _request('GET', href)
155+
response.raise_for_status()
156+
items.extend(response.json())
157+
if "link" not in response.headers:
158+
return
159+
links = link_header.parse(response.headers["link"])
160+
rels = {link.rel: link.href for link in links.links}
161+
if "next" in rels:
162+
_recursive_gh_get(rels["next"], items)
163+
164+
148165
@click.group()
149166
@click.option("--github-token", envvar='GITHUB_TOKEN', default=None,
150167
help="[default: GITHUB_TOKEN env. variable]")
@@ -227,10 +244,11 @@ def print_release_info(release, title=None, indent=""):
227244

228245

229246
def get_releases(repo_name, verbose=False):
230-
response = _request(
231-
'GET', GITHUB_API + '/repos/{0}/releases'.format(repo_name))
232-
response.raise_for_status()
233-
releases = response.json()
247+
248+
releases = []
249+
_recursive_gh_get(
250+
GITHUB_API + '/repos/{0}/releases'.format(repo_name), releases)
251+
234252
if verbose:
235253
list(map(print_release_info,
236254
sorted(releases, key=lambda r: r['tag_name'])))
@@ -348,14 +366,15 @@ def get_assets(repo_name, tag_name, verbose=False):
348366
release = get_release(repo_name, tag_name)
349367
if not release:
350368
raise Exception('Release with tag_name {0} not found'.format(tag_name))
351-
response = _request(
352-
'GET', GITHUB_API + '/repos/{0}/releases/{1}/assets'.format(
353-
repo_name, release["id"]))
354-
response.raise_for_status()
355-
assets = response.json()
369+
370+
assets = []
371+
_recursive_gh_get(GITHUB_API + '/repos/{0}/releases/{1}/assets'.format(
372+
repo_name, release["id"]), assets)
373+
356374
if verbose:
357375
for i, asset in enumerate(sorted(assets, key=lambda r: r['name'])):
358376
print_asset_info(i, asset)
377+
359378
return assets
360379

361380

@@ -870,26 +889,26 @@ def print_ref_info(ref, indent=""):
870889

871890

872891
def get_refs(repo_name, tags=None, pattern=None):
873-
response = _request(
874-
'GET', GITHUB_API + '/repos/{0}/git/refs'.format(repo_name))
875-
response.raise_for_status()
892+
893+
refs = []
894+
_recursive_gh_get(
895+
GITHUB_API + '/repos/{0}/git/refs'.format(repo_name), refs)
876896

877897
# If "tags" is True, keep only "refs/tags/*"
878-
data = response.json()
898+
data = refs
879899
if tags:
880900
tag_names = []
881901
data = []
882-
for ref in response.json():
902+
for ref in refs:
883903
if ref['ref'].startswith("refs/tags"):
884904
data.append(ref)
885905
tag_names.append(ref["ref"])
886906

887907
try:
888-
response = _request(
889-
'GET',
890-
GITHUB_API + '/repos/{0}/git/refs/tags'.format(repo_name))
891-
response.raise_for_status()
892-
for ref in response.json():
908+
tags = []
909+
_recursive_gh_get(
910+
GITHUB_API + '/repos/{0}/git/refs/tags'.format(repo_name), tags)
911+
for ref in tags:
893912
if ref["ref"] not in tag_names:
894913
data.append(ref)
895914
except requests.exceptions.HTTPError as exc_info:

requirements.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
click
2+
linkheader
23
requests

0 commit comments

Comments
 (0)