Skip to content

Commit 57684d0

Browse files
committed
auto merge of #767 : alexcrichton/cargo/issue-637, r=wycats
Each dependency itself already has the precise source listed, and we're guaranteed that for each (source, name) pair that there is exactly one dependency, so there is always a way to rebuild the precise dependency graph after the fact by looking up the (source, name) pair in the hash map. This should help with some of the readability concerns in #637 because the git SHA that a source is locked to is now only mentioned once in a lockfile. This commit does preserve, however, the mention of the version in each dependency line which will likely never go away. This means that for registry-based packages will still run into the same lockfile merge conflict troubles, there will just be more readable versions than git hashes. It should also be noted that this will alter all currently generated lockfiles as any dependencies mentioned will lose the hashes mentioned afterwards. This will likely cause somewhat of a transitionary pain as this version of cargo propagates throughout.
2 parents 3a7f2d0 + ef8855f commit 57684d0

File tree

2 files changed

+54
-30
lines changed

2 files changed

+54
-30
lines changed

src/cargo/core/package_id.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,16 @@ impl PackageId {
132132

133133
Metadata { metadata: metadata, extra_filename: extra_filename }
134134
}
135+
136+
pub fn with_precise(&self, precise: Option<String>) -> PackageId {
137+
PackageId {
138+
inner: Arc::new(PackageIdInner {
139+
name: self.inner.name.to_string(),
140+
version: self.inner.version.clone(),
141+
source_id: self.inner.source_id.with_precise(precise),
142+
}),
143+
}
144+
}
135145
}
136146

137147
impl Metadata {

src/cargo/core/resolver/encode.rs

Lines changed: 44 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -20,48 +20,62 @@ pub type Metadata = TreeMap<String, String>;
2020
impl EncodableResolve {
2121
pub fn to_resolve(&self, default: &SourceId) -> CargoResult<Resolve> {
2222
let mut g = Graph::new();
23+
let mut tmp = HashMap::new();
24+
25+
let packages = Vec::new();
26+
let packages = self.package.as_ref().unwrap_or(&packages);
27+
28+
{
29+
let register_pkg = |pkg: &EncodableDependency| {
30+
let pkgid = try!(pkg.to_package_id(default));
31+
let precise = pkgid.get_source_id().get_precise()
32+
.map(|s| s.to_string());
33+
assert!(tmp.insert(pkgid.clone(), precise),
34+
"a package was referenced twice in the lockfile");
35+
g.add(try!(pkg.to_package_id(default)), []);
36+
Ok(())
37+
};
38+
39+
try!(register_pkg(&self.root));
40+
for pkg in packages.iter() {
41+
try!(register_pkg(pkg));
42+
}
43+
}
2344

24-
try!(add_pkg_to_graph(&mut g, &self.root, default));
25-
26-
match self.package {
27-
Some(ref packages) => {
28-
for dep in packages.iter() {
29-
try!(add_pkg_to_graph(&mut g, dep, default));
45+
{
46+
let add_dependencies = |pkg: &EncodableDependency| {
47+
let package_id = try!(pkg.to_package_id(default));
48+
49+
let deps = match pkg.dependencies {
50+
Some(ref deps) => deps,
51+
None => return Ok(()),
52+
};
53+
for edge in deps.iter() {
54+
let to_depend_on = try!(edge.to_package_id(default));
55+
let precise_pkgid =
56+
tmp.find(&to_depend_on)
57+
.map(|p| to_depend_on.with_precise(p.clone()))
58+
.unwrap_or(to_depend_on.clone());
59+
g.link(package_id.clone(), precise_pkgid);
3060
}
61+
Ok(())
62+
};
63+
64+
try!(add_dependencies(&self.root));
65+
for pkg in packages.iter() {
66+
try!(add_dependencies(pkg));
3167
}
32-
None => {}
3368
}
3469

35-
let root = self.root.to_package_id(default);
3670
Ok(Resolve {
3771
graph: g,
38-
root: try!(root),
72+
root: try!(self.root.to_package_id(default)),
3973
features: HashMap::new(),
4074
metadata: self.metadata.clone(),
4175
})
4276
}
4377
}
4478

45-
fn add_pkg_to_graph(g: &mut Graph<PackageId>,
46-
dep: &EncodableDependency,
47-
default: &SourceId)
48-
-> CargoResult<()>
49-
{
50-
let package_id = try!(dep.to_package_id(default));
51-
g.add(package_id.clone(), []);
52-
53-
match dep.dependencies {
54-
Some(ref deps) => {
55-
for edge in deps.iter() {
56-
g.link(package_id.clone(), try!(edge.to_package_id(default)));
57-
}
58-
},
59-
_ => ()
60-
};
61-
62-
Ok(())
63-
}
64-
6579
#[deriving(Encodable, Decodable, Show, PartialOrd, Ord, PartialEq, Eq)]
6680
pub struct EncodableDependency {
6781
name: String,
@@ -178,7 +192,7 @@ fn encodable_package_id(id: &PackageId, root: &PackageId) -> EncodablePackageId
178192
let source = if id.get_source_id() == root.get_source_id() {
179193
None
180194
} else {
181-
Some(id.get_source_id().clone())
195+
Some(id.get_source_id().with_precise(None))
182196
};
183197
EncodablePackageId {
184198
name: id.get_name().to_string(),

0 commit comments

Comments
 (0)