Skip to content

Commit 1e985cc

Browse files
committed
Emit a warning when manifest specifies empty dependency constraints
This warns when encountering dependencies of either of these forms: [dependencies] foo = {} and [dependencies.foo] (with nothing further provided). In the future, this should likely become a hard error.
1 parent 2cb4e91 commit 1e985cc

File tree

2 files changed

+38
-7
lines changed

2 files changed

+38
-7
lines changed

src/cargo/util/toml.rs

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -515,31 +515,31 @@ impl TomlManifest {
515515

516516
// Collect the deps
517517
try!(process_dependencies(&mut cx, self.dependencies.as_ref(),
518-
|dep| dep));
518+
|dep| dep, &mut warnings));
519519
try!(process_dependencies(&mut cx, self.dev_dependencies.as_ref(),
520-
|dep| dep.set_kind(Kind::Development)));
520+
|dep| dep.set_kind(Kind::Development), &mut warnings));
521521
try!(process_dependencies(&mut cx, self.build_dependencies.as_ref(),
522-
|dep| dep.set_kind(Kind::Build)));
522+
|dep| dep.set_kind(Kind::Build), &mut warnings));
523523

524524
if let Some(targets) = self.target.as_ref() {
525525
for (name, platform) in targets.iter() {
526526
try!(process_dependencies(&mut cx,
527527
platform.dependencies.as_ref(),
528528
|dep| {
529529
dep.set_only_for_platform(Some(name.clone()))
530-
}));
530+
}, &mut warnings));
531531
try!(process_dependencies(&mut cx,
532532
platform.build_dependencies.as_ref(),
533533
|dep| {
534534
dep.set_only_for_platform(Some(name.clone()))
535535
.set_kind(Kind::Build)
536-
}));
536+
}, &mut warnings));
537537
try!(process_dependencies(&mut cx,
538538
platform.dev_dependencies.as_ref(),
539539
|dep| {
540540
dep.set_only_for_platform(Some(name.clone()))
541541
.set_kind(Kind::Development)
542-
}));
542+
}, &mut warnings));
543543
}
544544
}
545545
}
@@ -664,7 +664,8 @@ fn validate_bench_name(target: &TomlTarget) -> CargoResult<()> {
664664

665665
fn process_dependencies<F>(cx: &mut Context,
666666
new_deps: Option<&HashMap<String, TomlDependency>>,
667-
mut f: F) -> CargoResult<()>
667+
mut f: F,
668+
warnings: &mut Vec<String>) -> CargoResult<()>
668669
where F: FnMut(DependencyInner) -> DependencyInner
669670
{
670671
let dependencies = match new_deps {
@@ -680,6 +681,13 @@ fn process_dependencies<F>(cx: &mut Context,
680681
}
681682
TomlDependency::Detailed(ref details) => details.clone(),
682683
};
684+
685+
if details.version.is_none() && details.path.is_none() && details.git.is_none() {
686+
warnings.push(format!("warning: dependency ({}) specified without providing a local \
687+
path, Git repository, or version to use. This will be \
688+
considered an error in future versions", n));
689+
}
690+
683691
let reference = details.branch.clone().map(GitReference::Branch)
684692
.or_else(|| details.tag.clone().map(GitReference::Tag))
685693
.or_else(|| details.rev.clone().map(GitReference::Rev))

tests/test_bad_config.rs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
use support::{project, execs};
2+
use support::registry::Package;
23
use hamcrest::assert_that;
34

45
fn setup() {}
@@ -387,3 +388,25 @@ test!(unused_keys {
387388
unused manifest key: target.foo.bar
388389
"));
389390
});
391+
392+
test!(empty_dependencies {
393+
let p = project("empty_deps")
394+
.file("Cargo.toml", r#"
395+
[package]
396+
name = "empty_deps"
397+
version = "0.0.0"
398+
authors = []
399+
400+
[dependencies]
401+
foo = {}
402+
"#)
403+
.file("src/main.rs", "fn main() {}");
404+
405+
Package::new("foo", "0.0.1").publish();
406+
407+
assert_that(p.cargo_process("build"),
408+
execs().with_status(0).with_stderr_contains("\
409+
warning: dependency (foo) specified without providing a local path, Git repository, or version \
410+
to use. This will be considered an error in future versions
411+
"));
412+
});

0 commit comments

Comments
 (0)