Skip to content

Commit 6c5bb6e

Browse files
committed
Make component removal best-effort and preserve single-error behavior
1 parent 79e4c4d commit 6c5bb6e

File tree

2 files changed

+19
-15
lines changed

2 files changed

+19
-15
lines changed

src/cli/rustup_mode.rs

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1483,15 +1483,16 @@ async fn component_remove(
14831483

14841484
let mut parsed_components = Vec::new();
14851485
let mut unknown_components = Vec::new();
1486+
// Preserve the original UnknownComponent error to keep
1487+
// single-component error behavior unchanged
1488+
let mut first_unknown_component_error = None;
14861489
let mut first_error = None;
14871490

14881491
for component in &components {
14891492
match Component::try_new(component, &distributable, target.as_ref()) {
1490-
Ok(new_component) => parsed_components.push((new_component, component.clone())),
1493+
Ok(new_component) => parsed_components.push((new_component, component)),
14911494
Err(err) => {
1492-
if first_error.is_none() {
1493-
first_error = Some(err);
1494-
}
1495+
first_error.get_or_insert(err);
14951496
}
14961497
}
14971498
}
@@ -1501,22 +1502,25 @@ async fn component_remove(
15011502
if let Some(RustupError::UnknownComponent { suggestion, .. }) =
15021503
err.downcast_ref::<RustupError>()
15031504
{
1504-
unknown_components.push((original_name, suggestion.clone()));
1505+
unknown_components.push((original_name.clone(), suggestion.clone()));
1506+
first_unknown_component_error.get_or_insert(err);
15051507
continue;
15061508
}
15071509

1508-
if first_error.is_none() {
1509-
first_error = Some(err);
1510-
}
1510+
first_error.get_or_insert(err);
15111511
}
15121512
}
15131513

1514-
if !unknown_components.is_empty() {
1515-
return Err(RustupError::UnknownComponents {
1516-
desc: distributable.desc().clone(),
1517-
components: unknown_components,
1514+
match unknown_components.len() {
1515+
0 => {}
1516+
1 => return Err(first_unknown_component_error.expect("missing first unknown error")),
1517+
_ => {
1518+
return Err(RustupError::UnknownComponents {
1519+
desc: distributable.desc().clone(),
1520+
components: unknown_components,
1521+
}
1522+
.into());
15181523
}
1519-
.into());
15201524
}
15211525

15221526
if let Some(err) = first_error {

tests/suite/cli_v2.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2180,7 +2180,7 @@ async fn remove_component_suggest_best_match() {
21802180
.expect(["rustup", "component", "remove", "rsl"])
21812181
.await
21822182
.with_stderr(snapbox::str![[r#"
2183-
error: toolchain 'nightly-[HOST_TRIPLE]' does not contain component 'rsl'; did you mean 'rls'?
2183+
error: toolchain 'nightly-[HOST_TRIPLE]' does not contain component 'rsl' for target '[HOST_TRIPLE]'; did you mean 'rls'?
21842184
21852185
"#]])
21862186
.is_err();
@@ -2200,7 +2200,7 @@ error: toolchain 'nightly-[HOST_TRIPLE]' does not contain component 'rsl-preview
22002200
.expect(["rustup", "component", "remove", "rustd"])
22012201
.await
22022202
.with_stderr(snapbox::str![[r#"
2203-
error: toolchain 'nightly-[HOST_TRIPLE]' does not contain component 'rustd'; did you mean 'rustc'?
2203+
error: toolchain 'nightly-[HOST_TRIPLE]' does not contain component 'rustd' for target '[HOST_TRIPLE]'; did you mean 'rustc'?
22042204
22052205
"#]])
22062206
.is_err();

0 commit comments

Comments
 (0)