From 53bd095f44aec666ca6f5f5a4cf2a53f26b27a64 Mon Sep 17 00:00:00 2001 From: Dale Wijnand Date: Thu, 3 May 2018 23:26:42 +0100 Subject: [PATCH] Duplicate query in Source, drop Registry parent type .. and move query definitions to the struct impls. --- src/cargo/core/source/mod.rs | 22 +++++++++++++--- src/cargo/sources/directory.rs | 20 +++++++++----- src/cargo/sources/git/source.rs | 16 ++++++++--- src/cargo/sources/path.rs | 20 +++++++++----- src/cargo/sources/registry/mod.rs | 44 ++++++++++++++++++------------- src/cargo/sources/replaced.rs | 12 +++++++-- 6 files changed, 94 insertions(+), 40 deletions(-) diff --git a/src/cargo/core/source/mod.rs b/src/cargo/core/source/mod.rs index 10418714b..1c6eed633 100644 --- a/src/cargo/core/source/mod.rs +++ b/src/cargo/core/source/mod.rs @@ -1,7 +1,7 @@ use std::collections::hash_map::{HashMap, IterMut, Values}; use std::fmt; -use core::{Package, PackageId, Registry}; +use core::{Dependency, Package, PackageId, Summary}; use util::CargoResult; mod source_id; @@ -10,18 +10,27 @@ pub use self::source_id::{GitReference, SourceId}; /// A Source finds and downloads remote packages based on names and /// versions. -pub trait Source: Registry { +pub trait Source { /// Returns the `SourceId` corresponding to this source fn source_id(&self) -> &SourceId; - /// Returns whether or not this registry will return summaries with + /// Returns whether or not this source will return summaries with /// checksums listed. fn supports_checksums(&self) -> bool; - /// Returns whether or not this registry will return summaries with + /// Returns whether or not this source will return summaries with /// the `precise` field in the source id listed. fn requires_precise(&self) -> bool; + /// Attempt to find the packages that match a dependency request. + fn query(&mut self, dep: &Dependency, f: &mut FnMut(Summary)) -> CargoResult<()>; + + fn query_vec(&mut self, dep: &Dependency) -> CargoResult> { + let mut ret = Vec::new(); + self.query(dep, &mut |s| ret.push(s))?; + Ok(ret) + } + /// 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. @@ -70,6 +79,11 @@ impl<'a, T: Source + ?Sized + 'a> Source for Box { (**self).requires_precise() } + /// Forwards to `Source::query` + fn query(&mut self, dep: &Dependency, f: &mut FnMut(Summary)) -> CargoResult<()> { + (**self).query(dep, f) + } + /// Forwards to `Source::update` fn update(&mut self) -> CargoResult<()> { (**self).update() diff --git a/src/cargo/sources/directory.rs b/src/cargo/sources/directory.rs index 21a167ac1..2156164cf 100644 --- a/src/cargo/sources/directory.rs +++ b/src/cargo/sources/directory.rs @@ -36,6 +36,15 @@ impl<'cfg> DirectorySource<'cfg> { packages: HashMap::new(), } } + + fn query(&mut self, dep: &Dependency, f: &mut FnMut(Summary)) -> CargoResult<()> { + let packages = self.packages.values().map(|p| &p.0); + let matches = packages.filter(|pkg| dep.matches(pkg.summary())); + for summary in matches.map(|pkg| pkg.summary().clone()) { + f(summary); + } + Ok(()) + } } impl<'cfg> Debug for DirectorySource<'cfg> { @@ -46,12 +55,7 @@ impl<'cfg> Debug for DirectorySource<'cfg> { impl<'cfg> Registry for DirectorySource<'cfg> { fn query(&mut self, dep: &Dependency, f: &mut FnMut(Summary)) -> CargoResult<()> { - let packages = self.packages.values().map(|p| &p.0); - let matches = packages.filter(|pkg| dep.matches(pkg.summary())); - for summary in matches.map(|pkg| pkg.summary().clone()) { - f(summary); - } - Ok(()) + self.query(dep, f) } } @@ -68,6 +72,10 @@ impl<'cfg> Source for DirectorySource<'cfg> { true } + fn query(&mut self, dep: &Dependency, f: &mut FnMut(Summary)) -> CargoResult<()> { + self.query(dep, f) + } + fn update(&mut self) -> CargoResult<()> { self.packages.clear(); let entries = self.root.read_dir().chain_err(|| { diff --git a/src/cargo/sources/git/source.rs b/src/cargo/sources/git/source.rs index 332f37aa2..34e7f2c7c 100644 --- a/src/cargo/sources/git/source.rs +++ b/src/cargo/sources/git/source.rs @@ -52,6 +52,13 @@ impl<'cfg> GitSource<'cfg> { self.remote.url() } + fn query(&mut self, dep: &Dependency, f: &mut FnMut(Summary)) -> CargoResult<()> { + let src = self.path_source + .as_mut() + .expect("BUG: update() must be called before query()"); + Source::query(src, dep, f) + } + pub fn read_packages(&mut self) -> CargoResult> { if self.path_source.is_none() { self.update()?; @@ -126,10 +133,7 @@ impl<'cfg> Debug for GitSource<'cfg> { impl<'cfg> Registry for GitSource<'cfg> { fn query(&mut self, dep: &Dependency, f: &mut FnMut(Summary)) -> CargoResult<()> { - let src = self.path_source - .as_mut() - .expect("BUG: update() must be called before query()"); - src.query(dep, f) + self.query(dep, f) } } @@ -146,6 +150,10 @@ impl<'cfg> Source for GitSource<'cfg> { true } + fn query(&mut self, dep: &Dependency, f: &mut FnMut(Summary)) -> CargoResult<()> { + self.query(dep, f) + } + fn update(&mut self) -> CargoResult<()> { let lock = self.config diff --git a/src/cargo/sources/path.rs b/src/cargo/sources/path.rs index e24e49968..c8b9ab095 100644 --- a/src/cargo/sources/path.rs +++ b/src/cargo/sources/path.rs @@ -62,6 +62,15 @@ impl<'cfg> PathSource<'cfg> { self.packages.push(pkg); } + fn query(&mut self, dep: &Dependency, f: &mut FnMut(Summary)) -> CargoResult<()> { + for s in self.packages.iter().map(|p| p.summary()) { + if dep.matches(s) { + f(s.clone()) + } + } + Ok(()) + } + pub fn root_package(&mut self) -> CargoResult { trace!("root_package; source={:?}", self); @@ -477,12 +486,7 @@ impl<'cfg> Debug for PathSource<'cfg> { impl<'cfg> Registry for PathSource<'cfg> { fn query(&mut self, dep: &Dependency, f: &mut FnMut(Summary)) -> CargoResult<()> { - for s in self.packages.iter().map(|p| p.summary()) { - if dep.matches(s) { - f(s.clone()) - } - } - Ok(()) + self.query(dep, f) } } @@ -499,6 +503,10 @@ impl<'cfg> Source for PathSource<'cfg> { false } + fn query(&mut self, dep: &Dependency, f: &mut FnMut(Summary)) -> CargoResult<()> { + self.query(dep, f) + } + fn update(&mut self) -> CargoResult<()> { if !self.updated { let packages = self.read_packages()?; diff --git a/src/cargo/sources/registry/mod.rs b/src/cargo/sources/registry/mod.rs index 19c270ab0..4f6ae6bc5 100644 --- a/src/cargo/sources/registry/mod.rs +++ b/src/cargo/sources/registry/mod.rs @@ -352,6 +352,27 @@ impl<'cfg> RegistrySource<'cfg> { } } + fn query(&mut self, dep: &Dependency, f: &mut FnMut(Summary)) -> CargoResult<()> { + // If this is a precise dependency, then it came from a lockfile and in + // theory the registry is known to contain this version. If, however, we + // come back with no summaries, then our registry may need to be + // updated, so we fall back to performing a lazy update. + if dep.source_id().precise().is_some() && !self.updated { + let mut called = false; + self.index.query(dep, &mut *self.ops, &mut |s| { + called = true; + f(s); + })?; + if called { + return Ok(()); + } else { + self.do_update()?; + } + } + + self.index.query(dep, &mut *self.ops, f) + } + /// Decode the configuration stored within the registry. /// /// This requires that the index has been at least checked out. @@ -422,24 +443,7 @@ impl<'cfg> RegistrySource<'cfg> { impl<'cfg> Registry for RegistrySource<'cfg> { fn query(&mut self, dep: &Dependency, f: &mut FnMut(Summary)) -> CargoResult<()> { - // If this is a precise dependency, then it came from a lockfile and in - // theory the registry is known to contain this version. If, however, we - // come back with no summaries, then our registry may need to be - // updated, so we fall back to performing a lazy update. - if dep.source_id().precise().is_some() && !self.updated { - let mut called = false; - self.index.query(dep, &mut *self.ops, &mut |s| { - called = true; - f(s); - })?; - if called { - return Ok(()); - } else { - self.do_update()?; - } - } - - self.index.query(dep, &mut *self.ops, f) + self.query(dep, f) } } @@ -456,6 +460,10 @@ impl<'cfg> Source for RegistrySource<'cfg> { false } + fn query(&mut self, dep: &Dependency, f: &mut FnMut(Summary)) -> CargoResult<()> { + self.query(dep, f) + } + 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. diff --git a/src/cargo/sources/replaced.rs b/src/cargo/sources/replaced.rs index 84bab7f54..53fa3eab7 100644 --- a/src/cargo/sources/replaced.rs +++ b/src/cargo/sources/replaced.rs @@ -19,9 +19,7 @@ impl<'cfg> ReplacedSource<'cfg> { inner: src, } } -} -impl<'cfg> Registry for ReplacedSource<'cfg> { fn query(&mut self, dep: &Dependency, f: &mut FnMut(Summary)) -> CargoResult<()> { let (replace_with, to_replace) = (&self.replace_with, &self.to_replace); let dep = dep.clone().map_source(to_replace, replace_with); @@ -36,6 +34,12 @@ impl<'cfg> Registry for ReplacedSource<'cfg> { } } +impl<'cfg> Registry for ReplacedSource<'cfg> { + fn query(&mut self, dep: &Dependency, f: &mut FnMut(Summary)) -> CargoResult<()> { + self.query(dep, f) + } +} + impl<'cfg> Source for ReplacedSource<'cfg> { fn source_id(&self) -> &SourceId { &self.to_replace @@ -49,6 +53,10 @@ impl<'cfg> Source for ReplacedSource<'cfg> { self.inner.requires_precise() } + fn query(&mut self, dep: &Dependency, f: &mut FnMut(Summary)) -> CargoResult<()> { + self.query(dep, f) + } + fn update(&mut self) -> CargoResult<()> { self.inner .update() -- 2.30.2