mirror of
https://github.com/rust-lang/cargo.git
synced 2025-09-28 11:20:36 +00:00
better error messages
This commit is contained in:
parent
5a5b5fce42
commit
0117eb1fec
@ -786,30 +786,28 @@ fn activation_error(cx: &Context,
|
|||||||
prev_active: &[Summary],
|
prev_active: &[Summary],
|
||||||
candidates: &[Candidate],
|
candidates: &[Candidate],
|
||||||
config: Option<&Config>) -> CargoError {
|
config: Option<&Config>) -> CargoError {
|
||||||
|
let graph = cx.graph();
|
||||||
|
let describe_path = |pkgid: &PackageId| -> String {
|
||||||
|
use std::fmt::Write;
|
||||||
|
let dep_path = graph.path_to_top(pkgid);
|
||||||
|
let mut dep_path_desc = format!("package `{}`", dep_path[0]);
|
||||||
|
for dep in dep_path.iter().skip(1) {
|
||||||
|
write!(dep_path_desc,
|
||||||
|
"\n ... which is depended on by `{}`",
|
||||||
|
dep).unwrap();
|
||||||
|
}
|
||||||
|
dep_path_desc
|
||||||
|
};
|
||||||
if !candidates.is_empty() {
|
if !candidates.is_empty() {
|
||||||
let mut msg = format!("failed to select a version for `{}` \
|
let mut msg = format!("failed to select a version for `{0}`\n\
|
||||||
(required by `{}`):\n\
|
|
||||||
all possible versions conflict with \
|
all possible versions conflict with \
|
||||||
previously selected versions of `{}`",
|
previously selected versions of `{0}`\n",
|
||||||
dep.name(), parent.name(),
|
|
||||||
dep.name());
|
dep.name());
|
||||||
let graph = cx.graph();
|
msg.push_str("required by ");
|
||||||
'outer: for v in prev_active.iter() {
|
msg.push_str(&describe_path(parent.package_id()));
|
||||||
for node in graph.iter() {
|
for v in prev_active.iter() {
|
||||||
let edges = match graph.edges(node) {
|
msg.push_str("\n previously selected ");
|
||||||
Some(edges) => edges,
|
msg.push_str(&describe_path(v.package_id()));
|
||||||
None => continue,
|
|
||||||
};
|
|
||||||
for edge in edges {
|
|
||||||
if edge != v.package_id() { continue }
|
|
||||||
|
|
||||||
msg.push_str(&format!("\n version {} in use by {}",
|
|
||||||
v.version(), edge));
|
|
||||||
continue 'outer;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
msg.push_str(&format!("\n version {} in use by ??",
|
|
||||||
v.version()));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
msg.push_str(&format!("\n possible versions to select: {}",
|
msg.push_str(&format!("\n possible versions to select: {}",
|
||||||
@ -853,15 +851,15 @@ fn activation_error(cx: &Context,
|
|||||||
versions.join(", ")
|
versions.join(", ")
|
||||||
};
|
};
|
||||||
|
|
||||||
let mut msg = format!("no matching version `{}` found for package `{}` \
|
let mut msg = format!("no matching version `{}` found for package `{}`\n\
|
||||||
(required by `{}`)\n\
|
|
||||||
location searched: {}\n\
|
location searched: {}\n\
|
||||||
versions found: {}",
|
versions found: {}\n",
|
||||||
dep.version_req(),
|
dep.version_req(),
|
||||||
dep.name(),
|
dep.name(),
|
||||||
parent.name(),
|
|
||||||
dep.source_id(),
|
dep.source_id(),
|
||||||
versions);
|
versions);
|
||||||
|
msg.push_str("required by ");
|
||||||
|
msg.push_str(&describe_path(parent.package_id()));
|
||||||
|
|
||||||
// If we have a path dependency with a locked version, then this may
|
// If we have a path dependency with a locked version, then this may
|
||||||
// indicate that we updated a sub-package and forgot to run `cargo
|
// indicate that we updated a sub-package and forgot to run `cargo
|
||||||
@ -874,13 +872,13 @@ fn activation_error(cx: &Context,
|
|||||||
|
|
||||||
msg
|
msg
|
||||||
} else {
|
} else {
|
||||||
format!("no matching package named `{}` found \
|
let mut msg = format!("no matching package named `{}` found\n\
|
||||||
(required by `{}`)\n\
|
location searched: {}\n",
|
||||||
location searched: {}\n\
|
dep.name(), dep.source_id());
|
||||||
version required: {}",
|
msg.push_str("required by ");
|
||||||
dep.name(), parent.name(),
|
msg.push_str(&describe_path(parent.package_id()));
|
||||||
dep.source_id(),
|
|
||||||
dep.version_req())
|
msg
|
||||||
};
|
};
|
||||||
|
|
||||||
if let Some(config) = config {
|
if let Some(config) = config {
|
||||||
|
@ -784,9 +784,9 @@ fn cargo_compile_with_dep_name_mismatch() {
|
|||||||
|
|
||||||
assert_that(p.cargo("build"),
|
assert_that(p.cargo("build"),
|
||||||
execs().with_status(101).with_stderr(&format!(
|
execs().with_status(101).with_stderr(&format!(
|
||||||
r#"[ERROR] no matching package named `notquitebar` found (required by `foo`)
|
r#"error: no matching package named `notquitebar` found
|
||||||
location searched: {proj_dir}/bar
|
location searched: {proj_dir}/bar
|
||||||
version required: *
|
required by package `foo v0.0.1 ({proj_dir})`
|
||||||
"#, proj_dir = p.url())));
|
"#, proj_dir = p.url())));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -921,9 +921,9 @@ fn cargo_compile_offline_not_try_update() {
|
|||||||
assert_that(p.cargo("build").masquerade_as_nightly_cargo().arg("-Zoffline"),
|
assert_that(p.cargo("build").masquerade_as_nightly_cargo().arg("-Zoffline"),
|
||||||
execs().with_status(101)
|
execs().with_status(101)
|
||||||
.with_stderr("\
|
.with_stderr("\
|
||||||
error: no matching package named `not_cached_dep` found (required by `bar`)
|
error: no matching package named `not_cached_dep` found
|
||||||
location searched: registry `[..]`
|
location searched: registry `[..]`
|
||||||
version required: ^1.2.5
|
required by package `bar v0.1.0 ([..])`
|
||||||
As a reminder, you're using offline mode (-Z offline) \
|
As a reminder, you're using offline mode (-Z offline) \
|
||||||
which can sometimes cause surprising resolution failures, \
|
which can sometimes cause surprising resolution failures, \
|
||||||
if this error is too confusing you may with to retry \
|
if this error is too confusing you may with to retry \
|
||||||
@ -1026,10 +1026,16 @@ fn incompatible_dependencies() {
|
|||||||
assert_that(p.cargo("build"),
|
assert_that(p.cargo("build"),
|
||||||
execs().with_status(101)
|
execs().with_status(101)
|
||||||
.with_stderr_contains("\
|
.with_stderr_contains("\
|
||||||
error: failed to select a version for `bad` (required by `baz`):
|
error: failed to select a version for `bad`
|
||||||
all possible versions conflict with previously selected versions of `bad`
|
all possible versions conflict with previously selected versions of `bad`
|
||||||
version 0.1.0 in use by bad v0.1.0
|
required by package `baz v0.1.0`
|
||||||
version 1.0.0 in use by bad v1.0.0
|
... which is depended on by `incompatible_dependencies v0.0.1 ([..])`
|
||||||
|
previously selected package `bad v0.1.0`
|
||||||
|
... which is depended on by `foo v0.1.0`
|
||||||
|
... which is depended on by `incompatible_dependencies v0.0.1 ([..])`
|
||||||
|
previously selected package `bad v1.0.0`
|
||||||
|
... which is depended on by `bar v0.1.0`
|
||||||
|
... which is depended on by `incompatible_dependencies v0.0.1 ([..])`
|
||||||
possible versions to select: 1.0.2, 1.0.1"));
|
possible versions to select: 1.0.2, 1.0.1"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1068,9 +1074,10 @@ fn compile_offline_while_transitive_dep_not_cached() {
|
|||||||
assert_that(p.cargo("build").masquerade_as_nightly_cargo().arg("-Zoffline"),
|
assert_that(p.cargo("build").masquerade_as_nightly_cargo().arg("-Zoffline"),
|
||||||
execs().with_status(101)
|
execs().with_status(101)
|
||||||
.with_stderr("\
|
.with_stderr("\
|
||||||
error: no matching package named `bar` found (required by `foo`)
|
error: no matching package named `bar` found
|
||||||
location searched: registry `[..]`
|
location searched: registry `[..]`
|
||||||
version required: = 1.0.0
|
required by package `foo v0.1.0`
|
||||||
|
... which is depended on by `transitive_load_test v0.0.1 ([..]/transitive_load_test)`
|
||||||
As a reminder, you're using offline mode (-Z offline) \
|
As a reminder, you're using offline mode (-Z offline) \
|
||||||
which can sometimes cause surprising resolution failures, \
|
which can sometimes cause surprising resolution failures, \
|
||||||
if this error is too confusing you may with to retry \
|
if this error is too confusing you may with to retry \
|
||||||
@ -1110,9 +1117,10 @@ fn compile_path_dep_then_change_version() {
|
|||||||
|
|
||||||
assert_that(p.cargo("build"),
|
assert_that(p.cargo("build"),
|
||||||
execs().with_status(101).with_stderr("\
|
execs().with_status(101).with_stderr("\
|
||||||
[ERROR] no matching version `= 0.0.1` found for package `bar` (required by `foo`)
|
error: no matching version `= 0.0.1` found for package `bar`
|
||||||
location searched: [..]
|
location searched: [..]
|
||||||
versions found: 0.0.2
|
versions found: 0.0.2
|
||||||
|
required by package `foo v0.0.1 ([..]/foo)`
|
||||||
consider running `cargo update` to update a path dependency's locked version
|
consider running `cargo update` to update a path dependency's locked version
|
||||||
"));
|
"));
|
||||||
}
|
}
|
||||||
|
@ -195,9 +195,9 @@ fn simple_install_fail() {
|
|||||||
error: failed to compile `bar v0.1.0`, intermediate artifacts can be found at `[..]`
|
error: failed to compile `bar v0.1.0`, intermediate artifacts can be found at `[..]`
|
||||||
|
|
||||||
Caused by:
|
Caused by:
|
||||||
no matching package named `baz` found (required by `bar`)
|
no matching package named `baz` found
|
||||||
location searched: registry `https://github.com/rust-lang/crates.io-index`
|
location searched: registry `https://github.com/rust-lang/crates.io-index`
|
||||||
version required: ^9.8.7
|
required by package `bar v0.1.0`
|
||||||
"));
|
"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -276,9 +276,9 @@ fn not_there() {
|
|||||||
|
|
||||||
assert_that(p.cargo("build"),
|
assert_that(p.cargo("build"),
|
||||||
execs().with_status(101).with_stderr("\
|
execs().with_status(101).with_stderr("\
|
||||||
error: no matching package named `foo` found (required by `bar`)
|
error: no matching package named `foo` found
|
||||||
location searched: [..]
|
location searched: [..]
|
||||||
version required: ^0.1.0
|
required by package `bar v0.1.0 ([..])`
|
||||||
"));
|
"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -950,9 +950,9 @@ fn invalid_path_dep_in_workspace_with_lockfile() {
|
|||||||
assert_that(p.cargo("build"),
|
assert_that(p.cargo("build"),
|
||||||
execs().with_status(101)
|
execs().with_status(101)
|
||||||
.with_stderr("\
|
.with_stderr("\
|
||||||
error: no matching package named `bar` found (required by `foo`)
|
error: no matching package named `bar` found
|
||||||
location searched: [..]
|
location searched: [..]
|
||||||
version required: *
|
required by package `foo v0.5.0 ([..])`
|
||||||
"));
|
"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -110,9 +110,9 @@ fn nonexistent() {
|
|||||||
assert_that(p.cargo("build"),
|
assert_that(p.cargo("build"),
|
||||||
execs().with_status(101).with_stderr("\
|
execs().with_status(101).with_stderr("\
|
||||||
[UPDATING] registry [..]
|
[UPDATING] registry [..]
|
||||||
[ERROR] no matching package named `nonexistent` found (required by `foo`)
|
error: no matching package named `nonexistent` found
|
||||||
location searched: registry [..]
|
location searched: registry [..]
|
||||||
version required: >= 0.0.0
|
required by package `foo v0.0.1 ([..])`
|
||||||
"));
|
"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -136,9 +136,10 @@ fn wrong_version() {
|
|||||||
|
|
||||||
assert_that(p.cargo("build"),
|
assert_that(p.cargo("build"),
|
||||||
execs().with_status(101).with_stderr_contains("\
|
execs().with_status(101).with_stderr_contains("\
|
||||||
[ERROR] no matching version `>= 1.0.0` found for package `foo` (required by `foo`)
|
error: no matching version `>= 1.0.0` found for package `foo`
|
||||||
location searched: registry [..]
|
location searched: registry [..]
|
||||||
versions found: 0.0.2, 0.0.1
|
versions found: 0.0.2, 0.0.1
|
||||||
|
required by package `foo v0.0.1 ([..])`
|
||||||
"));
|
"));
|
||||||
|
|
||||||
Package::new("foo", "0.0.3").publish();
|
Package::new("foo", "0.0.3").publish();
|
||||||
@ -146,9 +147,10 @@ versions found: 0.0.2, 0.0.1
|
|||||||
|
|
||||||
assert_that(p.cargo("build"),
|
assert_that(p.cargo("build"),
|
||||||
execs().with_status(101).with_stderr_contains("\
|
execs().with_status(101).with_stderr_contains("\
|
||||||
[ERROR] no matching version `>= 1.0.0` found for package `foo` (required by `foo`)
|
error: no matching version `>= 1.0.0` found for package `foo`
|
||||||
location searched: registry [..]
|
location searched: registry [..]
|
||||||
versions found: 0.0.4, 0.0.3, 0.0.2, ...
|
versions found: 0.0.4, 0.0.3, 0.0.2, ...
|
||||||
|
required by package `foo v0.0.1 ([..])`
|
||||||
"));
|
"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -204,9 +206,9 @@ fn update_registry() {
|
|||||||
|
|
||||||
assert_that(p.cargo("build"),
|
assert_that(p.cargo("build"),
|
||||||
execs().with_status(101).with_stderr_contains("\
|
execs().with_status(101).with_stderr_contains("\
|
||||||
[ERROR] no matching package named `notyet` found (required by `foo`)
|
error: no matching package named `notyet` found
|
||||||
location searched: registry [..]
|
location searched: registry `[..]`
|
||||||
version required: >= 0.0.0
|
required by package `foo v0.0.1 ([..])`
|
||||||
"));
|
"));
|
||||||
|
|
||||||
Package::new("notyet", "0.0.1").publish();
|
Package::new("notyet", "0.0.1").publish();
|
||||||
@ -256,9 +258,9 @@ fn package_with_path_deps() {
|
|||||||
[ERROR] failed to verify package tarball
|
[ERROR] failed to verify package tarball
|
||||||
|
|
||||||
Caused by:
|
Caused by:
|
||||||
no matching package named `notyet` found (required by `foo`)
|
no matching package named `notyet` found
|
||||||
location searched: registry [..]
|
location searched: registry [..]
|
||||||
version required: ^0.0.1
|
required by package `foo v0.0.1 ([..])`
|
||||||
"));
|
"));
|
||||||
|
|
||||||
Package::new("notyet", "0.0.1").publish();
|
Package::new("notyet", "0.0.1").publish();
|
||||||
@ -401,9 +403,10 @@ fn relying_on_a_yank_is_bad() {
|
|||||||
|
|
||||||
assert_that(p.cargo("build"),
|
assert_that(p.cargo("build"),
|
||||||
execs().with_status(101).with_stderr_contains("\
|
execs().with_status(101).with_stderr_contains("\
|
||||||
[ERROR] no matching version `= 0.0.2` found for package `baz` (required by `bar`)
|
error: no matching version `= 0.0.2` found for package `baz`
|
||||||
location searched: registry [..]
|
location searched: registry `[..]`
|
||||||
versions found: 0.0.1
|
versions found: 0.0.1
|
||||||
|
required by package `bar v0.0.1`
|
||||||
"));
|
"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -436,9 +439,9 @@ fn yanks_in_lockfiles_are_ok() {
|
|||||||
|
|
||||||
assert_that(p.cargo("update"),
|
assert_that(p.cargo("update"),
|
||||||
execs().with_status(101).with_stderr_contains("\
|
execs().with_status(101).with_stderr_contains("\
|
||||||
[ERROR] no matching package named `bar` found (required by `foo`)
|
error: no matching package named `bar` found
|
||||||
location searched: registry [..]
|
location searched: registry [..]
|
||||||
version required: *
|
required by package `foo v0.0.1 ([..])`
|
||||||
"));
|
"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -513,9 +513,9 @@ fn resolving_but_no_exists() {
|
|||||||
assert!(res.is_err());
|
assert!(res.is_err());
|
||||||
|
|
||||||
assert_eq!(res.err().unwrap().to_string(), "\
|
assert_eq!(res.err().unwrap().to_string(), "\
|
||||||
no matching package named `foo` found (required by `root`)
|
no matching package named `foo` found\n\
|
||||||
location searched: registry `http://example.com/`
|
location searched: registry `http://example.com/`\n\
|
||||||
version required: ^1\
|
required by package `root v1.0.0 (registry `http://example.com/`)`\
|
||||||
");
|
");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user