Add transitive dependencies to the resolver
authorCarlhuda <carlhuda@tilde.io>
Fri, 11 Apr 2014 22:55:47 +0000 (15:55 -0700)
committerCarlhuda <carlhuda@tilde.io>
Fri, 11 Apr 2014 22:55:47 +0000 (15:55 -0700)
src/cargo/core/package.rs
src/cargo/core/resolver.rs
src/cargo/mod.rs

index 9bd4a219c54053879c0945f10a4497d3865f6ba2..535e65c8983604e59056712299bf807eafd56950 100644 (file)
@@ -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<core::Dependency> {
+      &self.deps
+  }
 }
index 09d1e48da34535fbde7746596739a3d78312039e..6f57f0b647db1eb166fee024a65f35316939c0fc 100644 (file)
@@ -21,6 +21,12 @@ pub fn resolve(deps: &Vec<core::Dependency>, 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::<Dependency>::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")), &reg).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")), &reg).unwrap();
+
+        assert_that(&res, contains(vec!(pkg!("foo"), pkg!("bar" => "foo"))));
     }
 }
index c26e4b412d07f35ec1fdc259e3f123e14e79e2df..58e6f72baeeaa90225f1bcfbca08d1c50302a0f8 100644 (file)
@@ -2,6 +2,7 @@
 #![crate_type="rlib"]
 
 #![allow(deprecated_owned_vector)]
+#![feature(macro_rules)]
 
 extern crate collections;
 extern crate hammer;