From 17cae8ed8bbc05c1d468087bf3718bf4e89bf448 Mon Sep 17 00:00:00 2001 From: Weihang Lo Date: Sun, 21 Jan 2024 20:21:14 -0500 Subject: [PATCH] fix(cargo-update): once warn once for `--precise ` --- src/cargo/sources/registry/mod.rs | 23 ++++++++++++++++------- tests/testsuite/update.rs | 7 ++----- 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/src/cargo/sources/registry/mod.rs b/src/cargo/sources/registry/mod.rs index c363d6099704..e26e50213430 100644 --- a/src/cargo/sources/registry/mod.rs +++ b/src/cargo/sources/registry/mod.rs @@ -261,6 +261,12 @@ pub struct RegistrySource<'cfg> { /// Otherwise, the resolver would think that those entries no longer /// exist, and it would trigger updates to unrelated packages. yanked_whitelist: HashSet, + /// Yanked versions that have already been selected during queries. + /// + /// As of this writing, this is for not emitting the `--precise ` + /// warning twice, with the assumption of (`dep.package_name()` + `--precise` + /// version) being sufficient to uniquely identify the same query result. + selected_precise_yanked: HashSet<(InternedString, semver::Version)>, } /// The [`config.json`] file stored in the index. @@ -531,6 +537,7 @@ impl<'cfg> RegistrySource<'cfg> { index: index::RegistryIndex::new(source_id, ops.index_path(), config), yanked_whitelist: yanked_whitelist.clone(), ops, + selected_precise_yanked: HashSet::new(), } } @@ -812,13 +819,15 @@ impl<'cfg> Source for RegistrySource<'cfg> { let version = req .precise_version() .expect("--precise in use"); - let source = self.source_id(); - let mut shell = self.config.shell(); - shell.warn(format_args!( - "yanked package `{name}@{version}` is selected by the `--precise` flag from {source}", - ))?; - shell.note("it is not recommended to depend on a yanked version")?; - shell.note("if possible, try other SemVer-compatbile versions")?; + if self.selected_precise_yanked.insert((name, version.clone())) { + let source = self.source_id(); + let mut shell = self.config.shell(); + shell.warn(format_args!( + "yanked package `{name}@{version}` is selected by the `--precise` flag from {source}", + ))?; + shell.note("it is not recommended to depend on a yanked version")?; + shell.note("if possible, try other SemVer-compatible versions")?; + } } if called { return Poll::Ready(Ok(())); diff --git a/tests/testsuite/update.rs b/tests/testsuite/update.rs index fc93e84a0d76..77cbf06dd99f 100644 --- a/tests/testsuite/update.rs +++ b/tests/testsuite/update.rs @@ -1421,7 +1421,7 @@ Caused by: [UPDATING] `dummy-registry` index [WARNING] yanked package `bar@0.1.1` is selected by the `--precise` flag from registry `dummy-registry` [NOTE] it is not recommended to depend on a yanked version -[NOTE] if possible, try other SemVer-compatbile versions +[NOTE] if possible, try other SemVer-compatible versions [UPDATING] bar v0.1.0 -> v0.1.1 ", ) @@ -1465,10 +1465,7 @@ fn precise_yanked_multiple_presence() { [UPDATING] `dummy-registry` index [WARNING] yanked package `bar@0.1.1` is selected by the `--precise` flag from registry `dummy-registry` [NOTE] it is not recommended to depend on a yanked version -[NOTE] if possible, try other SemVer-compatbile versions -[WARNING] yanked package `bar@0.1.1` is selected by the `--precise` flag from registry `dummy-registry` -[NOTE] it is not recommended to depend on a yanked version -[NOTE] if possible, try other SemVer-compatbile versions +[NOTE] if possible, try other SemVer-compatible versions [UPDATING] bar v0.1.0 -> v0.1.1 ", )