diff --git a/src/cargo/ops/cargo_generate_lockfile.rs b/src/cargo/ops/cargo_generate_lockfile.rs index 832261a41..192cf50fc 100644 --- a/src/cargo/ops/cargo_generate_lockfile.rs +++ b/src/cargo/ops/cargo_generate_lockfile.rs @@ -152,7 +152,15 @@ pub fn update_lockfile(ws: &Workspace<'_>, opts: &UpdateOptions<'_>) -> CargoRes format!("{} -> v{}", removed[0], added[0].version()) }; - if removed[0].version() > added[0].version() { + // If versions differ only in build metadata, we call it an "update" + // regardless of whether the build metadata has gone up or down. + // This metadata is often stuff like git commit hashes, which are + // not meaningfully ordered. + let removed = removed[0].version(); + let added = added[0].version(); + if (removed.major, removed.minor, removed.patch, &removed.pre) + > (added.major, added.minor, added.patch, &added.pre) + { print_change("Downgrading", msg, &style::WARN)?; } else { print_change("Updating", msg, &style::GOOD)?; diff --git a/tests/testsuite/update.rs b/tests/testsuite/update.rs index 63da173ae..8a58e4c80 100644 --- a/tests/testsuite/update.rs +++ b/tests/testsuite/update.rs @@ -423,11 +423,13 @@ fn update_precise_build_metadata() { ) .run(); + // This is not considered "Downgrading". Build metadata are not assumed to + // be ordered. p.cargo("update serde --precise 0.0.1+first") .with_stderr( "\ [UPDATING] `[..]` index -[DOWNGRADING] serde v0.0.1+second -> v0.0.1+first +[UPDATING] serde v0.0.1+second -> v0.0.1+first ", ) .run();