From d2922049826bb3248519ff4afcf5e8e84e5a6996 Mon Sep 17 00:00:00 2001 From: John Lawson Date: Tue, 19 Jan 2021 13:28:21 +0000 Subject: [PATCH] Try extra release pages without Link header A change to the GitHub API recently removed the pagination Link header from release json requests. This breaks the simple pagination handling we use to find all possible releases. Rather than relying on this to know if there are more pages to load, we can just keep loading pages until they provide no additional versions to parse. --- __tests__/version.test.ts | 94 +++++++++++++++++++++++---------------- src/version.ts | 17 ++++--- 2 files changed, 63 insertions(+), 48 deletions(-) diff --git a/__tests__/version.test.ts b/__tests__/version.test.ts index e6258bc..ab815a7 100644 --- a/__tests__/version.test.ts +++ b/__tests__/version.test.ts @@ -17,8 +17,6 @@ describe('When a version is needed', () => { .query({ page: 1 }) .replyWithFile(200, path.join(dataPath, 'releases.json'), { 'Content-Type': 'application/json', - Link: - '<...releases?page=2>; rel="next", <...releases?page=2>; rel="last"', }); // Releases file 2 contains version info for: // 2.4.8, 2.6.4, 2.8.10.2, 2.8.12.2 @@ -29,9 +27,11 @@ describe('When a version is needed', () => { .query({ page: 2 }) .replyWithFile(200, path.join(dataPath, 'releases2.json'), { 'Content-Type': 'application/json', - Link: - '<...releases?page=1>; rel="prev", <...releases?page=2>; rel="last"', }); + nock('https://api.github.com') + .get('/repos/Kitware/CMake/releases') + .query({ page: 3 }) + .reply(200, []); }); afterEach(() => { nock.cleanAll(); @@ -102,6 +102,10 @@ describe('When api token is required', () => { .get('/repos/Kitware/CMake/releases') .query({ page: 1 }) .replyWithError('Invalid API token'); + nock('https://api.github.com') + .get('/repos/Kitware/CMake/releases') + .query({ page: 2 }) + .reply(200, []); }); afterEach(() => { nock.cleanAll(); @@ -124,26 +128,28 @@ describe('When api token is required', () => { }); describe('When using macos 3.19.2 release', () => { - const releases = { - tag_name: 'v3.19.2', - assets: [ - { - name: 'cmake-3.19.2-Linux-x86_64.tar.gz', - browser_download_url: - 'https://fakeaddress/cmake-3.19.2-Linux-x86_64.tar.gz', - }, - { - name: 'cmake-3.19.2-macos-universal.dmg', - browser_download_url: - 'https://fakeaddress.com/cmake-3.19.2-macos-universal.dmg', - }, - { - name: 'cmake-3.19.2-macos-universal.tar.gz', - browser_download_url: - 'https://fakeaddress.com/cmake-3.19.2-macos-universal.tar.gz', - }, - ], - }; + const releases = [ + { + tag_name: 'v3.19.2', + assets: [ + { + name: 'cmake-3.19.2-Linux-x86_64.tar.gz', + browser_download_url: + 'https://fakeaddress/cmake-3.19.2-Linux-x86_64.tar.gz', + }, + { + name: 'cmake-3.19.2-macos-universal.dmg', + browser_download_url: + 'https://fakeaddress.com/cmake-3.19.2-macos-universal.dmg', + }, + { + name: 'cmake-3.19.2-macos-universal.tar.gz', + browser_download_url: + 'https://fakeaddress.com/cmake-3.19.2-macos-universal.tar.gz', + }, + ], + }, + ]; beforeEach(() => { nock.disableNetConnect(); @@ -151,6 +157,10 @@ describe('When using macos 3.19.2 release', () => { .get('/repos/Kitware/CMake/releases') .query({ page: 1 }) .reply(200, releases); + nock('https://api.github.com') + .get('/repos/Kitware/CMake/releases') + .query({ page: 2 }) + .reply(200, []); }); afterEach(() => { @@ -184,21 +194,23 @@ describe('When using macos 3.19.2 release', () => { }); describe('When providing multiple different archs', () => { - const releases = { - tag_name: 'v3.19.3', - assets: [ - { - name: 'cmake-3.19.3-Linux-aarch64.tar.gz', - browser_download_url: - 'https://fakeaddress.com/cmake-3.19.3-Linux-aarch64.tar.gz', - }, - { - name: 'cmake-3.19.3-Linux-x86_64.tar.gz', - browser_download_url: - 'https://fakeaddress.com/cmake-3.19.3-Linux-x86_64.tar.gz', - }, - ], - }; + const releases = [ + { + tag_name: 'v3.19.3', + assets: [ + { + name: 'cmake-3.19.3-Linux-aarch64.tar.gz', + browser_download_url: + 'https://fakeaddress.com/cmake-3.19.3-Linux-aarch64.tar.gz', + }, + { + name: 'cmake-3.19.3-Linux-x86_64.tar.gz', + browser_download_url: + 'https://fakeaddress.com/cmake-3.19.3-Linux-x86_64.tar.gz', + }, + ], + }, + ]; beforeEach(() => { nock.disableNetConnect(); @@ -206,6 +218,10 @@ describe('When providing multiple different archs', () => { .get('/repos/Kitware/CMake/releases') .query({ page: 1 }) .reply(200, releases); + nock('https://api.github.com') + .get('/repos/Kitware/CMake/releases') + .query({ page: 2 }) + .reply(200, []); }); afterEach(() => { diff --git a/src/version.ts b/src/version.ts index 097db10..2ed02d3 100644 --- a/src/version.ts +++ b/src/version.ts @@ -1,4 +1,5 @@ import * as rest from 'typed-rest-client/RestClient'; +import * as core from '@actions/core'; import * as semver from 'semver'; import * as vi from './version-info'; @@ -113,24 +114,22 @@ export async function getAllVersionInfo( const client = new rest.RestClient(USER_AGENT); let cur_page = 1; let raw_versions: GitHubVersion[] = []; - let has_next_page = true; - while (has_next_page) { + while (cur_page < 10) { const options = getHttpOptions(api_token, cur_page); + core.debug(`fetching page ${cur_page}`); const version_response = await client.get( VERSION_URL, options ); - const headers: { link?: string } = version_response.headers; - if (headers.link && headers.link.match(/rel="next"/)) { - has_next_page = true; - } else { - has_next_page = false; - } - if (version_response.result) { + if (version_response.result && version_response.result.length > 0) { + core.debug(`found ${version_response.result.length} results`); raw_versions = raw_versions.concat(version_response.result); + } else { + break; } cur_page++; } + core.debug(`overall got ${raw_versions.length} versions`); const versions: vi.VersionInfo[] = convertToVersionInfo(raw_versions); return versions; }