From 69e1b68fbb76d2a6d96ba354c76927b3deb37fd1 Mon Sep 17 00:00:00 2001 From: Jon Cinque Date: Wed, 24 Nov 2021 21:01:55 +0100 Subject: [PATCH] init: Check all releases (#21417) --- install/src/command.rs | 69 +++++++++++++++++++++++++----------------- 1 file changed, 42 insertions(+), 27 deletions(-) diff --git a/install/src/command.rs b/install/src/command.rs index 69ee9c500..048abfbb4 100644 --- a/install/src/command.rs +++ b/install/src/command.rs @@ -859,39 +859,54 @@ fn check_for_newer_github_release( version_filter: Option, prerelease_allowed: bool, ) -> reqwest::Result> { - let url = - reqwest::Url::parse("https://api.github.com/repos/solana-labs/solana/releases").unwrap(); + let mut page = 1; + const PER_PAGE: usize = 100; let client = reqwest::blocking::Client::builder() .user_agent("solana-install") .build()?; - let request = client.get(url).build()?; - let response = client.execute(request)?; + let mut all_releases = vec![]; + let mut releases = vec![]; - let mut releases = response - .json::()? - .0 - .into_iter() - .filter_map( - |GithubRelease { - tag_name, - prerelease, - }| { - if let Ok(version) = semver_of(&tag_name) { - if (prerelease_allowed || !prerelease) - && version_filter - .as_ref() - .map_or(true, |version_filter| version_filter.matches(&version)) - { - return Some(version); - } - } - None - }, + while page == 1 || releases.len() == PER_PAGE { + let url = reqwest::Url::parse_with_params( + "https://api.github.com/repos/solana-labs/solana/releases", + &[ + ("per_page", &format!("{}", PER_PAGE)), + ("page", &format!("{}", page)), + ], ) - .collect::>(); + .unwrap(); + let request = client.get(url).build()?; + let response = client.execute(request)?; - releases.sort(); - Ok(releases.pop().map(|r| r.to_string())) + releases = response + .json::()? + .0 + .into_iter() + .filter_map( + |GithubRelease { + tag_name, + prerelease, + }| { + if let Ok(version) = semver_of(&tag_name) { + if (prerelease_allowed || !prerelease) + && version_filter + .as_ref() + .map_or(true, |version_filter| version_filter.matches(&version)) + { + return Some(version); + } + } + None + }, + ) + .collect::>(); + all_releases.extend_from_slice(&releases); + page += 1; + } + + all_releases.sort(); + Ok(all_releases.pop().map(|r| r.to_string())) } pub enum SemverUpdateType {