Skip to content

Commit 519b8e0

Browse files
committed
auto merge of #717 : alexcrichton/cargo/souped-up-resolve, r=wycats
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
2 parents abc7127 + ba17dae commit 519b8e0

17 files changed

+1240
-899
lines changed

Cargo.lock

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,3 +46,6 @@ doc = false
4646

4747
[[test]]
4848
name = "tests"
49+
50+
[[test]]
51+
name = "resolve"

Makefile.in

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ style:
8989
sh tests/check-style.sh
9090

9191
no-exes:
92-
find $$(git ls-files | grep -v ttf) -perm +111 -type f \
92+
find $$(git ls-files) -perm +111 -type f \
9393
-not -name configure -not -name '*.sh' -not -name '*.rs' | \
9494
grep '.*' \
9595
&& exit 1 || exit 0

src/cargo/core/package_id.rs

Lines changed: 46 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use semver;
22
use std::hash::Hash;
3+
use std::sync::Arc;
34
use std::fmt::{mod, Show, Formatter};
45
use std::hash;
56
use serialize::{Encodable, Encoder, Decodable, Decoder};
@@ -10,17 +11,23 @@ use util::{CargoResult, CargoError, short_hash, ToSemver};
1011
use core::source::SourceId;
1112

1213
/// Identifier for a specific version of a package in a specific source.
13-
#[deriving(Clone, PartialEq, PartialOrd, Ord)]
14+
#[deriving(Clone)]
1415
pub struct PackageId {
16+
inner: Arc<PackageIdInner>,
17+
}
18+
19+
#[deriving(PartialEq, PartialOrd, Eq, Ord)]
20+
struct PackageIdInner {
1521
name: String,
1622
version: semver::Version,
1723
source_id: SourceId,
1824
}
1925

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

3845
Ok(PackageId {
39-
name: name.to_string(),
40-
version: version,
41-
source_id: source_id
46+
inner: Arc::new(PackageIdInner {
47+
name: name.to_string(),
48+
version: version,
49+
source_id: source_id,
50+
}),
4251
})
4352
}
4453
}
4554

4655
impl<S: hash::Writer> Hash<S> for PackageId {
4756
fn hash(&self, state: &mut S) {
48-
self.name.hash(state);
49-
self.version.to_string().hash(state);
50-
self.source_id.hash(state);
57+
self.inner.name.hash(state);
58+
self.inner.version.to_string().hash(state);
59+
self.inner.source_id.hash(state);
5160
}
5261
}
5362

63+
impl PartialEq for PackageId {
64+
fn eq(&self, other: &PackageId) -> bool {
65+
self.inner.eq(&*other.inner)
66+
}
67+
}
68+
impl PartialOrd for PackageId {
69+
fn partial_cmp(&self, other: &PackageId) -> Option<Ordering> {
70+
self.inner.partial_cmp(&*other.inner)
71+
}
72+
}
5473
impl Eq for PackageId {}
74+
impl Ord for PackageId {
75+
fn cmp(&self, other: &PackageId) -> Ordering {
76+
self.inner.cmp(&*other.inner)
77+
}
78+
}
5579

5680
#[deriving(Clone, Show, PartialEq)]
5781
pub enum PackageIdError {
@@ -80,27 +104,30 @@ impl PackageId {
80104
sid: &SourceId) -> CargoResult<PackageId> {
81105
let v = try!(version.to_semver().map_err(InvalidVersion));
82106
Ok(PackageId {
83-
name: name.to_string(),
84-
version: v,
85-
source_id: sid.clone()
107+
inner: Arc::new(PackageIdInner {
108+
name: name.to_string(),
109+
version: v,
110+
source_id: sid.clone(),
111+
}),
86112
})
87113
}
88114

89115
pub fn get_name(&self) -> &str {
90-
self.name.as_slice()
116+
self.inner.name.as_slice()
91117
}
92118

93119
pub fn get_version(&self) -> &semver::Version {
94-
&self.version
120+
&self.inner.version
95121
}
96122

97123
pub fn get_source_id(&self) -> &SourceId {
98-
&self.source_id
124+
&self.inner.source_id
99125
}
100126

101127
pub fn generate_metadata(&self) -> Metadata {
102128
let metadata = short_hash(
103-
&(self.name.as_slice(), self.version.to_string(), &self.source_id));
129+
&(self.inner.name.as_slice(), self.inner.version.to_string(),
130+
&self.inner.source_id));
104131
let extra_filename = format!("-{}", metadata);
105132

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

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

124-
if self.source_id.to_string().as_slice() != CENTRAL_REPO {
125-
try!(write!(f, " ({})", self.source_id));
151+
if self.inner.source_id.to_string().as_slice() != CENTRAL_REPO {
152+
try!(write!(f, " ({})", self.inner.source_id));
126153
}
127154

128155
Ok(())

src/cargo/core/package_id_spec.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ impl PackageIdSpec {
4949
PackageIdSpec {
5050
name: package_id.get_name().to_string(),
5151
version: Some(package_id.get_version().clone()),
52-
url: Some(package_id.get_source_id().url.clone()),
52+
url: Some(package_id.get_source_id().get_url().clone()),
5353
}
5454
}
5555

@@ -110,7 +110,7 @@ impl PackageIdSpec {
110110
}
111111

112112
match self.url {
113-
Some(ref u) => *u == package_id.get_source_id().url,
113+
Some(ref u) => u == package_id.get_source_id().get_url(),
114114
None => true
115115
}
116116
}

0 commit comments

Comments
 (0)