Skip to content

Commit e4d6786

Browse files
committed
Auto merge of #13433 - arlosi:builtin-replacement-messages, r=epage
Fix confusing error messages for sparse index replaced source The built-in sparse crates.io index `index.crates.io` is implemented in Cargo using source replacement. When an error occurs downloading from the sparse index, the message includes text that looks like the user configured source replacement, even when they did not. This change extends the special case for the built-in replacement of crates.io to include all the error messages for source replacement in addition the the description special case.
2 parents 06a19e6 + dbd7c98 commit e4d6786

File tree

3 files changed

+89
-32
lines changed

3 files changed

+89
-32
lines changed

src/cargo/sources/replaced.rs

Lines changed: 47 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,6 @@ use crate::sources::IndexSummary;
66
use crate::util::errors::CargoResult;
77
use std::task::Poll;
88

9-
use anyhow::Context as _;
10-
119
/// A source that replaces one source with the other. This manages the [source
1210
/// replacement] feature.
1311
///
@@ -37,6 +35,14 @@ impl<'cfg> ReplacedSource<'cfg> {
3735
inner: src,
3836
}
3937
}
38+
39+
/// Is this source a built-in replacement of crates.io?
40+
///
41+
/// Built-in source replacement of crates.io for sparse registry or tests
42+
/// should not show messages indicating source replacement.
43+
fn is_builtin_replacement(&self) -> bool {
44+
self.replace_with.is_crates_io() && self.to_replace.is_crates_io()
45+
}
4046
}
4147

4248
impl<'cfg> Source for ReplacedSource<'cfg> {
@@ -70,10 +76,14 @@ impl<'cfg> Source for ReplacedSource<'cfg> {
7076
f(summary.map_summary(|s| s.map_source(replace_with, to_replace)))
7177
})
7278
.map_err(|e| {
73-
e.context(format!(
74-
"failed to query replaced source {}",
75-
self.to_replace
76-
))
79+
if self.is_builtin_replacement() {
80+
e
81+
} else {
82+
e.context(format!(
83+
"failed to query replaced source {}",
84+
self.to_replace
85+
))
86+
}
7787
})
7888
}
7989

@@ -87,10 +97,16 @@ impl<'cfg> Source for ReplacedSource<'cfg> {
8797

8898
fn download(&mut self, id: PackageId) -> CargoResult<MaybePackage> {
8999
let id = id.with_source_id(self.replace_with);
90-
let pkg = self
91-
.inner
92-
.download(id)
93-
.with_context(|| format!("failed to download replaced source {}", self.to_replace))?;
100+
let pkg = self.inner.download(id).map_err(|e| {
101+
if self.is_builtin_replacement() {
102+
e
103+
} else {
104+
e.context(format!(
105+
"failed to download replaced source {}",
106+
self.to_replace
107+
))
108+
}
109+
})?;
94110
Ok(match pkg {
95111
MaybePackage::Ready(pkg) => {
96112
MaybePackage::Ready(pkg.map_source(self.replace_with, self.to_replace))
@@ -101,10 +117,16 @@ impl<'cfg> Source for ReplacedSource<'cfg> {
101117

102118
fn finish_download(&mut self, id: PackageId, data: Vec<u8>) -> CargoResult<Package> {
103119
let id = id.with_source_id(self.replace_with);
104-
let pkg = self
105-
.inner
106-
.finish_download(id, data)
107-
.with_context(|| format!("failed to download replaced source {}", self.to_replace))?;
120+
let pkg = self.inner.finish_download(id, data).map_err(|e| {
121+
if self.is_builtin_replacement() {
122+
e
123+
} else {
124+
e.context(format!(
125+
"failed to download replaced source {}",
126+
self.to_replace
127+
))
128+
}
129+
})?;
108130
Ok(pkg.map_source(self.replace_with, self.to_replace))
109131
}
110132

@@ -118,9 +140,7 @@ impl<'cfg> Source for ReplacedSource<'cfg> {
118140
}
119141

120142
fn describe(&self) -> String {
121-
if self.replace_with.is_crates_io() && self.to_replace.is_crates_io() {
122-
// Built-in source replacement of crates.io for sparse registry or tests
123-
// doesn't need duplicate description (crates.io replacing crates.io).
143+
if self.is_builtin_replacement() {
124144
self.inner.describe()
125145
} else {
126146
format!(
@@ -148,8 +168,15 @@ impl<'cfg> Source for ReplacedSource<'cfg> {
148168
}
149169

150170
fn block_until_ready(&mut self) -> CargoResult<()> {
151-
self.inner
152-
.block_until_ready()
153-
.with_context(|| format!("failed to update replaced source {}", self.to_replace))
171+
self.inner.block_until_ready().map_err(|e| {
172+
if self.is_builtin_replacement() {
173+
e
174+
} else {
175+
e.context(format!(
176+
"failed to update replaced source {}",
177+
self.to_replace
178+
))
179+
}
180+
})
154181
}
155182
}

tests/testsuite/credential_process.rs

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -275,10 +275,7 @@ fn not_found() {
275275
r#"[UPDATING] [..]
276276
[CREDENTIAL] [..]not_found[..] get crates-io
277277
{"v":1[..]
278-
[ERROR] failed to query replaced source registry `crates-io`
279-
280-
Caused by:
281-
no token found, please run `cargo login`
278+
[ERROR] no token found, please run `cargo login`
282279
"#,
283280
)
284281
.run();
@@ -314,10 +311,7 @@ fn all_not_found() {
314311
r#"[UPDATING] [..]
315312
[CREDENTIAL] [..]not_found[..] get crates-io
316313
{"v":1,"registry":{"index-url":"[..]","name":"crates-io","headers":[[..]"WWW-Authenticate: Cargo login_url=\"https://test-registry-login/me\""[..]]},"kind":"get","operation":"read"}
317-
[ERROR] failed to query replaced source registry `crates-io`
318-
319-
Caused by:
320-
no token found, please run `cargo login`
314+
[ERROR] no token found, please run `cargo login`
321315
"#,
322316
)
323317
.run();
@@ -353,10 +347,7 @@ fn all_not_supported() {
353347
r#"[UPDATING] [..]
354348
[CREDENTIAL] [..]not_supported[..] get crates-io
355349
{"v":1,"registry":{"index-url":"[..]","name":"crates-io","headers":[[..]"WWW-Authenticate: Cargo login_url=\"https://test-registry-login/me\""[..]]},"kind":"get","operation":"read"}
356-
[ERROR] failed to query replaced source registry `crates-io`
357-
358-
Caused by:
359-
no credential providers could handle the request
350+
[ERROR] no credential providers could handle the request
360351
"#,
361352
)
362353
.run();

tests/testsuite/registry.rs

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3664,3 +3664,42 @@ fn differ_only_by_metadata_with_lockfile() {
36643664
)
36653665
.run();
36663666
}
3667+
3668+
#[cargo_test]
3669+
fn builtin_source_replacement() {
3670+
// errors for builtin source replacement of crates.io
3671+
// should not include mention of source replacement in the error message.
3672+
let server = RegistryBuilder::new().build();
3673+
3674+
let p = project()
3675+
.file(
3676+
"Cargo.toml",
3677+
r#"
3678+
[package]
3679+
name = "foo"
3680+
version = "0.0.1"
3681+
3682+
[dependencies]
3683+
bad-cksum = ">= 0.0.0"
3684+
"#,
3685+
)
3686+
.file("src/main.rs", "fn main() {}")
3687+
.build();
3688+
3689+
let pkg = Package::new("bad-cksum", "0.0.1");
3690+
pkg.publish();
3691+
t!(File::create(&pkg.archive_dst()));
3692+
3693+
p.cargo("check -v")
3694+
.replace_crates_io(&server.index_url())
3695+
.with_status(101)
3696+
.with_stderr(
3697+
"\
3698+
[UPDATING] [..] index
3699+
[DOWNLOADING] crates ...
3700+
[DOWNLOADED] bad-cksum [..]
3701+
[ERROR] failed to verify the checksum of `bad-cksum v0.0.1`
3702+
",
3703+
)
3704+
.run();
3705+
}

0 commit comments

Comments
 (0)