Skip to content

Commit 195138b

Browse files
committed
fix(update): Show updates for all relevant packages
1 parent 76f3874 commit 195138b

File tree

2 files changed

+57
-28
lines changed

2 files changed

+57
-28
lines changed

src/cargo/ops/cargo_generate_lockfile.rs

Lines changed: 52 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -178,42 +178,43 @@ pub fn update_lockfile(ws: &Workspace<'_>, opts: &UpdateOptions<'_>) -> CargoRes
178178
&& candidate.minor == current.minor
179179
&& candidate.patch == current.patch))
180180
}
181-
182-
let highest_present = [added.iter().rev().next(), unchanged.iter().rev().next()]
181+
let possibilities = if let Some(query) = [added.iter(), unchanged.iter()]
183182
.into_iter()
184183
.flatten()
185-
.max_by_key(|s| s.version());
186-
let latest = if let Some(present) = highest_present.filter(|p| p.source_id().is_registry())
184+
.next()
185+
.filter(|s| s.source_id().is_registry())
187186
{
188-
let query = crate::core::dependency::Dependency::parse(
189-
present.name(),
190-
None,
191-
present.source_id(),
192-
)?;
193-
let possibilities = loop {
187+
let query =
188+
crate::core::dependency::Dependency::parse(query.name(), None, query.source_id())?;
189+
loop {
194190
match registry.query_vec(&query, QueryKind::Exact) {
195191
std::task::Poll::Ready(res) => {
196192
break res?;
197193
}
198194
std::task::Poll::Pending => registry.block_until_ready()?,
199195
}
200-
};
201-
let present_version = present.version();
202-
possibilities
203-
.iter()
204-
.map(|s| s.as_summary())
205-
.filter(|s| is_latest(s.version(), present_version))
206-
.map(|s| s.version().clone())
207-
.max()
208-
.map(format_latest)
196+
}
209197
} else {
210-
None
211-
}
212-
.unwrap_or_default();
198+
vec![]
199+
};
213200

214201
if removed.len() == 1 && added.len() == 1 {
215202
let added = added.into_iter().next().unwrap();
216203
let removed = removed.into_iter().next().unwrap();
204+
205+
let latest = if !possibilities.is_empty() {
206+
possibilities
207+
.iter()
208+
.map(|s| s.as_summary())
209+
.filter(|s| is_latest(s.version(), added.version()))
210+
.map(|s| s.version().clone())
211+
.max()
212+
.map(format_latest)
213+
} else {
214+
None
215+
}
216+
.unwrap_or_default();
217+
217218
let msg = if removed.source_id().is_git() {
218219
format!(
219220
"{removed} -> #{}",
@@ -237,20 +238,45 @@ pub fn update_lockfile(ws: &Workspace<'_>, opts: &UpdateOptions<'_>) -> CargoRes
237238
print_change("Removing", format!("{package}"), &style::ERROR)?;
238239
}
239240
for package in added.iter() {
241+
let latest = if !possibilities.is_empty() {
242+
possibilities
243+
.iter()
244+
.map(|s| s.as_summary())
245+
.filter(|s| is_latest(s.version(), package.version()))
246+
.map(|s| s.version().clone())
247+
.max()
248+
.map(format_latest)
249+
} else {
250+
None
251+
}
252+
.unwrap_or_default();
253+
240254
print_change("Adding", format!("{package}{latest}"), &style::NOTE)?;
241255
}
242256
}
243-
if !latest.is_empty() {
244-
if opts.config.shell().verbosity() == Verbosity::Verbose {
245-
for package in &unchanged {
257+
for package in &unchanged {
258+
let latest = if !possibilities.is_empty() {
259+
possibilities
260+
.iter()
261+
.map(|s| s.as_summary())
262+
.filter(|s| is_latest(s.version(), package.version()))
263+
.map(|s| s.version().clone())
264+
.max()
265+
.map(format_latest)
266+
} else {
267+
None
268+
};
269+
270+
if let Some(latest) = latest {
271+
unchanged_behind += 1;
272+
if opts.config.shell().verbosity() == Verbosity::Verbose {
246273
opts.config.shell().status_with_color(
247274
"Unchanged",
248275
format!("{package}{latest}"),
249276
&anstyle::Style::new().bold(),
250277
)?;
251278
}
252279
}
253-
unchanged_behind += unchanged.len();
254280
}
255281
}
256282
if opts.config.shell().verbosity() == Verbosity::Verbose {

tests/testsuite/update.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -388,6 +388,7 @@ fn update_precise() {
388388
"\
389389
[UPDATING] `[..]` index
390390
[DOWNGRADING] serde v0.2.1 -> v0.2.0
391+
[NOTE] Pass `--verbose` to see 1 unchanged dependencies behind latest
391392
",
392393
)
393394
.run();
@@ -1512,7 +1513,7 @@ fn report_behind() {
15121513
"\
15131514
[UPDATING] `dummy-registry` index
15141515
[UPDATING] breaking v0.1.0 -> v0.1.1 (latest: v0.2.0)
1515-
[NOTE] Pass `--verbose` to see 1 unchanged dependencies behind latest
1516+
[NOTE] Pass `--verbose` to see 2 unchanged dependencies behind latest
15161517
[WARNING] not updating lockfile due to dry run
15171518
",
15181519
)
@@ -1524,6 +1525,7 @@ fn report_behind() {
15241525
[UPDATING] `dummy-registry` index
15251526
[UPDATING] breaking v0.1.0 -> v0.1.1 (latest: v0.2.0)
15261527
[UNCHANGED] pre v1.0.0-alpha.0 (latest: v1.0.0-alpha.1)
1528+
[UNCHANGED] two-ver v0.1.0 (latest: v0.2.0)
15271529
[NOTE] To see how you depend on a package, run `cargo tree --invert --package <dep>@<ver>`
15281530
[WARNING] not updating lockfile due to dry run
15291531
",
@@ -1536,7 +1538,7 @@ fn report_behind() {
15361538
.with_stderr(
15371539
"\
15381540
[UPDATING] `dummy-registry` index
1539-
[NOTE] Pass `--verbose` to see 2 unchanged dependencies behind latest
1541+
[NOTE] Pass `--verbose` to see 3 unchanged dependencies behind latest
15401542
[WARNING] not updating lockfile due to dry run
15411543
",
15421544
)
@@ -1548,6 +1550,7 @@ fn report_behind() {
15481550
[UPDATING] `dummy-registry` index
15491551
[UNCHANGED] breaking v0.1.1 (latest: v0.2.0)
15501552
[UNCHANGED] pre v1.0.0-alpha.0 (latest: v1.0.0-alpha.1)
1553+
[UNCHANGED] two-ver v0.1.0 (latest: v0.2.0)
15511554
[NOTE] To see how you depend on a package, run `cargo tree --invert --package <dep>@<ver>`
15521555
[WARNING] not updating lockfile due to dry run
15531556
",

0 commit comments

Comments
 (0)