]> git.proxmox.com Git - cargo.git/commitdiff
Add source_id method to the Source
authorAleksey Kladov <aleksey.kladov@gmail.com>
Sat, 17 Dec 2016 09:07:37 +0000 (12:07 +0300)
committerAleksey Kladov <aleksey.kladov@gmail.com>
Sat, 17 Dec 2016 09:07:37 +0000 (12:07 +0300)
src/cargo/core/registry.rs
src/cargo/core/source.rs
src/cargo/ops/resolve.rs
src/cargo/sources/directory.rs
src/cargo/sources/git/source.rs
src/cargo/sources/path.rs
src/cargo/sources/registry/mod.rs
src/cargo/sources/replaced.rs

index ec458f8fb9c37a177aead8d7e95e4503cbca1b6c..ff4a6219df748269fc5a9f9416b2ff8d8555f611 100644 (file)
@@ -149,19 +149,20 @@ impl<'cfg> PackageRegistry<'cfg> {
         Ok(())
     }
 
-    pub fn add_preloaded(&mut self, id: &SourceId, source: Box<Source + 'cfg>) {
-        self.add_source(id, source, Kind::Locked);
+    pub fn add_preloaded(&mut self, source: Box<Source + 'cfg>) {
+        self.add_source(source, Kind::Locked);
     }
 
-    fn add_source(&mut self, id: &SourceId, source: Box<Source + 'cfg>,
+    fn add_source(&mut self, source: Box<Source + 'cfg>,
                   kind: Kind) {
-        self.sources.insert(id, source);
-        self.source_ids.insert(id.clone(), (id.clone(), kind));
+        let id = source.source_id().clone();
+        self.sources.insert(source);
+        self.source_ids.insert(id.clone(), (id, kind));
     }
 
-    pub fn add_override(&mut self, id: &SourceId, source: Box<Source + 'cfg>) {
-        self.add_source(id, source, Kind::Override);
-        self.overrides.push(id.clone());
+    pub fn add_override(&mut self, source: Box<Source + 'cfg>) {
+        self.overrides.push(source.source_id().clone());
+        self.add_source(source, Kind::Override);
     }
 
     pub fn register_lock(&mut self, id: PackageId, deps: Vec<PackageId>) {
@@ -179,11 +180,12 @@ impl<'cfg> PackageRegistry<'cfg> {
     fn load(&mut self, source_id: &SourceId, kind: Kind) -> CargoResult<()> {
         (|| {
             let source = self.source_config.load(source_id)?;
+            assert_eq!(source.source_id(), source_id);
 
             if kind == Kind::Override {
                 self.overrides.push(source_id.clone());
             }
-            self.add_source(source_id, source, kind);
+            self.add_source(source, kind);
 
             // Ensure the source has fetched all necessary remote data.
             let _p = profile::start(format!("updating: {}", source_id));
index 91d2acff789d8715f0b03a8be86e7f7df8a91194..dc334535f73dd6b065f29ce8f4562278817018fd 100644 (file)
@@ -20,6 +20,8 @@ use util::{human, Config, CargoResult, ToUrl};
 /// A Source finds and downloads remote packages based on names and
 /// versions.
 pub trait Source: Registry {
+    fn source_id(&self) -> &SourceId;
+
     /// The update method performs any network operations required to
     /// get the entire list of all names, versions and dependencies of
     /// packages managed by the Source.
@@ -53,6 +55,10 @@ pub trait Source: Registry {
 }
 
 impl<'a, T: Source + ?Sized + 'a> Source for Box<T> {
+    fn source_id(&self) -> &SourceId {
+        (**self).source_id()
+    }
+
     fn update(&mut self) -> CargoResult<()> {
         (**self).update()
     }
@@ -505,8 +511,9 @@ impl<'src> SourceMap<'src> {
         self.get(pkg_id.source_id())
     }
 
-    pub fn insert(&mut self, id: &SourceId, source: Box<Source + 'src>) {
-        self.map.insert(id.clone(), source);
+    pub fn insert(&mut self, source: Box<Source + 'src>) {
+        let id = source.source_id().clone();
+        self.map.insert(id, source);
     }
 
     pub fn is_empty(&self) -> bool {
index b1f33a2d26e96cea01765f41f489650cc796ba6e..76e5e2a0e3e8219bb0ae3a7327817a28544890dc 100644 (file)
@@ -34,13 +34,11 @@ pub fn resolve_ws_precisely<'a>(ws: &Workspace<'a>,
 
     let mut registry = PackageRegistry::new(ws.config())?;
 
-    let mut write_lockfile = true;
+    // Avoid writing a lockfile if we are `cargo install`ing a non local package.
+    let write_lockfile = source.is_none() || ws.current_opt().is_none();
+
     if let Some(source) = source {
-        if let Some(root_package) = ws.current_opt() {
-            // Avoid writing a lockfile if we are `cargo install`ing a non local package.
-            write_lockfile = false;
-            registry.add_preloaded(root_package.package_id().source_id(), source);
-        }
+        registry.add_preloaded(source);
     }
 
     // First, resolve the root_package's *listed* dependencies, as well as
@@ -265,7 +263,7 @@ fn add_overrides<'a>(registry: &mut PackageRegistry<'a>,
                            (defined in `{}`)", path.display(),
                           definition.display()))
         })?;
-        registry.add_override(&id, Box::new(source));
+        registry.add_override(Box::new(source));
     }
     Ok(())
 }
index fc7abf56c734d4f033ff457d4755afc24e0066c7..96d06a8be462aaacf1d85ac8453004491f1d7d9c 100644 (file)
@@ -13,7 +13,7 @@ use util::{CargoResult, human, ChainError, Config, Sha256};
 use util::paths;
 
 pub struct DirectorySource<'cfg> {
-    id: SourceId,
+    source_id: SourceId,
     root: PathBuf,
     packages: HashMap<PackageId, (Package, Checksum)>,
     config: &'cfg Config,
@@ -29,7 +29,7 @@ impl<'cfg> DirectorySource<'cfg> {
     pub fn new(path: &Path, id: &SourceId, config: &'cfg Config)
                -> DirectorySource<'cfg> {
         DirectorySource {
-            id: id.clone(),
+            source_id: id.clone(),
             root: path.to_path_buf(),
             config: config,
             packages: HashMap::new(),
@@ -57,6 +57,10 @@ impl<'cfg> Registry for DirectorySource<'cfg> {
 }
 
 impl<'cfg> Source for DirectorySource<'cfg> {
+    fn source_id(&self) -> &SourceId {
+        &self.source_id
+    }
+
     fn update(&mut self) -> CargoResult<()> {
         self.packages.clear();
         let entries = self.root.read_dir().chain_error(|| {
@@ -67,9 +71,7 @@ impl<'cfg> Source for DirectorySource<'cfg> {
         for entry in entries {
             let entry = entry?;
             let path = entry.path();
-            let mut src = PathSource::new(&path,
-                                          &self.id,
-                                          self.config);
+            let mut src = PathSource::new(&path, &self.source_id, self.config);
             src.update()?;
             let pkg = src.root_package()?;
 
index 0587d185f01421a705dd947c3f730d5e6b347ba8..eb0725ce9c7b15289cfbdcd1f9f6e16e3bcacbfa 100644 (file)
@@ -122,6 +122,10 @@ impl<'cfg> Registry for GitSource<'cfg> {
 }
 
 impl<'cfg> Source for GitSource<'cfg> {
+    fn source_id(&self) -> &SourceId {
+        &self.source_id
+    }
+
     fn update(&mut self) -> CargoResult<()> {
         let lock = self.config.git_path()
             .open_rw(".cargo-lock-git", self.config, "the git checkouts")?;
index 18e6e35da8a4db9de8296222259eab6720c3fe17..035474b8a20dc948e8f88514452697eccae88810 100644 (file)
@@ -12,7 +12,7 @@ use util::{self, CargoResult, internal, internal_error, human, ChainError};
 use util::Config;
 
 pub struct PathSource<'cfg> {
-    id: SourceId,
+    source_id: SourceId,
     path: PathBuf,
     updated: bool,
     packages: Vec<Package>,
@@ -28,7 +28,7 @@ impl<'cfg> PathSource<'cfg> {
     pub fn new(path: &Path, id: &SourceId, config: &'cfg Config)
                -> PathSource<'cfg> {
         PathSource {
-            id: id.clone(),
+            source_id: id.clone(),
             path: path.to_path_buf(),
             updated: false,
             packages: Vec::new(),
@@ -68,11 +68,10 @@ impl<'cfg> PathSource<'cfg> {
         if self.updated {
             Ok(self.packages.clone())
         } else if self.recursive {
-            ops::read_packages(&self.path, &self.id, self.config)
+            ops::read_packages(&self.path, &self.source_id, self.config)
         } else {
             let path = self.path.join("Cargo.toml");
-            let (pkg, _) = ops::read_package(&path, &self.id,
-                                                  self.config)?;
+            let (pkg, _) = ops::read_package(&path, &self.source_id, self.config)?;
             Ok(vec![pkg])
         }
     }
@@ -324,6 +323,10 @@ impl<'cfg> Registry for PathSource<'cfg> {
 }
 
 impl<'cfg> Source for PathSource<'cfg> {
+    fn source_id(&self) -> &SourceId {
+        &self.source_id
+    }
+
     fn update(&mut self) -> CargoResult<()> {
         if !self.updated {
             let packages = self.read_packages()?;
index dd5056be9802715b97e172d927d5c21c23661dee..0f188a008708be05432084f53a22a20ffda852ad 100644 (file)
@@ -337,6 +337,10 @@ impl<'cfg> Registry for RegistrySource<'cfg> {
 }
 
 impl<'cfg> Source for RegistrySource<'cfg> {
+    fn source_id(&self) -> &SourceId {
+        &self.source_id
+    }
+
     fn update(&mut self) -> CargoResult<()> {
         // If we have an imprecise version then we don't know what we're going
         // to look for, so we always attempt to perform an update here.
index e164a1c7cf93179ebcaeb10e4ecc42f3e852edea..ddf2085eb5810ec1845a96e1cf1ed49ff71520a3 100644 (file)
@@ -33,6 +33,10 @@ impl<'cfg> Registry for ReplacedSource<'cfg> {
 }
 
 impl<'cfg> Source for ReplacedSource<'cfg> {
+    fn source_id(&self) -> &SourceId {
+        &self.to_replace
+    }
+
     fn update(&mut self) -> CargoResult<()> {
         self.inner.update().chain_error(|| {
             human(format!("failed to update replaced source `{}`",