ci: determine if the current crate is ahead or behind the registry

This commit is contained in:
Hendrik Maus 2022-04-13 08:10:09 +02:00 committed by Hanno Braun
parent dab16af232
commit a449b1c529

View File

@ -17,9 +17,14 @@ pub struct Crate {
} }
enum CrateState { enum CrateState {
/// Our crate version is ahead of the registry and should be published
Ahead,
/// Our crate version is behind the registry; you'll be warned about this
Behind,
/// Our crate version matches the registry version
Published, Published,
/// We encountered an unknown state while processing the crate
Unknown, Unknown,
Outdated,
} }
impl Registry { impl Registry {
@ -36,8 +41,8 @@ impl Registry {
c.validate()?; c.validate()?;
match c.determine_state()? { match c.determine_state()? {
CrateState::Published => continue, CrateState::Published | CrateState::Behind => continue,
CrateState::Unknown | CrateState::Outdated => { CrateState::Unknown | CrateState::Ahead => {
c.submit(&self.token, self.dry_run)?; c.submit(&self.token, self.dry_run)?;
} }
} }
@ -72,7 +77,7 @@ impl Crate {
.context("search crates.io for published crate version")?; .context("search crates.io for published crate version")?;
log::debug!("{self} found as {version} on their side"); log::debug!("{self} found as {version} on their side");
version semver::Version::from_str(&version).context("parse their version")?
}; };
let ours = { let ours = {
@ -93,7 +98,7 @@ impl Crate {
.find(|p| p.name == name) .find(|p| p.name == name)
.ok_or_else(|| anyhow!("could not find package"))?; .ok_or_else(|| anyhow!("could not find package"))?;
let version = package.version.to_string(); let version = package.version.to_owned();
log::debug!("{self} found as {version} on our side"); log::debug!("{self} found as {version} on our side");
version version
@ -104,7 +109,12 @@ impl Crate {
return Ok(CrateState::Published); return Ok(CrateState::Published);
} }
Ok(CrateState::Outdated) if ours < theirs {
log::warn!("{self} has already been published as {ours}, which is a newer version");
return Ok(CrateState::Behind)
}
Ok(CrateState::Ahead)
} }
fn submit(&self, token: &SecStr, dry_run: bool) -> anyhow::Result<()> { fn submit(&self, token: &SecStr, dry_run: bool) -> anyhow::Result<()> {