codegen: Sort releases returned from GitHub API

This commit is contained in:
Taiki Endo
2023-01-16 20:24:12 +09:00
parent ad8540ac77
commit 2ed407fd17

View File

@@ -40,7 +40,7 @@ fn main() -> Result<()> {
.strip_prefix("https://github.com/") .strip_prefix("https://github.com/")
.context("repository must be starts with https://github.com/")?; .context("repository must be starts with https://github.com/")?;
eprintln!("downloading releases of https://github.com/{repo}"); eprintln!("downloading releases of https://github.com/{repo} from https://api.github.com/repos/{repo}/releases");
let mut releases: github::Releases = vec![]; let mut releases: github::Releases = vec![];
// GitHub API returns up to 100 results at a time. If the number of releases // GitHub API returns up to 100 results at a time. If the number of releases
// is greater than 100, multiple fetches are needed. // is greater than 100, multiple fetches are needed.
@@ -56,13 +56,17 @@ fn main() -> Result<()> {
} }
releases.append(&mut r); releases.append(&mut r);
} }
let releases: Vec<_> = releases let releases: BTreeMap<_, _> = releases
.iter() .iter()
.filter_map(|release| { .filter_map(|release| {
release let version = release.tag_name.strip_prefix(&base_info.tag_prefix)?;
.tag_name let mut semver_version = version.parse::<semver::Version>();
.strip_prefix(&base_info.tag_prefix) if semver_version.is_err() {
.map(|version| (version, release)) if let Some(default_major_version) = &base_info.default_major_version {
semver_version = format!("{default_major_version}.{version}").parse();
}
}
Some((Reverse(semver_version.ok()?), (version, release)))
}) })
.collect(); .collect();
@@ -112,13 +116,15 @@ fn main() -> Result<()> {
ManifestRef::Real(_) => &m.0 .0, ManifestRef::Real(_) => &m.0 .0,
}; };
if !manifests.map.is_empty() if !manifests.map.is_empty()
&& *version == releases.first().unwrap().0.parse()? && *version >= releases.first_key_value().unwrap().0 .0.clone().into()
{ {
return Ok(()); return Ok(());
} }
} }
} }
Some(format!("={}", releases.first().unwrap().0).parse()?) let req = format!("={}", releases.first_key_value().unwrap().0 .0).parse()?;
eprintln!("update manifest for versions '{req}'");
Some(req)
} }
None => match base_info.version_range { None => match base_info.version_range {
Some(version_range) => Some(version_range.parse()?), Some(version_range) => Some(version_range.parse()?),
@@ -137,7 +143,7 @@ fn main() -> Result<()> {
let req = if version_req == "latest" { let req = if version_req == "latest" {
if manifests.map.is_empty() { if manifests.map.is_empty() {
format!("={}", releases.first().unwrap().0).parse()? format!("={}", releases.first_key_value().unwrap().0 .0).parse()?
} else { } else {
format!(">{}", semver_versions.last().unwrap()).parse()? format!(">{}", semver_versions.last().unwrap()).parse()?
} }
@@ -150,18 +156,9 @@ fn main() -> Result<()> {
}; };
let mut buf = vec![]; let mut buf = vec![];
for &(version, release) in &releases { for (Reverse(semver_version), (version, release)) in &releases {
let mut semver_version = version.parse::<semver::Version>();
if semver_version.is_err() {
if let Some(default_major_version) = &base_info.default_major_version {
semver_version = format!("{default_major_version}.{version}").parse();
}
}
let Ok(semver_version) = semver_version else {
continue;
};
if let Some(version_req) = &version_req { if let Some(version_req) = &version_req {
if !version_req.matches(&semver_version) { if !version_req.matches(semver_version) {
continue; continue;
} }
} }