Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Intern semver::Version/semver::VersionReq #6468

Closed
wants to merge 7 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 15 additions & 15 deletions src/cargo/core/dependency.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ use serde::Serialize;
use crate::core::interning::InternedString;
use crate::core::{PackageId, SourceId, Summary};
use crate::util::errors::{CargoResult, CargoResultExt};
use crate::util::{Cfg, CfgExpr, Config};
use crate::util::{Cfg, CfgExpr, Config, SemVersionReq, ToSemverReq};

/// Information about a dependency requested by a Cargo manifest.
/// Cheap to copy.
Expand All @@ -26,7 +26,7 @@ struct Inner {
name: InternedString,
source_id: SourceId,
registry_id: Option<SourceId>,
req: VersionReq,
req: SemVersionReq,
specified_req: bool,
kind: Kind,
only_match_name: bool,
Expand Down Expand Up @@ -92,8 +92,8 @@ fn parse_req_with_deprecated(
name: &str,
req: &str,
extra: Option<(PackageId, &Config)>,
) -> CargoResult<VersionReq> {
match VersionReq::parse(req) {
) -> CargoResult<SemVersionReq> {
match req.to_semver_req() {
Err(ReqParseError::DeprecatedVersionRequirement(requirement)) => {
let (inside, config) = match extra {
Some(pair) => pair,
Expand All @@ -118,11 +118,11 @@ this warning.
);
config.shell().warn(&msg)?;

Ok(requirement)
Ok(SemVersionReq::new(requirement))
}
Err(e) => {
let err: CargoResult<VersionReq> = Err(e.into());
let v: VersionReq = err.chain_err(|| {
let err: CargoResult<SemVersionReq> = Err(e.into());
let v: SemVersionReq = err.chain_err(|| {
format!(
"failed to parse the version requirement `{}` for dependency `{}`",
req, name
Expand Down Expand Up @@ -160,7 +160,7 @@ impl Dependency {
let arg = Some((inside, config));
let (specified_req, version_req) = match version {
Some(v) => (true, parse_req_with_deprecated(name, v, arg)?),
None => (false, VersionReq::any()),
None => (false, SemVersionReq::any()),
};

let mut ret = Dependency::new_override(name, source_id);
Expand All @@ -181,7 +181,7 @@ impl Dependency {
) -> CargoResult<Dependency> {
let (specified_req, version_req) = match version {
Some(v) => (true, parse_req_with_deprecated(name, v, None)?),
None => (false, VersionReq::any()),
None => (false, SemVersionReq::any()),
};

let mut ret = Dependency::new_override(name, source_id);
Expand All @@ -201,7 +201,7 @@ impl Dependency {
name: InternedString::new(name),
source_id,
registry_id: None,
req: VersionReq::any(),
req: SemVersionReq::any(),
kind: Kind::Normal,
only_match_name: true,
optional: false,
Expand All @@ -215,7 +215,7 @@ impl Dependency {
}

pub fn version_req(&self) -> &VersionReq {
&self.inner.req
&self.inner.req.value()
}

/// This is the name of this `Dependency` as listed in `Cargo.toml`.
Expand Down Expand Up @@ -335,7 +335,7 @@ impl Dependency {
}

/// Set the version requirement for this dependency
pub fn set_version_req(&mut self, req: VersionReq) -> &mut Dependency {
pub fn set_version_req(&mut self, req: SemVersionReq) -> &mut Dependency {
Rc::make_mut(&mut self.inner).req = req;
self
}
Expand All @@ -353,15 +353,15 @@ impl Dependency {
/// Lock this dependency to depending on the specified package id
pub fn lock_to(&mut self, id: PackageId) -> &mut Dependency {
assert_eq!(self.inner.source_id, id.source_id());
assert!(self.inner.req.matches(id.version()));
assert!(self.inner.req.value().matches(id.version()));
trace!(
"locking dep from `{}` with `{}` at {} to {}",
self.package_name(),
self.version_req(),
self.source_id(),
id
);
self.set_version_req(VersionReq::exact(id.version()))
self.set_version_req(SemVersionReq::exact(id.sem_version()))
.set_source_id(id.source_id())
}

Expand Down Expand Up @@ -414,7 +414,7 @@ impl Dependency {
pub fn matches_id(&self, id: PackageId) -> bool {
self.inner.name == id.name()
&& (self.inner.only_match_name
|| (self.inner.req.matches(id.version()) && self.inner.source_id == id.source_id()))
|| (self.inner.req.value().matches(id.version()) && self.inner.source_id == id.source_id()))
}

pub fn map_source(mut self, to_replace: SourceId, replace_with: SourceId) -> Dependency {
Expand Down
52 changes: 24 additions & 28 deletions src/cargo/core/package_id.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ use serde::ser;

use crate::core::interning::InternedString;
use crate::core::source::SourceId;
use crate::util::{CargoResult, ToSemver};
use crate::util::{CargoResult, SemVersion, ToSemver};

lazy_static::lazy_static! {
static ref PACKAGE_ID_CACHE: Mutex<HashSet<&'static PackageIdInner>> =
Expand All @@ -28,7 +28,7 @@ pub struct PackageId {
#[derive(PartialOrd, Eq, Ord)]
struct PackageIdInner {
name: InternedString,
version: semver::Version,
version: SemVersion,
source_id: SourceId,
}

Expand Down Expand Up @@ -76,7 +76,7 @@ impl<'de> de::Deserialize<'de> for PackageId {
Some(s) => s,
None => return Err(de::Error::custom("invalid serialized PackageId")),
};
let version = semver::Version::parse(version).map_err(de::Error::custom)?;
let version = version.to_semver().map_err(de::Error::custom)?;
let url = match s.next() {
Some(s) => s,
None => return Err(de::Error::custom("invalid serialized PackageId")),
Expand All @@ -88,11 +88,7 @@ impl<'de> de::Deserialize<'de> for PackageId {
};
let source_id = SourceId::from_url(url).map_err(de::Error::custom)?;

Ok(PackageId::wrap(PackageIdInner {
name: InternedString::new(name),
version,
source_id,
}))
Ok(PackageId::pure(InternedString::new(name), version, source_id))
}
}

Expand All @@ -116,17 +112,14 @@ impl<'a> Hash for PackageId {
}

impl PackageId {
pub fn new<T: ToSemver>(name: &str, version: T, sid: SourceId) -> CargoResult<PackageId> {
let v = version.to_semver()?;

Ok(PackageId::wrap(PackageIdInner {
name: InternedString::new(name),
version: v,
source_id: sid,
}))
pub fn new<V: ToSemver>(name: &str, version: V, source_id: SourceId) -> CargoResult<PackageId> {
let version = version.to_semver()?;
let name = InternedString::new(name);
Ok(PackageId::pure(name, version, source_id))
}

fn wrap(inner: PackageIdInner) -> PackageId {
pub fn pure(name: InternedString, version: SemVersion, source_id: SourceId) -> PackageId {
let inner = PackageIdInner { name, version, source_id };
let mut cache = PACKAGE_ID_CACHE.lock().unwrap();
let inner = cache.get(&inner).cloned().unwrap_or_else(|| {
let inner = Box::leak(Box::new(inner));
Expand All @@ -140,26 +133,29 @@ impl PackageId {
self.inner.name
}
pub fn version(self) -> &'static semver::Version {
&self.inner.version
self.inner.version.value()
}
pub fn sem_version(self) -> SemVersion {
self.inner.version
}
pub fn source_id(self) -> SourceId {
self.inner.source_id
}

pub fn with_precise(self, precise: Option<String>) -> PackageId {
PackageId::wrap(PackageIdInner {
name: self.inner.name,
version: self.inner.version.clone(),
source_id: self.inner.source_id.with_precise(precise),
})
PackageId::pure(
self.inner.name,
self.inner.version.clone(),
self.inner.source_id.with_precise(precise),
)
}

pub fn with_source_id(self, source: SourceId) -> PackageId {
PackageId::wrap(PackageIdInner {
name: self.inner.name,
version: self.inner.version.clone(),
source_id: source,
})
PackageId::pure(
self.inner.name,
self.inner.version.clone(),
source
)
}

pub fn stable_hash(self, workspace: &Path) -> PackageIdStableHash<'_> {
Expand Down
27 changes: 13 additions & 14 deletions src/cargo/core/package_id_spec.rs
Original file line number Diff line number Diff line change
@@ -1,13 +1,12 @@
use std::collections::HashMap;
use std::fmt;

use semver::Version;
use serde::{de, ser};
use url::Url;

use crate::core::PackageId;
use crate::util::errors::{CargoResult, CargoResultExt};
use crate::util::{validate_package_name, ToSemver, ToUrl};
use crate::util::{validate_package_name, SemVersion, ToSemver, ToUrl};

/// Some or all of the data required to identify a package:
///
Expand All @@ -21,7 +20,7 @@ use crate::util::{validate_package_name, ToSemver, ToUrl};
#[derive(Clone, PartialEq, Eq, Debug, Hash, Ord, PartialOrd)]
pub struct PackageIdSpec {
name: String,
version: Option<Version>,
version: Option<SemVersion>,
url: Option<Url>,
}

Expand Down Expand Up @@ -61,7 +60,7 @@ impl PackageIdSpec {
let mut parts = spec.splitn(2, ':');
let name = parts.next().unwrap();
let version = match parts.next() {
Some(version) => Some(Version::parse(version)?),
Some(version) => Some(version.to_semver()?),
None => None,
};
validate_package_name(name, "pkgid", "")?;
Expand All @@ -87,7 +86,7 @@ impl PackageIdSpec {
pub fn from_package_id(package_id: PackageId) -> PackageIdSpec {
PackageIdSpec {
name: package_id.name().to_string(),
version: Some(package_id.version().clone()),
version: Some(package_id.sem_version()),
url: Some(package_id.source_id().url().clone()),
}
}
Expand Down Expand Up @@ -143,8 +142,8 @@ impl PackageIdSpec {
&self.name
}

pub fn version(&self) -> Option<&Version> {
self.version.as_ref()
pub fn version(&self) -> Option<SemVersion> {
self.version
}

pub fn url(&self) -> Option<&Url> {
Expand All @@ -162,7 +161,7 @@ impl PackageIdSpec {
}

if let Some(ref v) = self.version {
if v != package_id.version() {
if v != &package_id.sem_version() {
return false;
}
}
Expand Down Expand Up @@ -274,7 +273,7 @@ impl<'de> de::Deserialize<'de> for PackageIdSpec {
mod tests {
use super::PackageIdSpec;
use crate::core::{PackageId, SourceId};
use semver::Version;
use crate::util::ToSemver;
use url::Url;

#[test]
Expand All @@ -289,15 +288,15 @@ mod tests {
"http://crates.io/foo#1.2.3",
PackageIdSpec {
name: "foo".to_string(),
version: Some(Version::parse("1.2.3").unwrap()),
version: Some("1.2.3".to_semver().unwrap()),
url: Some(Url::parse("http://crates.io/foo").unwrap()),
},
);
ok(
"http://crates.io/foo#bar:1.2.3",
PackageIdSpec {
name: "bar".to_string(),
version: Some(Version::parse("1.2.3").unwrap()),
version: Some("1.2.3".to_semver().unwrap()),
url: Some(Url::parse("http://crates.io/foo").unwrap()),
},
);
Expand All @@ -313,7 +312,7 @@ mod tests {
"crates.io/foo#1.2.3",
PackageIdSpec {
name: "foo".to_string(),
version: Some(Version::parse("1.2.3").unwrap()),
version: Some("1.2.3".to_semver().unwrap()),
url: Some(Url::parse("cargo://crates.io/foo").unwrap()),
},
);
Expand All @@ -329,7 +328,7 @@ mod tests {
"crates.io/foo#bar:1.2.3",
PackageIdSpec {
name: "bar".to_string(),
version: Some(Version::parse("1.2.3").unwrap()),
version: Some("1.2.3".to_semver().unwrap()),
url: Some(Url::parse("cargo://crates.io/foo").unwrap()),
},
);
Expand All @@ -345,7 +344,7 @@ mod tests {
"foo:1.2.3",
PackageIdSpec {
name: "foo".to_string(),
version: Some(Version::parse("1.2.3").unwrap()),
version: Some("1.2.3".to_semver().unwrap()),
url: None,
},
);
Expand Down
5 changes: 2 additions & 3 deletions src/cargo/core/registry.rs
Original file line number Diff line number Diff line change
@@ -1,14 +1,13 @@
use std::collections::HashMap;

use log::{debug, trace};
use semver::VersionReq;
use url::Url;

use crate::core::PackageSet;
use crate::core::{Dependency, PackageId, Source, SourceId, SourceMap, Summary};
use crate::sources::config::SourceConfigMap;
use crate::util::errors::{CargoResult, CargoResultExt};
use crate::util::{profile, Config};
use crate::util::{profile, Config, SemVersionReq};

/// Source of information about a group of packages.
///
Expand Down Expand Up @@ -645,7 +644,7 @@ fn lock(locked: &LockedMap, patches: &HashMap<Url, Vec<PackageId>>, summary: Sum

if patch_locked {
trace!("\tthird hit on {}", patch_id);
let req = VersionReq::exact(patch_id.version());
let req = SemVersionReq::exact(patch_id.sem_version());
let mut dep = dep;
dep.set_version_req(req);
return dep;
Expand Down
5 changes: 2 additions & 3 deletions src/cargo/core/resolver/errors.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,8 @@ use std::fmt;

use crate::core::{Dependency, PackageId, Registry, Summary};
use crate::util::lev_distance::lev_distance;
use crate::util::Config;
use crate::util::{Config, ToSemverReq};
use failure::{Error, Fail};
use semver;

use super::context::Context;
use super::types::{Candidate, ConflictReason};
Expand Down Expand Up @@ -170,7 +169,7 @@ pub(super) fn activation_error(
// Maybe the user mistyped the ver_req? Like `dep="2"` when `dep="0.2"`
// was meant. So we re-query the registry with `deb="*"` so we can
// list a few versions that were actually found.
let all_req = semver::VersionReq::parse("*").unwrap();
let all_req = "*".to_semver_req().unwrap();
let mut new_dep = dep.clone();
new_dep.set_version_req(all_req);
let mut candidates = match registry.query_vec(&new_dep, false) {
Expand Down
Loading