Skip to content

Commit 738c699

Browse files
committed
Auto merge of #11997 - hi-rustin:rustin-patch-dep-message, r=weihanglo
Better error message when getting an empty dep table
2 parents 87871cc + e0276ca commit 738c699

File tree

8 files changed

+99
-45
lines changed

8 files changed

+99
-45
lines changed

src/cargo/util/toml_mut/dependency.rs

Lines changed: 55 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -225,62 +225,72 @@ impl Dependency {
225225
(key.to_owned(), None)
226226
};
227227

228-
let source: Source =
229-
if let Some(git) = table.get("git") {
230-
let mut src = GitSource::new(
231-
git.as_str()
232-
.ok_or_else(|| invalid_type(key, "git", git.type_name(), "string"))?,
233-
);
234-
if let Some(value) = table.get("branch") {
235-
src = src.set_branch(value.as_str().ok_or_else(|| {
228+
let source: Source = if let Some(git) = table.get("git") {
229+
let mut src = GitSource::new(
230+
git.as_str()
231+
.ok_or_else(|| invalid_type(key, "git", git.type_name(), "string"))?,
232+
);
233+
if let Some(value) = table.get("branch") {
234+
src =
235+
src.set_branch(value.as_str().ok_or_else(|| {
236236
invalid_type(key, "branch", value.type_name(), "string")
237237
})?);
238-
}
239-
if let Some(value) = table.get("tag") {
240-
src = src.set_tag(value.as_str().ok_or_else(|| {
238+
}
239+
if let Some(value) = table.get("tag") {
240+
src =
241+
src.set_tag(value.as_str().ok_or_else(|| {
241242
invalid_type(key, "tag", value.type_name(), "string")
242243
})?);
243-
}
244-
if let Some(value) = table.get("rev") {
245-
src = src.set_rev(value.as_str().ok_or_else(|| {
244+
}
245+
if let Some(value) = table.get("rev") {
246+
src =
247+
src.set_rev(value.as_str().ok_or_else(|| {
246248
invalid_type(key, "rev", value.type_name(), "string")
247249
})?);
248-
}
249-
if let Some(value) = table.get("version") {
250-
src = src.set_version(value.as_str().ok_or_else(|| {
251-
invalid_type(key, "version", value.type_name(), "string")
252-
})?);
253-
}
254-
src.into()
255-
} else if let Some(path) = table.get("path") {
256-
let path = crate_root
250+
}
251+
if let Some(value) = table.get("version") {
252+
src = src.set_version(value.as_str().ok_or_else(|| {
253+
invalid_type(key, "version", value.type_name(), "string")
254+
})?);
255+
}
256+
src.into()
257+
} else if let Some(path) = table.get("path") {
258+
let path =
259+
crate_root
257260
.join(path.as_str().ok_or_else(|| {
258261
invalid_type(key, "path", path.type_name(), "string")
259262
})?);
260-
let mut src = PathSource::new(path);
261-
if let Some(value) = table.get("version") {
262-
src = src.set_version(value.as_str().ok_or_else(|| {
263-
invalid_type(key, "version", value.type_name(), "string")
264-
})?);
265-
}
266-
src.into()
267-
} else if let Some(version) = table.get("version") {
268-
let src = RegistrySource::new(version.as_str().ok_or_else(|| {
263+
let mut src = PathSource::new(path);
264+
if let Some(value) = table.get("version") {
265+
src = src.set_version(value.as_str().ok_or_else(|| {
266+
invalid_type(key, "version", value.type_name(), "string")
267+
})?);
268+
}
269+
src.into()
270+
} else if let Some(version) = table.get("version") {
271+
let src =
272+
RegistrySource::new(version.as_str().ok_or_else(|| {
269273
invalid_type(key, "version", version.type_name(), "string")
270274
})?);
271-
src.into()
272-
} else if let Some(workspace) = table.get("workspace") {
273-
let workspace_bool = workspace.as_bool().ok_or_else(|| {
274-
invalid_type(key, "workspace", workspace.type_name(), "bool")
275-
})?;
276-
if !workspace_bool {
277-
anyhow::bail!("`{key}.workspace = false` is unsupported")
278-
}
279-
let src = WorkspaceSource::new();
280-
src.into()
281-
} else {
282-
anyhow::bail!("Unrecognized dependency source for `{key}`");
283-
};
275+
src.into()
276+
} else if let Some(workspace) = table.get("workspace") {
277+
let workspace_bool = workspace
278+
.as_bool()
279+
.ok_or_else(|| invalid_type(key, "workspace", workspace.type_name(), "bool"))?;
280+
if !workspace_bool {
281+
anyhow::bail!("`{key}.workspace = false` is unsupported")
282+
}
283+
let src = WorkspaceSource::new();
284+
src.into()
285+
} else {
286+
let mut msg = format!("unrecognized dependency source for `{key}`");
287+
if table.is_empty() {
288+
msg.push_str(
289+
", expected a local path, Git repository, version, or workspace dependency to be specified",
290+
);
291+
}
292+
anyhow::bail!(msg);
293+
};
284294
let registry = if let Some(value) = table.get("registry") {
285295
Some(
286296
value
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
[workspace]
2+
3+
[package]
4+
name = "cargo-list-test-fixture"
5+
version = "0.0.0"
6+
7+
[dependencies]
8+
your-face = { }
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
use cargo_test_support::compare::assert_ui;
2+
use cargo_test_support::prelude::*;
3+
use cargo_test_support::Project;
4+
5+
use crate::cargo_add::init_registry;
6+
use cargo_test_support::curr_dir;
7+
8+
#[cargo_test]
9+
fn case() {
10+
init_registry();
11+
let project = Project::from_template(curr_dir!().join("in"));
12+
let project_root = project.root();
13+
let cwd = &project_root;
14+
15+
snapbox::cmd::Command::cargo_ui()
16+
.arg("add")
17+
.arg_line("your-face --features eyes")
18+
.current_dir(cwd)
19+
.assert()
20+
.code(101)
21+
.stdout_matches_path(curr_dir!().join("stdout.log"))
22+
.stderr_matches_path(curr_dir!().join("stderr.log"));
23+
24+
assert_ui().subset_matches(curr_dir!().join("out"), &project_root);
25+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
[workspace]
2+
3+
[package]
4+
name = "cargo-list-test-fixture"
5+
version = "0.0.0"
6+
7+
[dependencies]
8+
your-face = { }
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
error: unrecognized dependency source for `your-face`, expected a local path, Git repository, version, or workspace dependency to be specified

tests/testsuite/cargo_add/empty_dep_table/stdout.log

Whitespace-only changes.

tests/testsuite/cargo_add/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ mod dev;
1515
mod dev_build_conflict;
1616
mod dev_prefer_existing_version;
1717
mod dry_run;
18+
mod empty_dep_table;
1819
mod features;
1920
mod features_empty;
2021
mod features_multiple_occurrences;

0 commit comments

Comments
 (0)