use serde::ser;
use core::{SourceId, Summary, PackageId};
+use core::interning::InternedString;
use util::{Cfg, CfgExpr, Config};
use util::errors::{CargoResult, CargoResultExt, CargoError};
/// The data underlying a Dependency.
#[derive(PartialEq, Eq, Hash, Ord, PartialOrd, Clone, Debug)]
struct Inner {
- name: String,
+ name: InternedString,
source_id: SourceId,
registry_id: Option<SourceId>,
req: VersionReq,
where S: ser::Serializer,
{
SerializedDependency {
- name: self.name(),
+ name: &*self.name(),
source: self.source_id(),
req: self.version_req().to_string(),
kind: self.kind(),
pub fn new_override(name: &str, source_id: &SourceId) -> Dependency {
Dependency {
inner: Rc::new(Inner {
- name: name.to_string(),
+ name: InternedString::new(name),
source_id: source_id.clone(),
registry_id: None,
req: VersionReq::any(),
&self.inner.req
}
- pub fn name(&self) -> &str {
- &self.inner.name
+ pub fn name(&self) -> InternedString {
+ self.inner.name
}
pub fn source_id(&self) -> &SourceId {
/// Returns true if the package (`sum`) can fulfill this dependency request.
pub fn matches_ignoring_source(&self, sum: &Summary) -> bool {
- self.name() == &*sum.package_id().name() &&
+ self.name() == sum.package_id().name() &&
self.version_req().matches(sum.package_id().version())
}
/// Returns true if the package (`id`) can fulfill this dependency request.
pub fn matches_id(&self, id: &PackageId) -> bool {
- self.inner.name == &*id.name() &&
+ self.inner.name == id.name() &&
(self.inner.only_match_name || (self.inner.req.matches(id.version()) &&
&self.inner.source_id == id.source_id()))
}
-> CargoResult<Option<Summary>> {
for s in self.overrides.iter() {
let src = self.sources.get_mut(s).unwrap();
- let dep = Dependency::new_override(dep.name(), s);
+ let dep = Dependency::new_override(&*dep.name(), s);
let mut results = src.query_vec(&dep)?;
if !results.is_empty() {
return Ok(Some(results.remove(0)))
// all known locked packages to see if they match this dependency.
// If anything does then we lock it to that and move on.
let v = locked.get(dep.source_id()).and_then(|map| {
- map.get(dep.name())
+ map.get(&*dep.name())
}).and_then(|vec| {
vec.iter().find(|&&(ref id, _)| dep.matches_id(id))
});
let v = patches.get(dep.source_id().url()).map(|vec| {
let dep2 = dep.clone();
let mut iter = vec.iter().filter(move |p| {
- dep2.name() == &*p.name() &&
+ dep2.name() == p.name() &&
dep2.version_req().matches(p.version())
});
(iter.next(), iter)
for &(p, r) in links_errors.iter() {
if let ConflictReason::Links(ref link) = *r {
msg.push_str("\n\nthe package `");
- msg.push_str(dep.name());
+ msg.push_str(&*dep.name());
msg.push_str("` links to the native library `");
msg.push_str(link);
msg.push_str("`, but it conflicts with a previous package which links to `");
msg.push_str("\n\nthe package `");
msg.push_str(&*p.name());
msg.push_str("` depends on `");
- msg.push_str(dep.name());
+ msg.push_str(&*dep.name());
msg.push_str("`, with features: `");
msg.push_str(features);
msg.push_str("` but `");
- msg.push_str(dep.name());
+ msg.push_str(&*dep.name());
msg.push_str("` does not have these features.\n");
}
// p == parent so the full path is redundant.
}
msg.push_str("\n\nfailed to select a version for `");
- msg.push_str(dep.name());
+ msg.push_str(&*dep.name());
msg.push_str("` which could resolve this conflict");
return format_err!("{}", msg)
reqs.require_feature(key)?;
}
for dep in s.dependencies().iter().filter(|d| d.is_optional()) {
- reqs.require_dependency(dep.name());
+ reqs.require_dependency(dep.name().to_inner());
}
}
Method::Required { features: requested_features, .. } => {
}
fn prev_active(&self, dep: &Dependency) -> &[Summary] {
- self.activations.get(&(InternedString::new(dep.name()), dep.source_id().clone()))
+ self.activations.get(&(dep.name(), dep.source_id().clone()))
.map(|v| &v[..])
.unwrap_or(&[])
}
// Next, collect all actually enabled dependencies and their features.
for dep in deps {
// Skip optional dependencies, but not those enabled through a feature
- if dep.is_optional() && !reqs.deps.contains_key(dep.name()) {
+ if dep.is_optional() && !reqs.deps.contains_key(&*dep.name()) {
continue
}
// So we want this dependency. Move the features we want from `feature_deps`
// to `ret`.
- let base = reqs.deps.remove(dep.name()).unwrap_or((false, vec![]));
+ let base = reqs.deps.remove(&*dep.name()).unwrap_or((false, vec![]));
if !dep.is_optional() && base.0 {
self.warnings.push(
format!("Package `{}` does not have feature `{}`. It has a required dependency \
features: BTreeMap<String, Vec<String>>,
links: Option<String>) -> CargoResult<Summary> {
for dep in dependencies.iter() {
- if features.get(dep.name()).is_some() {
+ if features.get(&*dep.name()).is_some() {
bail!("Features and dependencies cannot have the \
same name: `{}`", dep.name())
}
let dep = parts.next().unwrap();
let is_reexport = parts.next().is_some();
if !is_reexport && features.get(dep).is_some() { continue }
- match dependencies.iter().find(|d| d.name() == dep) {
+ match dependencies.iter().find(|d| &*d.name() == dep) {
Some(d) => {
if d.is_optional() || is_reexport { continue }
bail!("Feature `{}` depends on `{}` which is not an \
let deps = self.resolve.deps(id);
let mut ret = deps.filter(|dep| {
unit.pkg.dependencies().iter().filter(|d| {
- d.name() == &*dep.name() && d.version_req().matches(dep.version())
+ d.name() == dep.name() && d.version_req().matches(dep.version())
}).any(|d| {
// If this target is a build command, then we only want build
// dependencies, otherwise we want everything *other than* build
// If the dependency is optional, then we're only activating it
// if the corresponding feature was activated
- if d.is_optional() && !self.resolve.features(id).contains(d.name()) {
+ if d.is_optional() && !self.resolve.features(id).contains(&*d.name()) {
return false;
}
fn doc_deps(&self, unit: &Unit<'a>) -> CargoResult<Vec<Unit<'a>>> {
let deps = self.resolve.deps(unit.pkg.package_id()).filter(|dep| {
unit.pkg.dependencies().iter().filter(|d| {
- d.name() == &*dep.name()
+ d.name() == dep.name()
}).any(|dep| {
match dep.kind() {
DepKind::Normal => self.dep_platform_activated(dep,
f: &mut FnMut(Summary))
-> CargoResult<()> {
let source_id = self.source_id.clone();
- let summaries = self.summaries(dep.name(), load)?;
+ let summaries = self.summaries(&*dep.name(), load)?;
let summaries = summaries.iter().filter(|&&(_, yanked)| {
dep.source_id().precise().is_some() || !yanked
}).map(|s| s.0.clone());
// version requested (argument to `--precise`).
let summaries = summaries.filter(|s| {
match source_id.precise() {
- Some(p) if p.starts_with(dep.name()) &&
+ Some(p) if p.starts_with(&*dep.name()) &&
p[dep.name().len()..].starts_with('=') => {
let vers = &p[dep.name().len() + 1..];
s.version().to_string() == vers