Add support for other registries in dependencies.
authorChris Swindle <christopher.swindle@metaswitch.com>
Sun, 22 Oct 2017 06:46:50 +0000 (07:46 +0100)
committerChris Swindle <christopher.swindle@metaswitch.com>
Sun, 22 Oct 2017 06:46:50 +0000 (07:46 +0100)
src/cargo/core/dependency.rs [changed mode: 0644->0755]
src/cargo/core/resolver/mod.rs [changed mode: 0644->0755]
src/cargo/sources/registry/mod.rs [changed mode: 0644->0755]
tests/alt-registry.rs
tests/cargotest/support/registry.rs [changed mode: 0644->0755]

old mode 100644 (file)
new mode 100755 (executable)
old mode 100644 (file)
new mode 100755 (executable)
old mode 100644 (file)
new mode 100755 (executable)
index 8b907f7..4a49ee1
@@ -175,6 +175,7 @@ use sources::PathSource;
 use util::{CargoResult, Config, internal, FileLock, Filesystem};
 use util::errors::CargoResultExt;
 use util::hex;
+use util::to_url::ToUrl;
 
 const INDEX_LOCK: &'static str = ".cargo-index-lock";
 pub static CRATES_IO: &'static str = "https://github.com/rust-lang/crates.io-index";
@@ -224,6 +225,7 @@ struct RegistryDependency<'a> {
     default_features: bool,
     target: Option<Cow<'a, str>>,
     kind: Option<Cow<'a, str>>,
+    index: Option<String>,
 }
 
 pub trait RegistryData {
@@ -483,12 +485,18 @@ impl<'de> de::Deserialize<'de> for DependencyList {
 fn parse_registry_dependency(dep: RegistryDependency)
                              -> CargoResult<Dependency> {
     let RegistryDependency {
-        name, req, features, optional, default_features, target, kind
+        name, req, features, optional, default_features, target, kind, index
     } = dep;
 
-    let mut dep = DEFAULT_ID.with(|id| {
-        Dependency::parse_no_deprecated(&name, Some(&req), id)
-    })?;
+    let id = if let Some(index) = index {
+        SourceId::for_registry(&index.to_url()?)?
+    } else {
+        DEFAULT_ID.with(|id| {
+            id.clone()
+        })
+    };
+
+    let mut dep = Dependency::parse_no_deprecated(&name, Some(&req), &id)?;
     let kind = match kind.as_ref().map(|s| &s[..]).unwrap_or("") {
         "dev" => Kind::Development,
         "build" => Kind::Build,
@@ -512,5 +520,6 @@ fn parse_registry_dependency(dep: RegistryDependency)
        .set_features(features)
        .set_platform(platform)
        .set_kind(kind);
+
     Ok(dep)
 }
index fed6ae0c793781319f601353c05814a148aa8836..fdd5354561b9872964daf49a680190ef65a59d0d 100755 (executable)
@@ -208,7 +208,8 @@ fn alt_registry_dep_with_crates_io_dep() {
         .file("src/main.rs", "fn main() {}");
     p.build();
 
-    Package::new("alt_reg_dep", "0.1.1").alternative(true).dep("crates_io_dep", "0.0.2").publish();
+    Package::new("crates_io_dep", "0.0.2").publish();
+    Package::new("alt_reg_dep", "0.1.1").alternative(true).registry_dep("crates_io_dep", "0.0.2", registry::registry().as_str()).publish();
 
     assert_that(p.cargo("build").masquerade_as_nightly_cargo(),
                 execs().with_status(0).with_stderr(&format!("\
@@ -216,8 +217,8 @@ fn alt_registry_dep_with_crates_io_dep() {
 [UPDATING] registry `{crates_io_reg}`
 [DOWNLOADING] alt_reg_dep v0.1.1 (registry `file://[..]`)
 [DOWNLOADING] crates_io_dep v0.0.2 (registry `file://[..]`)
+[COMPILING] crates_io_dep v0.0.2 (registry `file://[..]`)
 [COMPILING] alt_reg_dep v0.1.1 (registry `file://[..]`)
-[COMPILING] crates_io_dep v0.0.2
 [COMPILING] foo v0.0.1 ({dir})
 [FINISHED] dev [unoptimized + debuginfo] target(s) in [..] secs
 ",
old mode 100644 (file)
new mode 100755 (executable)
index 1e0b28c..b303d4d
@@ -39,6 +39,7 @@ struct Dependency {
     kind: String,
     target: Option<String>,
     features: Vec<String>,
+    index: Option<String>,
 }
 
 pub fn init() {
@@ -116,25 +117,32 @@ impl Package {
     }
 
     pub fn dep(&mut self, name: &str, vers: &str) -> &mut Package {
-        self.full_dep(name, vers, None, "normal", &[])
+        self.full_dep(name, vers, None, "normal", &[], None)
     }
 
     pub fn feature_dep(&mut self,
                        name: &str,
                        vers: &str,
                        features: &[&str]) -> &mut Package {
-        self.full_dep(name, vers, None, "normal", features)
+        self.full_dep(name, vers, None, "normal", features, None)
     }
 
     pub fn target_dep(&mut self,
                       name: &str,
                       vers: &str,
                       target: &str) -> &mut Package {
-        self.full_dep(name, vers, Some(target), "normal", &[])
+        self.full_dep(name, vers, Some(target), "normal", &[], None)
+    }
+
+    pub fn registry_dep(&mut self,
+                        name: &str,
+                        vers: &str,
+                        index: &str) -> &mut Package {
+        self.full_dep(name, vers, None, "normal", &[], Some(index))
     }
 
     pub fn dev_dep(&mut self, name: &str, vers: &str) -> &mut Package {
-        self.full_dep(name, vers, None, "dev", &[])
+        self.full_dep(name, vers, None, "dev", &[], None)
     }
 
     fn full_dep(&mut self,
@@ -142,13 +150,15 @@ impl Package {
                 vers: &str,
                 target: Option<&str>,
                 kind: &str,
-                features: &[&str]) -> &mut Package {
+                features: &[&str],
+                index: Option<&str>) -> &mut Package {
         self.deps.push(Dependency {
             name: name.to_string(),
             vers: vers.to_string(),
             kind: kind.to_string(),
             target: target.map(|s| s.to_string()),
             features: features.iter().map(|s| s.to_string()).collect(),
+            index: index.map(|s| s.to_string()),
         });
         self
     }
@@ -171,6 +181,7 @@ impl Package {
                 "target": dep.target,
                 "optional": false,
                 "kind": dep.kind,
+                "index": dep.index,
             })
         }).collect::<Vec<_>>();
         let cksum = {