Initial pass at namespacing packages
authorYehuda Katz + Carl Lerche <engineering@tilde.io>
Wed, 11 Jun 2014 00:30:18 +0000 (17:30 -0700)
committerTim Carey-Smith <tim@spork.in>
Wed, 11 Jun 2014 00:30:18 +0000 (17:30 -0700)
src/cargo/core/manifest.rs
src/cargo/core/mod.rs
src/cargo/core/package_id.rs
src/cargo/core/resolver.rs
src/cargo/util/toml.rs

index 37882559a9afde5ebdcea14d79c0cbd5ede439b2..8650a8d1facca865184f73537f42520bbb305a0e 100644 (file)
@@ -1,8 +1,7 @@
 use std::fmt;
 use std::fmt::{Show,Formatter};
-use semver;
 use semver::Version;
-use serialize::{Encoder,Decoder,Encodable};
+use serialize::{Encoder,Encodable};
 use core::{
     Dependency,
     PackageId,
@@ -173,20 +172,3 @@ impl Target {
         }
     }
 }
-
-/* TODO:
- * - Figure out if this is needed and/or if it should be moved somewhere else
- */
-#[deriving(Decodable,Encodable,PartialEq,Clone,Show)]
-pub struct Project {
-    pub name: String,
-    pub version: String,
-    pub authors: Vec<String>
-}
-
-impl Project {
-    pub fn to_package_id(&self) -> PackageId {
-        PackageId::new(self.name.as_slice(), semver::parse(self.version.as_slice()).unwrap())
-    }
-}
-
index 571b729e4fbef29b848fe77ed8cd9bf7856a0b13..6fe7ff9c9f86d3de0380ab9928b9c19f7bb73136 100644 (file)
@@ -6,7 +6,6 @@ pub use self::manifest::{
     Manifest,
     Target,
     TargetKind,
-    Project
 };
 
 pub use self::package::{
index 8a0c1edf2f4e489c86b02f462c9e1731ced3995b..ba5594f7a0ae2cd2c536b4122ed53ca94c446436 100644 (file)
@@ -1,4 +1,6 @@
 use semver;
+use url;
+use url::Url;
 use std::fmt;
 use std::fmt::{Show,Formatter};
 use serialize::{
@@ -24,17 +26,35 @@ impl<'a> ToVersion for &'a str {
     }
 }
 
-#[deriving(Clone,PartialEq,PartialOrd)]
+trait ToUrl {
+    fn to_url(self) -> Option<Url>;
+}
+
+impl<'a> ToUrl for &'a str {
+    fn to_url(self) -> Option<Url> {
+        url::from_str(self).ok()
+    }
+}
+
+impl ToUrl for Url {
+    fn to_url(self) -> Option<Url> {
+        Some(self)
+    }
+}
+
+#[deriving(Clone,PartialEq)]
 pub struct PackageId {
     name: String,
-    version: semver::Version
+    version: semver::Version,
+    namespace: Url
 }
 
 impl PackageId {
-    pub fn new<T: ToVersion>(name: &str, version: T) -> PackageId {
+    pub fn new<T: ToVersion, U: ToUrl>(name: &str, version: T, namespace: U) -> PackageId {
         PackageId {
             name: name.to_str(),
-            version: version.to_version().unwrap()
+            version: version.to_version().unwrap(),
+            namespace: namespace.to_url().unwrap()
         }
     }
 
@@ -45,11 +65,23 @@ impl PackageId {
     pub fn get_version<'a>(&'a self) -> &'a semver::Version {
         &self.version
     }
+
+    pub fn get_namespace<'a>(&'a self) -> &'a Url {
+        &self.namespace
+    }
 }
 
+static central_repo: &'static str = "http://rust-lang.org/central-repo";
+
 impl Show for PackageId {
     fn fmt(&self, f: &mut Formatter) -> fmt::Result {
-        write!(f, "{} v{}", self.name, self.version)
+        try!(write!(f, "{} v{}", self.name, self.version));
+
+        if self.namespace.to_str().as_slice() != central_repo {
+            try!(write!(f, " ({})", self.namespace));
+        }
+
+        Ok(())
     }
 }
 
@@ -59,12 +91,13 @@ impl<E, D: Decoder<E>> Decodable<D,E> for PackageId {
 
         Ok(PackageId::new(
             vector.get(0).as_slice(),
-            semver::parse(vector.get(1).as_slice()).unwrap()))
+            vector.get(1).as_slice(),
+            vector.get(2).as_slice()))
     }
 }
 
 impl<E, S: Encoder<E>> Encodable<S,E> for PackageId {
     fn encode(&self, e: &mut S) -> Result<(), E> {
-        (vec!(self.name.clone(), self.version.to_str())).encode(e)
+        (vec!(self.name.clone(), self.version.to_str()), self.namespace.to_str()).encode(e)
     }
 }
index 84d11d74c2b74ed84237e59f7f63518d7d8e5eee..724968b716dc81e0b8f829fb3f99fa33fb5a7f6f 100644 (file)
@@ -62,17 +62,17 @@ mod test {
         ($name:expr => $($deps:expr),+) => (
             {
             let d: Vec<Dependency> = vec!($($deps),+).iter().map(|s| Dependency::parse(*s, "1.0.0").unwrap()).collect();
-            Summary::new(&PackageId::new($name, "1.0.0"), d.as_slice())
+            Summary::new(&PackageId::new($name, "1.0.0", "http://www.example.com/"), d.as_slice())
             }
         );
 
         ($name:expr) => (
-            Summary::new(&PackageId::new($name, "1.0.0"), [])
+            Summary::new(&PackageId::new($name, "1.0.0", "http://www.example.com/"), [])
         )
     )
 
     fn pkg(name: &str) -> Summary {
-        Summary::new(&PackageId::new(name, "1.0.0"), &[])
+        Summary::new(&PackageId::new(name, "1.0.0", "http://www.example.com/"), &[])
     }
 
     fn dep(name: &str) -> Dependency {
@@ -85,7 +85,7 @@ mod test {
 
     fn names(names: &[&'static str]) -> Vec<PackageId> {
         names.iter()
-            .map(|name| PackageId::new(*name, "1.0.0"))
+            .map(|name| PackageId::new(*name, "1.0.0", "http://www.example.com/"))
             .collect()
     }
 
index 7ed35501bd17ba976a6be7a18c30cf01667efb49..24aab126905f7d37626ed03972bb12a6d636e3fa 100644 (file)
@@ -2,7 +2,7 @@ use toml;
 use std::collections::HashMap;
 use serialize::Decodable;
 
-use core::{Summary,Manifest,Target,Project,Dependency};
+use core::{Summary,Manifest,Target,Dependency,PackageId};
 use util::{CargoResult,Require,simple_human,toml_error};
 
 pub fn to_manifest(contents: &[u8]) -> CargoResult<Manifest> {
@@ -90,12 +90,25 @@ pub struct DetailedTomlDependency {
 
 #[deriving(Encodable,PartialEq,Clone)]
 pub struct TomlManifest {
-    project: Box<Project>,
+    project: Box<TomlProject>,
     lib: Option<Vec<TomlLibTarget>>,
     bin: Option<Vec<TomlBinTarget>>,
     dependencies: Option<HashMap<String, TomlDependency>>,
 }
 
+#[deriving(Decodable,Encodable,PartialEq,Clone,Show)]
+pub struct TomlProject {
+    pub name: String,
+    pub version: String,
+    pub authors: Vec<String>
+}
+
+impl TomlProject {
+    pub fn to_package_id(&self, namespace: &str) -> PackageId {
+        PackageId::new(self.name.as_slice(), self.version.as_slice(), namespace)
+    }
+}
+
 impl TomlManifest {
     pub fn to_manifest(&self) -> CargoResult<Manifest> {
 
@@ -124,7 +137,7 @@ impl TomlManifest {
         }
 
         Ok(Manifest::new(
-                &Summary::new(&self.project.to_package_id(), deps.as_slice()),
+                &Summary::new(&self.project.to_package_id("http://rust-lang.org/central-repo"), deps.as_slice()),
                 targets.as_slice(),
                 &Path::new("target")))
     }