Auto merge of #6476 - dwijnand:salvaged-semver-work, r=Eh2406

Salvaged semver work

None
This commit is contained in:
bors 2018-12-22 22:14:54 +00:00
commit e593efc9cb
4 changed files with 28 additions and 35 deletions

View File

@ -72,11 +72,12 @@ impl<'de> de::Deserialize<'de> for PackageId {
let string = String::deserialize(d)?; let string = String::deserialize(d)?;
let mut s = string.splitn(3, ' '); let mut s = string.splitn(3, ' ');
let name = s.next().unwrap(); let name = s.next().unwrap();
let name = InternedString::new(name);
let version = match s.next() { let version = match s.next() {
Some(s) => s, Some(s) => s,
None => return Err(de::Error::custom("invalid serialized PackageId")), 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() { let url = match s.next() {
Some(s) => s, Some(s) => s,
None => return Err(de::Error::custom("invalid serialized PackageId")), None => return Err(de::Error::custom("invalid serialized PackageId")),
@ -88,11 +89,7 @@ impl<'de> de::Deserialize<'de> for PackageId {
}; };
let source_id = SourceId::from_url(url).map_err(de::Error::custom)?; let source_id = SourceId::from_url(url).map_err(de::Error::custom)?;
Ok(PackageId::wrap(PackageIdInner { Ok(PackageId::pure(name, version, source_id))
name: InternedString::new(name),
version,
source_id,
}))
} }
} }
@ -118,15 +115,15 @@ impl<'a> Hash for PackageId {
impl PackageId { impl PackageId {
pub fn new<T: ToSemver>(name: &str, version: T, sid: SourceId) -> CargoResult<PackageId> { pub fn new<T: ToSemver>(name: &str, version: T, sid: SourceId) -> CargoResult<PackageId> {
let v = version.to_semver()?; let v = version.to_semver()?;
Ok(PackageId::pure(InternedString::new(name), v, sid))
Ok(PackageId::wrap(PackageIdInner {
name: InternedString::new(name),
version: v,
source_id: sid,
}))
} }
fn wrap(inner: PackageIdInner) -> PackageId { pub fn pure(name: InternedString, version: semver::Version, source_id: SourceId) -> PackageId {
let inner = PackageIdInner {
name,
version,
source_id,
};
let mut cache = PACKAGE_ID_CACHE.lock().unwrap(); let mut cache = PACKAGE_ID_CACHE.lock().unwrap();
let inner = cache.get(&inner).cloned().unwrap_or_else(|| { let inner = cache.get(&inner).cloned().unwrap_or_else(|| {
let inner = Box::leak(Box::new(inner)); let inner = Box::leak(Box::new(inner));
@ -147,19 +144,15 @@ impl PackageId {
} }
pub fn with_precise(self, precise: Option<String>) -> PackageId { pub fn with_precise(self, precise: Option<String>) -> PackageId {
PackageId::wrap(PackageIdInner { PackageId::pure(
name: self.inner.name, self.inner.name,
version: self.inner.version.clone(), self.inner.version.clone(),
source_id: self.inner.source_id.with_precise(precise), self.inner.source_id.with_precise(precise),
}) )
} }
pub fn with_source_id(self, source: SourceId) -> PackageId { pub fn with_source_id(self, source: SourceId) -> PackageId {
PackageId::wrap(PackageIdInner { PackageId::pure(self.inner.name, self.inner.version.clone(), source)
name: self.inner.name,
version: self.inner.version.clone(),
source_id: source,
})
} }
pub fn stable_hash(self, workspace: &Path) -> PackageIdStableHash<'_> { pub fn stable_hash(self, workspace: &Path) -> PackageIdStableHash<'_> {

View File

@ -61,7 +61,7 @@ impl PackageIdSpec {
let mut parts = spec.splitn(2, ':'); let mut parts = spec.splitn(2, ':');
let name = parts.next().unwrap(); let name = parts.next().unwrap();
let version = match parts.next() { let version = match parts.next() {
Some(version) => Some(Version::parse(version)?), Some(version) => Some(version.to_semver()?),
None => None, None => None,
}; };
validate_package_name(name, "pkgid", "")?; validate_package_name(name, "pkgid", "")?;
@ -274,7 +274,7 @@ impl<'de> de::Deserialize<'de> for PackageIdSpec {
mod tests { mod tests {
use super::PackageIdSpec; use super::PackageIdSpec;
use crate::core::{PackageId, SourceId}; use crate::core::{PackageId, SourceId};
use semver::Version; use crate::util::ToSemver;
use url::Url; use url::Url;
#[test] #[test]
@ -289,7 +289,7 @@ mod tests {
"http://crates.io/foo#1.2.3", "http://crates.io/foo#1.2.3",
PackageIdSpec { PackageIdSpec {
name: "foo".to_string(), 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()), url: Some(Url::parse("http://crates.io/foo").unwrap()),
}, },
); );
@ -297,7 +297,7 @@ mod tests {
"http://crates.io/foo#bar:1.2.3", "http://crates.io/foo#bar:1.2.3",
PackageIdSpec { PackageIdSpec {
name: "bar".to_string(), 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()), url: Some(Url::parse("http://crates.io/foo").unwrap()),
}, },
); );
@ -313,7 +313,7 @@ mod tests {
"crates.io/foo#1.2.3", "crates.io/foo#1.2.3",
PackageIdSpec { PackageIdSpec {
name: "foo".to_string(), 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()), url: Some(Url::parse("cargo://crates.io/foo").unwrap()),
}, },
); );
@ -329,7 +329,7 @@ mod tests {
"crates.io/foo#bar:1.2.3", "crates.io/foo#bar:1.2.3",
PackageIdSpec { PackageIdSpec {
name: "bar".to_string(), 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()), url: Some(Url::parse("cargo://crates.io/foo").unwrap()),
}, },
); );
@ -345,7 +345,7 @@ mod tests {
"foo:1.2.3", "foo:1.2.3",
PackageIdSpec { PackageIdSpec {
name: "foo".to_string(), name: "foo".to_string(),
version: Some(Version::parse("1.2.3").unwrap()), version: Some("1.2.3".to_semver().unwrap()),
url: None, url: None,
}, },
); );

View File

@ -6,7 +6,7 @@ use std::path::{Path, PathBuf};
use std::sync::Arc; use std::sync::Arc;
use std::{env, fs}; use std::{env, fs};
use semver::{Version, VersionReq}; use semver::VersionReq;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use tempfile::Builder as TempFileBuilder; use tempfile::Builder as TempFileBuilder;
@ -19,7 +19,7 @@ use crate::ops::{self, CompileFilter};
use crate::sources::{GitSource, PathSource, SourceConfigMap}; use crate::sources::{GitSource, PathSource, SourceConfigMap};
use crate::util::errors::{CargoResult, CargoResultExt}; use crate::util::errors::{CargoResult, CargoResultExt};
use crate::util::paths; use crate::util::paths;
use crate::util::{internal, Config}; use crate::util::{internal, Config, ToSemver};
use crate::util::{FileLock, Filesystem}; use crate::util::{FileLock, Filesystem};
#[derive(Deserialize, Serialize)] #[derive(Deserialize, Serialize)]
@ -456,7 +456,7 @@ where
v v
), ),
}, },
_ => match v.parse::<Version>() { _ => match v.to_semver() {
Ok(v) => Some(format!("={}", v)), Ok(v) => Some(format!("={}", v)),
Err(_) => { Err(_) => {
let mut msg = format!( let mut msg = format!(

View File

@ -9,7 +9,7 @@ use crate::core::dependency::Dependency;
use crate::core::{PackageId, SourceId, Summary}; use crate::core::{PackageId, SourceId, Summary};
use crate::sources::registry::RegistryData; use crate::sources::registry::RegistryData;
use crate::sources::registry::{RegistryPackage, INDEX_LOCK}; use crate::sources::registry::{RegistryPackage, INDEX_LOCK};
use crate::util::{internal, CargoResult, Config, Filesystem}; use crate::util::{internal, CargoResult, Config, Filesystem, ToSemver};
/// Crates.io treats hyphen and underscores as interchangeable /// Crates.io treats hyphen and underscores as interchangeable
/// but, the index and old cargo do not. So the index must store uncanonicalized version /// but, the index and old cargo do not. So the index must store uncanonicalized version
@ -293,7 +293,7 @@ impl<'cfg> RegistryIndex<'cfg> {
let mut vers = p[name.len() + 1..].splitn(2, "->"); let mut vers = p[name.len() + 1..].splitn(2, "->");
if dep if dep
.version_req() .version_req()
.matches(&Version::parse(vers.next().unwrap()).unwrap()) .matches(&vers.next().unwrap().to_semver().unwrap())
{ {
vers.next().unwrap() == s.version().to_string() vers.next().unwrap() == s.version().to_string()
} else { } else {