Skip to content

Commit

Permalink
auto merge of #717 : alexcrichton/cargo/souped-up-resolve, r=wycats
Browse files Browse the repository at this point in the history
This series of commits is rebased on top of #712 to avoid conflicts, and it adds the ability to solve version constraints as part of the resolution process. This is a critical step forward in bringing the registry online as it makes it possible for cargo to figure out what to do in the face of many uploaded versions of a package to the registry.

r? @wycats
  • Loading branch information
bors committed Oct 22, 2014
2 parents abc7127 + ba17dae commit 519b8e0
Show file tree
Hide file tree
Showing 17 changed files with 1,240 additions and 899 deletions.
4 changes: 2 additions & 2 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -46,3 +46,6 @@ doc = false

[[test]]
name = "tests"

[[test]]
name = "resolve"
2 changes: 1 addition & 1 deletion Makefile.in
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ style:
sh tests/check-style.sh

no-exes:
find $$(git ls-files | grep -v ttf) -perm +111 -type f \
find $$(git ls-files) -perm +111 -type f \
-not -name configure -not -name '*.sh' -not -name '*.rs' | \
grep '.*' \
&& exit 1 || exit 0
Expand Down
65 changes: 46 additions & 19 deletions src/cargo/core/package_id.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
use semver;
use std::hash::Hash;
use std::sync::Arc;
use std::fmt::{mod, Show, Formatter};
use std::hash;
use serialize::{Encodable, Encoder, Decodable, Decoder};
Expand All @@ -10,17 +11,23 @@ use util::{CargoResult, CargoError, short_hash, ToSemver};
use core::source::SourceId;

/// Identifier for a specific version of a package in a specific source.
#[deriving(Clone, PartialEq, PartialOrd, Ord)]
#[deriving(Clone)]
pub struct PackageId {
inner: Arc<PackageIdInner>,
}

#[deriving(PartialEq, PartialOrd, Eq, Ord)]
struct PackageIdInner {
name: String,
version: semver::Version,
source_id: SourceId,
}

impl<E, S: Encoder<E>> Encodable<S, E> for PackageId {
fn encode(&self, s: &mut S) -> Result<(), E> {
let source = self.source_id.to_url();
let encoded = format!("{} {} ({})", self.name, self.version, source);
let source = self.inner.source_id.to_url();
let encoded = format!("{} {} ({})", self.inner.name, self.inner.version,
source);
encoded.encode(s)
}
}
Expand All @@ -36,22 +43,39 @@ impl<E, D: Decoder<E>> Decodable<D, E> for PackageId {
let source_id = SourceId::from_url(captures.at(3).to_string());

Ok(PackageId {
name: name.to_string(),
version: version,
source_id: source_id
inner: Arc::new(PackageIdInner {
name: name.to_string(),
version: version,
source_id: source_id,
}),
})
}
}

impl<S: hash::Writer> Hash<S> for PackageId {
fn hash(&self, state: &mut S) {
self.name.hash(state);
self.version.to_string().hash(state);
self.source_id.hash(state);
self.inner.name.hash(state);
self.inner.version.to_string().hash(state);
self.inner.source_id.hash(state);
}
}

impl PartialEq for PackageId {
fn eq(&self, other: &PackageId) -> bool {
self.inner.eq(&*other.inner)
}
}
impl PartialOrd for PackageId {
fn partial_cmp(&self, other: &PackageId) -> Option<Ordering> {
self.inner.partial_cmp(&*other.inner)
}
}
impl Eq for PackageId {}
impl Ord for PackageId {
fn cmp(&self, other: &PackageId) -> Ordering {
self.inner.cmp(&*other.inner)
}
}

#[deriving(Clone, Show, PartialEq)]
pub enum PackageIdError {
Expand Down Expand Up @@ -80,27 +104,30 @@ impl PackageId {
sid: &SourceId) -> CargoResult<PackageId> {
let v = try!(version.to_semver().map_err(InvalidVersion));
Ok(PackageId {
name: name.to_string(),
version: v,
source_id: sid.clone()
inner: Arc::new(PackageIdInner {
name: name.to_string(),
version: v,
source_id: sid.clone(),
}),
})
}

pub fn get_name(&self) -> &str {
self.name.as_slice()
self.inner.name.as_slice()
}

pub fn get_version(&self) -> &semver::Version {
&self.version
&self.inner.version
}

pub fn get_source_id(&self) -> &SourceId {
&self.source_id
&self.inner.source_id
}

pub fn generate_metadata(&self) -> Metadata {
let metadata = short_hash(
&(self.name.as_slice(), self.version.to_string(), &self.source_id));
&(self.inner.name.as_slice(), self.inner.version.to_string(),
&self.inner.source_id));
let extra_filename = format!("-{}", metadata);

Metadata { metadata: metadata, extra_filename: extra_filename }
Expand All @@ -119,10 +146,10 @@ static CENTRAL_REPO: &'static str = "http://rust-lang.org/central-repo";

impl Show for PackageId {
fn fmt(&self, f: &mut Formatter) -> fmt::Result {
try!(write!(f, "{} v{}", self.name, self.version));
try!(write!(f, "{} v{}", self.inner.name, self.inner.version));

if self.source_id.to_string().as_slice() != CENTRAL_REPO {
try!(write!(f, " ({})", self.source_id));
if self.inner.source_id.to_string().as_slice() != CENTRAL_REPO {
try!(write!(f, " ({})", self.inner.source_id));
}

Ok(())
Expand Down
4 changes: 2 additions & 2 deletions src/cargo/core/package_id_spec.rs
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ impl PackageIdSpec {
PackageIdSpec {
name: package_id.get_name().to_string(),
version: Some(package_id.get_version().clone()),
url: Some(package_id.get_source_id().url.clone()),
url: Some(package_id.get_source_id().get_url().clone()),
}
}

Expand Down Expand Up @@ -110,7 +110,7 @@ impl PackageIdSpec {
}

match self.url {
Some(ref u) => *u == package_id.get_source_id().url,
Some(ref u) => u == package_id.get_source_id().get_url(),
None => true
}
}
Expand Down
Loading

0 comments on commit 519b8e0

Please sign in to comment.