Skip to content

Commit

Permalink
Auto merge of #2940 - matklad:ambiguous-deps, r=alexcrichton
Browse files Browse the repository at this point in the history
Warn about unused keys in dependency specification

Closes #2869 and #2695
  • Loading branch information
bors committed Aug 1, 2016
2 parents 1ceb0c9 + 5010618 commit 3417598
Show file tree
Hide file tree
Showing 2 changed files with 105 additions and 1 deletion.
38 changes: 37 additions & 1 deletion src/cargo/util/toml.rs
Original file line number Diff line number Diff line change
Expand Up @@ -775,8 +775,44 @@ impl TomlDependency {
cx.warnings.push(msg);
}

if details.git.is_none() {
let git_only_keys = [
(&details.branch, "branch"),
(&details.tag, "tag"),
(&details.rev, "rev")
];

for &(key, key_name) in git_only_keys.iter() {
if key.is_some() {
let msg = format!("key `{}` is ignored for dependency ({}). \
This will be considered an error in future versions",
key_name, name);
cx.warnings.push(msg)
}
}
}

let new_source_id = match (details.git.as_ref(), details.path.as_ref()) {
(Some(git), _) => {
(Some(git), maybe_path) => {
if maybe_path.is_some() {
let msg = format!("dependency ({}) specification is ambiguous. \
Only one of `git` or `path` is allowed. \
This will be considered an error in future versions", name);
cx.warnings.push(msg)
}

let n_details = [&details.branch, &details.tag, &details.rev]
.iter()
.filter(|d| d.is_some())
.count();

if n_details > 1 {
let msg = format!("dependency ({}) specification is ambiguous. \
Only one of `branch`, `tag` or `rev` is allowed. \
This will be considered an error in future versions", name);
cx.warnings.push(msg)
}

let reference = details.branch.clone().map(GitReference::Branch)
.or_else(|| details.tag.clone().map(GitReference::Tag))
.or_else(|| details.rev.clone().map(GitReference::Rev))
Expand Down
68 changes: 68 additions & 0 deletions tests/bad-config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -513,3 +513,71 @@ in the future.
[FINISHED] debug [unoptimized + debuginfo] target(s) in [..]
"));
}

#[test]
fn ambiguous_git_reference() {
let foo = project("foo")
.file("Cargo.toml", r#"
[package]
name = "foo"
version = "0.0.0"
authors = []
[dependencies.bar]
git = "https://example.com"
branch = "master"
tag = "some-tag"
"#)
.file("src/lib.rs", "");

assert_that(foo.cargo_process("build").arg("-v"),
execs().with_stderr_contains("\
[WARNING] dependency (bar) specification is ambiguous. \
Only one of `branch`, `tag` or `rev` is allowed. \
This will be considered an error in future versions
"));
}

#[test]
fn both_git_and_path_specified() {
let foo = project("foo")
.file("Cargo.toml", r#"
[package]
name = "foo"
version = "0.0.0"
authors = []
[dependencies.bar]
git = "https://example.com"
path = "bar"
"#)
.file("src/lib.rs", "");

assert_that(foo.cargo_process("build").arg("-v"),
execs().with_stderr_contains("\
[WARNING] dependency (bar) specification is ambiguous. \
Only one of `git` or `path` is allowed. \
This will be considered an error in future versions
"));
}

#[test]
fn ignored_git_revision() {
let foo = project("foo")
.file("Cargo.toml", r#"
[package]
name = "foo"
version = "0.0.0"
authors = []
[dependencies.bar]
path = "bar"
branch = "spam"
"#)
.file("src/lib.rs", "");

assert_that(foo.cargo_process("build").arg("-v"),
execs().with_stderr_contains("\
[WARNING] key `branch` is ignored for dependency (bar). \
This will be considered an error in future versions"));
}

0 comments on commit 3417598

Please sign in to comment.