From 6d733061981622a838c0c8ef1faf811975018763 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 1 Mar 2023 20:54:20 +0530 Subject: [PATCH] Fix for GitHub releases API not returning all assets when querying the assets URL due to pagination Use the assets list from the release result when available as it is not paginated. Otherwise request 64 items per page which is more than enough for our 30 odd assets --- publish.py | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/publish.py b/publish.py index a6bea43ae..55baf8dc0 100755 --- a/publish.py +++ b/publish.py @@ -262,6 +262,7 @@ class GitHub: # {{{ 'Authorization': self.auth, 'Accept': 'application/vnd.github+json', 'User-Agent': 'kitty', + 'X-GitHub-Api-Version': '2022-11-28', } if params: url += '?' + urlencode(params) @@ -335,11 +336,11 @@ class GitHub: # {{{ # self.clean_older_releases(releases) release = self.create_release() upload_url = release['upload_url'].partition('{')[0] - asset_url = f'{self.url_base}/assets/{{}}' - existing_assets = self.existing_assets(release['id']) + existing_assets = self.existing_assets(release) def delete_asset(asset_id: str) -> None: - self.delete_asset(asset_url.format(asset_id), fname) + asset_url = release['assets_url'] + f'/{asset_id}' + self.delete_asset(asset_url, fname) def upload_with_retries(path: str, desc: str, num_tries: int = 8, sleep_time: float = 60.0) -> None: fname = os.path.basename(path) @@ -399,9 +400,12 @@ class GitHub: # {{{ self.print_failed_response_details(r, msg) raise SystemExit(1) - def existing_assets(self, release_id: str) -> Dict[str, str]: - url = f'{self.url_base}/{release_id}/assets' - d = self.make_request_with_retries(url, failure_msg='Failed to get assets for release', return_data=True) + def existing_assets(self, release: Dict[str, Any]) -> Dict[str, str]: + if 'assets' in release: + d = release['assets'] + else: + d = self.make_request_with_retries( + release['assets_url'], params={'per_page': '64'}, failure_msg='Failed to get assets for release', return_data=True) return {asset['name']: asset['id'] for asset in d} def create_release(self) -> Dict[str, Any]: