From 88dc9f14e2d7752f2bd010f716a38cfbe5a8175b Mon Sep 17 00:00:00 2001 From: Carlhuda Date: Fri, 11 Apr 2014 15:55:47 -0700 Subject: [PATCH] Add transitive dependencies to the resolver --- src/cargo/core/package.rs | 4 ++++ src/cargo/core/resolver.rs | 22 +++++++++++++++++++--- src/cargo/mod.rs | 1 + 3 files changed, 24 insertions(+), 3 deletions(-) diff --git a/src/cargo/core/package.rs b/src/cargo/core/package.rs index 9bd4a219c..535e65c89 100644 --- a/src/cargo/core/package.rs +++ b/src/cargo/core/package.rs @@ -22,4 +22,8 @@ impl Package { pub fn get_name<'a>(&'a self) -> &'a str { self.name.as_slice() } + + pub fn get_dependencies<'a>(&'a self) -> &'a Vec { + &self.deps + } } diff --git a/src/cargo/core/resolver.rs b/src/cargo/core/resolver.rs index 09d1e48da..6f57f0b64 100644 --- a/src/cargo/core/resolver.rs +++ b/src/cargo/core/resolver.rs @@ -21,6 +21,12 @@ pub fn resolve(deps: &Vec, registry: &core::Registry) -> Cargo let pkg = opts.get(0); resolve.insert(pkg.get_name(), *pkg); + + for dep in pkg.get_dependencies().iter() { + if !resolve.contains_key_equiv(&dep.get_name()) { + remaining.push(dep.clone()); + } + } } } @@ -30,7 +36,6 @@ mod test { use hamcrest::{ assert_that, equal_to, - of_len, contains }; @@ -44,7 +49,15 @@ mod test { resolve }; + macro_rules! pkg( + ($name:expr => $($deps:expr),+) => ( + Package::new($name, &vec!($($deps),+).iter().map(|s| Dependency::new(*s)).collect()) + ); + ($name:expr) => ( + Package::new($name, &vec!()) + ) + ) fn pkg(name: &str) -> Package { Package::new(name, &Vec::::new()) @@ -83,14 +96,17 @@ mod test { #[test] pub fn test_resolving_multiple_deps() { - let reg = registry(vec!(pkg("foo"), pkg("bar"), pkg("baz"))); + let reg = registry(vec!(pkg!("foo"), pkg!("bar"), pkg!("baz"))); let res = resolve(&vec!(dep("foo"), dep("baz")), ®).unwrap(); - assert_that(&res, of_len(2)); assert_that(&res, contains(vec!(pkg("foo"), pkg("baz"))).exactly()); } #[test] pub fn test_resolving_transitive_deps() { + let reg = registry(vec!(pkg!("foo"), pkg!("bar" => "foo"))); + let res = resolve(&vec!(dep("bar")), ®).unwrap(); + + assert_that(&res, contains(vec!(pkg!("foo"), pkg!("bar" => "foo")))); } } diff --git a/src/cargo/mod.rs b/src/cargo/mod.rs index c26e4b412..58e6f72ba 100644 --- a/src/cargo/mod.rs +++ b/src/cargo/mod.rs @@ -2,6 +2,7 @@ #![crate_type="rlib"] #![allow(deprecated_owned_vector)] +#![feature(macro_rules)] extern crate collections; extern crate hammer;