Get nested dependencies working
authorYehuda Katz <wycats@gmail.com>
Thu, 8 May 2014 23:49:58 +0000 (16:49 -0700)
committerYehuda Katz <wycats@gmail.com>
Thu, 8 May 2014 23:50:53 +0000 (16:50 -0700)
Makefile
src/cargo/core/package.rs
src/cargo/ops/cargo_rustc.rs
tests/support.rs
tests/test_cargo_compile.rs

index 683f4ecfd0edeb0b55ffa125a4856c1443e231f2..accb5b87c905612e5669e0065e5899db929c0499 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -60,7 +60,7 @@ test-unit: target/tests/test-unit
        target/tests/test-unit
 
 test-integration: target/tests/test-integration
-       CARGO_BIN_PATH=$(PWD)/target/ $<
+       RUST_TEST_TASKS=1 CARGO_BIN_PATH=$(PWD)/target/ $<
 
 test: test-unit test-integration
 
index 8b73d359e47926d3cf5d8d0fd07d7e5b237b80c5..456d4902ab1f0e65f98e974fc3f6818d34f2aec2 100644 (file)
@@ -98,6 +98,7 @@ impl Show for Package {
     }
 }
 
+#[deriving(Eq,Clone,Show)]
 pub struct PackageSet {
     packages: ~[Package]
 }
@@ -118,6 +119,10 @@ impl PackageSet {
         names.iter().map(|name| self.get(*name) ).collect()
     }
 
+    pub fn get_packages<'a>(&'a self) -> &'a [Package] {
+        self.packages.as_slice()
+    }
+
     // For now, assume that the package set contains only one package with a
     // given name
     pub fn sort(&self) -> Option<PackageSet> {
index 7f34908364c27d9fdbc04c871424c315fb5f6f70..750f1076bae5bfd12d2a578c76889fb39079e2f1 100644 (file)
@@ -32,7 +32,7 @@ fn compile_pkg(pkg: &core::Package, pkgs: &core::PackageSet) -> CLIResult<()> {
 
     // compile
     for target in pkg.get_targets().iter() {
-        try!(rustc(pkg.get_root(), target, &target_dir, deps(pkg, pkgs)));
+        try!(rustc(pkg.get_root(), target, &target_dir, pkgs.get_packages()))
     }
 
     Ok(())
@@ -74,9 +74,3 @@ fn build_deps_args(dst: &mut Args, deps: &[core::Package]) {
         dst.push(dir.as_str().unwrap().to_owned());
     }
 }
-
-// Collect all dependencies for a given package
-fn deps(pkg: &core::Package, pkgs: &core::PackageSet) -> ~[core::Package] {
-    let names: ~[&str] = pkg.get_dependencies().iter().map(|d| d.get_name()).collect();
-    pkgs.get_all(names).iter().map(|p| (*p).clone()).collect()
-}
index eee1f7e56e67bdc5b723504efe8e3d9c1c79a1b7..72ae985d0a1e784f370d71beba5b79fc50b21e19 100644 (file)
@@ -6,6 +6,7 @@ use std::os;
 use std::path::{Path,BytesContainer};
 use std::str;
 use std::vec::Vec;
+use std::fmt::Show;
 use ham = hamcrest;
 use cargo::util::{process,ProcessBuilder};
 
@@ -94,8 +95,6 @@ impl ProjectBuilder {
           try!(file.mk());
         }
 
-        println!("{}", self.root.display());
-        println!("{:?}", self);
         Ok(())
     }
 
@@ -130,20 +129,20 @@ trait ErrMsg<T> {
     fn with_err_msg(self, val: ~str) -> Result<T, ~str>;
 }
 
-impl<T, E> ErrMsg<T> for Result<T, E> {
+impl<T, E: Show> ErrMsg<T> for Result<T, E> {
     fn with_err_msg(self, val: ~str) -> Result<T, ~str> {
         match self {
             Ok(val) => Ok(val),
-            Err(_) => Err(val)
+            Err(err) => Err(format!("{}; original={}", val, err))
         }
     }
 }
 
 // Path to cargo executables
 pub fn cargo_dir() -> Path {
-  os::getenv("CARGO_BIN_PATH")
-    .map(|s| Path::new(s))
-    .unwrap_or_else(|| fail!("CARGO_BIN_PATH wasn't set. Cannot continue running test"))
+    os::getenv("CARGO_BIN_PATH")
+        .map(|s| Path::new(s))
+        .unwrap_or_else(|| fail!("CARGO_BIN_PATH wasn't set. Cannot continue running test"))
 }
 
 /*
@@ -221,3 +220,16 @@ pub fn execs() -> Box<Execs> {
     expect_exit_code: None
   }
 }
+
+pub trait ResultTest<T,E> {
+    fn assert(self) -> T;
+}
+
+impl<T,E: Show> ResultTest<T,E> for Result<T,E> {
+    fn assert(self) -> T {
+        match self {
+            Ok(val) => val,
+            Err(err) => fail!("Result was error: {}", err)
+        }
+    }
+}
index 8a6596695aa0091f8c1afba37b21b9ce77a17b23..93fa0ff0b6aeecd4da02fc106bb9d4d69eea9ced 100644 (file)
@@ -1,11 +1,10 @@
-use support::{project,execs};
+use support::{ResultTest,project,execs};
 use hamcrest::{assert_that,existing_file};
 use cargo;
 
 fn setup() {
 }
 
-// Currently doesn't pass due to the code being broken
 test!(cargo_compile {
     let p = project("foo")
         .file("Cargo.toml", r#"
@@ -28,8 +27,8 @@ test!(cargo_compile {
 
     p.cargo_process("cargo-compile")
       .args([])
-      .exec()
-      .unwrap();
+      .exec_with_output()
+      .assert();
 
     assert_that(&p.root().join("target/foo"), existing_file());
 
@@ -38,4 +37,86 @@ test!(cargo_compile {
       execs().with_stdout("i am foo\n"));
 })
 
+test!(cargo_compile_with_nested_deps {
+    let mut p = project("foo");
+    let bar = p.root().join("bar");
+    let baz = p.root().join("baz");
+
+    p = p
+        .file(".cargo/config", format!(r#"
+            paths = ["{}", "{}"]
+        "#, bar.display(), baz.display()))
+        .file("Cargo.toml", r#"
+            [project]
+
+            name = "foo"
+            version = "0.5.0"
+            authors = ["wycats@example.com"]
+
+            [dependencies]
+
+            bar = "0.5.0"
+
+            [[bin]]
+
+            name = "foo"
+        "#)
+        .file("src/foo.rs", r#"
+            extern crate bar;
+
+            fn main() {
+                println!("{}", bar::gimme());
+            }
+        "#)
+        .file("bar/Cargo.toml", r#"
+            [project]
+
+            name = "bar"
+            version = "0.5.0"
+            authors = ["wycats@example.com"]
+
+            [dependencies]
+
+            baz = "0.5.0"
+
+            [[lib]]
+
+            name = "bar"
+        "#)
+        .file("bar/src/bar.rs", r#"
+            extern crate baz;
+
+            pub fn gimme() -> ~str {
+                baz::gimme()
+            }
+        "#)
+        .file("baz/Cargo.toml", r#"
+            [project]
+
+            name = "baz"
+            version = "0.5.0"
+            authors = ["wycats@example.com"]
+
+            [[lib]]
+
+            name = "baz"
+        "#)
+        .file("baz/src/baz.rs", r#"
+            pub fn gimme() -> ~str {
+                "test passed".to_owned()
+            }
+        "#)
+        .build();
+
+    p.cargo_process("cargo-compile")
+        .exec_with_output()
+        .assert();
+
+    assert_that(&p.root().join("target/foo"), existing_file());
+
+    assert_that(
+      cargo::util::process("foo").extra_path(p.root().join("target")),
+      execs().with_stdout("test passed\n"));
+})
+
 // test!(compiling_project_with_invalid_manifest)