Clean up cargo-compile
authorYehuda Katz <wycats@gmail.com>
Wed, 7 May 2014 22:48:43 +0000 (15:48 -0700)
committerYehuda Katz <wycats@gmail.com>
Wed, 7 May 2014 22:49:01 +0000 (15:49 -0700)
.gitignore
src/bin/cargo-compile.rs
src/cargo/core/dependency.rs
src/cargo/core/manifest.rs
src/cargo/core/mod.rs
src/cargo/core/namever.rs
src/cargo/core/package.rs
src/cargo/core/summary.rs
src/cargo/ops/cargo_compile.rs
src/cargo/ops/cargo_rustc.rs

index d913617bcdd124aeeb9f302c2aa7b1627251ae10..cd8e4b1f6f9ff40692b1a6b7c290a757767c0fa9 100644 (file)
@@ -1,2 +1,2 @@
 target
-
+.cargo
index 0c2a5d613a83fa16e07484223db7fc60fddc35a2..07d4ccc19ae9a1e1cb0974aaa25181cac270aa1b 100644 (file)
@@ -23,8 +23,8 @@ fn flags<T: FlagConfig + Decodable<FlagDecoder, HammerError>>() -> CLIResult<T>
 }
 
 fn execute() -> CLIResult<()> {
-    compile(try!(flags::<Options>()).manifest_path.as_slice()).to_result(|_|
-        CLIError::new("Compilation failed", None, 1))
+    compile(try!(flags::<Options>()).manifest_path.as_slice()).to_result(|err|
+        CLIError::new(format!("Compilation failed: {}", err), None, 1))
 }
 
 fn main() {
index 0536acdd65baa285358d9502bc768b724c8e5d54..3e4b7c75c233e46596664079d4478cd6894c4d54 100644 (file)
@@ -1,24 +1,24 @@
-use core;
+use core::NameVer;
 
 #[deriving(Eq,Clone,Show,Encodable,Decodable)]
 pub struct Dependency {
-    name: core::NameVer
+    name: NameVer
 }
 
 impl Dependency {
     pub fn new(name: &str) -> Dependency {
-        Dependency { name: core::NameVer::new(name.to_owned(), "1.0.0") }
+        Dependency { name: NameVer::new(name.to_owned(), "1.0.0") }
     }
 
-    pub fn with_namever(name: &core::NameVer) -> Dependency {
+    pub fn with_namever(name: &NameVer) -> Dependency {
         Dependency { name: name.clone() }
     }
 
     pub fn with_name_and_version(name: &str, version: &str) -> Dependency {
-        Dependency { name: core::NameVer::new(name, version) }
+        Dependency { name: NameVer::new(name, version) }
     }
 
-    pub fn get_namever<'a>(&'a self) -> &'a core::NameVer {
+    pub fn get_namever<'a>(&'a self) -> &'a NameVer {
         &self.name
     }
 
@@ -26,3 +26,13 @@ impl Dependency {
         self.name.get_name()
     }
 }
+
+pub trait DependencyNameVers {
+    fn namevers(&self) -> Vec<NameVer>;
+}
+
+impl DependencyNameVers for Vec<Dependency> {
+    fn namevers(&self) -> Vec<NameVer> {
+        self.iter().map(|dep| dep.get_namever().clone()).collect()
+    }
+}
index 6070d24d839b6f03482682719ca1f45712ee10f8..9b86b170039a3acc8c60bed8aae2f0b55c73e4e1 100644 (file)
@@ -1,4 +1,6 @@
 use collections::HashMap;
+use std::fmt;
+use std::fmt::{Show,Formatter};
 use core::{
     Dependency,
     NameVer,
@@ -16,7 +18,13 @@ pub struct Manifest {
     target_dir: Path,
 }
 
-#[deriving(Clone,Eq)]
+impl Show for Manifest {
+    fn fmt(&self, f: &mut Formatter) -> fmt::Result {
+        write!(f.buf, "Manifest({}, authors={}, targets={}, target_dir={})", self.summary, self.authors, self.targets, self.target_dir.display())
+    }
+}
+
+#[deriving(Show,Clone,Eq)]
 pub enum TargetKind {
     LibTarget,
     BinTarget
@@ -29,6 +37,12 @@ pub struct Target {
     path: Path
 }
 
+impl Show for Target {
+    fn fmt(&self, f: &mut Formatter) -> fmt::Result {
+        write!(f.buf, "{}(name={}, path={})", self.kind, self.name, self.path.display())
+    }
+}
+
 impl Manifest {
     pub fn new(summary: &Summary, targets: &[Target], target_dir: &Path) -> Manifest {
         Manifest {
index 88a403c65faabb817f7760d8319288e36480c121..57179048651c3a8c8218d096eccd8dfe5e4cc49c 100644 (file)
@@ -34,5 +34,5 @@ pub mod package;
 pub mod dependency;
 pub mod manifest;
 pub mod resolver;
-mod summary;
+pub mod summary;
 mod registry;
index 48998627f3c342d78a304d7bc382410e1630e7c2..7f1b13f6978b0ad0c3f28f5b288b88657d24c96c 100644 (file)
@@ -1,4 +1,6 @@
 use semver;
+use std::fmt;
+use std::fmt::{Show,Formatter};
 use serialize::{
     Encodable,
     Encoder,
@@ -6,7 +8,7 @@ use serialize::{
     Decoder
 };
 
-#[deriving(Clone,Eq,Show,Ord)]
+#[deriving(Clone,Eq,Ord)]
 pub struct NameVer {
     name: ~str,
     version: semver::Version
@@ -26,6 +28,12 @@ impl NameVer {
     }
 }
 
+impl Show for NameVer {
+    fn fmt(&self, f: &mut Formatter) -> fmt::Result {
+        write!(f.buf, "{} v{}", self.name, self.version)
+    }
+}
+
 impl<E, D: Decoder<E>> Decodable<D,E> for NameVer {
     fn decode(d: &mut D) -> Result<NameVer, E> {
         let vector: Vec<~str> = try!(Decodable::decode(d));
index 700a366351e82c92aa076d579fc4efc826e4f832..efd732ae654ad5a761fd5ae6b8e655089fa16cd9 100644 (file)
@@ -1,4 +1,6 @@
 use std::slice;
+use std::fmt;
+use std::fmt::{Show,Formatter};
 use std::path::Path;
 use core::{
     Dependency,
@@ -25,6 +27,10 @@ impl Package {
         }
     }
 
+    pub fn to_dependency(&self) -> Dependency {
+        Dependency::with_namever(self.manifest.get_summary().get_name_ver())
+    }
+
     pub fn get_manifest<'a>(&'a self) -> &'a Manifest {
         &self.manifest
     }
@@ -58,6 +64,12 @@ impl Package {
     }
 }
 
+impl Show for Package {
+    fn fmt(&self, f: &mut Formatter) -> fmt::Result {
+        write!(f.buf, "{}", self.get_summary().get_name_ver())
+    }
+}
+
 pub struct PackageSet {
     packages: ~[Package]
 }
index efd35e7383d0b7d9db3e73fb8854ded4c7714bd5..7f584f45ae37c44b5af581de53a5507d6e22acdf 100644 (file)
@@ -29,3 +29,18 @@ impl Summary {
         self.dependencies.as_slice()
     }
 }
+
+pub trait SummaryVec {
+    fn names(&self) -> Vec<~str>;
+    fn deps(&self) -> Vec<Dependency>;
+}
+
+impl SummaryVec for Vec<Summary> {
+    fn names(&self) -> Vec<~str> {
+        self.iter().map(|summary| summary.name_ver.get_name().to_owned()).collect()
+    }
+
+    fn deps(&self) -> Vec<Dependency> {
+        self.iter().map(|summary| Dependency::with_namever(summary.get_name_ver())).collect()
+    }
+}
index f6196e297cda2fbd9673792101569f5c63c0163b..a003e3075a43678b2522db9df258b5b9ac5947f3 100644 (file)
  *    b. Compile each dependency in order, passing in the -L's pointing at each previously compiled dependency
  */
 
-use std::vec::Vec;
 use std::os;
 use util::config;
 use util::config::{all_configs,ConfigValue};
-use core::{PackageSet,Source,Dependency,NameVer};
+use core::{PackageSet,Source};
 use core::resolver::resolve;
 use sources::path::PathSource;
 use ops::cargo_rustc;
+use ops::cargo_read_manifest::read_manifest;
 use core::errors::{CargoError,CLIError,CLIResult,ToResult};
+use core::summary::SummaryVec;
 
 pub fn compile(manifest_path: &str) -> CLIResult<()> {
-    // TODO: Fix
+    let root_dep = try!(read_manifest(manifest_path)).to_dependency();
+
     let configs = try!(all_configs(os::getcwd()).to_result(|err: CargoError|
         CLIError::new("Could not load configurations", Some(err.to_str()), 1)));
 
@@ -37,25 +39,21 @@ pub fn compile(manifest_path: &str) -> CLIResult<()> {
     };
 
     let source = PathSource::new(paths);
-    let summaries = try!(source.list().to_result(|err| CLIError::new(format!("Unable to list packages from {}", source), Some(err.to_str()), 1)));
-    let names: Vec<NameVer> = summaries.iter().map(|s| s.get_name_ver().clone()).collect();
-
-    // This does not need to happen
-    // try!(source.download(names.as_slice()).to_result(|err| CLIError::new(format!("Unable to download packages from {}", source), Some(err.to_str()), 1)));
+    let summaries = try!(source.list().to_result(|err|
+        CLIError::new(format!("Unable to list packages from {}", source), Some(err.to_str()), 1)));
 
-    let deps: Vec<Dependency> = summaries.iter().map(|summary| {
-        Dependency::with_namever(summary.get_name_ver())
-    }).collect();
+    let resolved = try!(resolve([root_dep], &summaries).to_result(|err: CargoError|
+        CLIError::new("Unable to resolve dependencies", Some(err.to_str()), 1)));
 
-    let packages = try!(source.get(names.as_slice()).to_result(|err|
-        CLIError::new(format!("Unable to get packages from {} for {}", source, names), Some(err.to_str()), 1)));
+    try!(source.download(resolved.as_slice()).to_result(|err|
+        CLIError::new(format!("Unable to download packages from {}", source), Some(err.to_str()), 1)));
 
-    let registry = PackageSet::new(packages.as_slice());
+    let packages = try!(source.get(resolved.as_slice()).to_result(|err|
+        CLIError::new(format!("Unable to get packages from {} for {}", source, summaries.names()), Some(err.to_str()), 1)));
 
-    let resolved = try!(resolve(deps.as_slice(), &registry).to_result(|err: CargoError|
-        CLIError::new("Unable to resolve dependencies", Some(err.to_str()), 1)));
+    let package_set = PackageSet::new(packages.as_slice());
 
-    try!(cargo_rustc::compile(&registry));
+    try!(cargo_rustc::compile(&package_set));
 
     Ok(())
 }
index 0d2af16ef8863d6871d190bb0de22800efb35410..7f34908364c27d9fdbc04c871424c315fb5f6f70 100644 (file)
@@ -14,6 +14,7 @@ pub fn compile(pkgs: &core::PackageSet) -> CLIResult<()> {
     };
 
     for pkg in sorted.iter() {
+        println!("Compiling {}", pkg);
         try!(compile_pkg(pkg, pkgs));
     }
 
@@ -52,7 +53,7 @@ fn rustc(root: &Path, target: &core::Target, dest: &Path, deps: &[core::Package]
         .args(args.as_slice())
         .exec()
         .to_result(|err|
-            CLIError::new(format!("Couldn't execute rustc {}", args.connect(" ")), Some(err.to_str()), 1)));
+            CLIError::new(format!("Couldn't execute `rustc {}` in `{}`", args.connect(" "), root.display()), Some(err.to_str()), 1)));
 
     Ok(())
 }