From a449b1c5299809db480444ce42513d10cc94c893 Mon Sep 17 00:00:00 2001
From: Hendrik Maus <aidentailor@gmail.com>
Date: Wed, 13 Apr 2022 08:10:09 +0200
Subject: [PATCH] ci: determine if the current crate is ahead or behind the
 registry

---
 release-operator/src/registry.rs | 22 ++++++++++++++++------
 1 file changed, 16 insertions(+), 6 deletions(-)

diff --git a/release-operator/src/registry.rs b/release-operator/src/registry.rs
index 3f40c0f07..02b39bdda 100644
--- a/release-operator/src/registry.rs
+++ b/release-operator/src/registry.rs
@@ -17,9 +17,14 @@ pub struct Crate {
 }
 
 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,
+    /// We encountered an unknown state while processing the crate
     Unknown,
-    Outdated,
 }
 
 impl Registry {
@@ -36,8 +41,8 @@ impl Registry {
             c.validate()?;
 
             match c.determine_state()? {
-                CrateState::Published => continue,
-                CrateState::Unknown | CrateState::Outdated => {
+                CrateState::Published | CrateState::Behind => continue,
+                CrateState::Unknown | CrateState::Ahead => {
                     c.submit(&self.token, self.dry_run)?;
                 }
             }
@@ -72,7 +77,7 @@ impl Crate {
                 .context("search crates.io for published crate version")?;
             log::debug!("{self} found as {version} on their side");
 
-            version
+            semver::Version::from_str(&version).context("parse their version")?
         };
 
         let ours = {
@@ -93,7 +98,7 @@ impl Crate {
                 .find(|p| p.name == name)
                 .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");
 
             version
@@ -104,7 +109,12 @@ impl Crate {
             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<()> {