Skip to content
This repository was archived by the owner on May 12, 2020. It is now read-only.

Commit d895af1

Browse files
authored
Merge pull request #38 from remram44/fix
Use correct package as root of dependency graph
2 parents fe9dd7e + cd8ed7d commit d895af1

4 files changed

Lines changed: 107 additions & 46 deletions

File tree

Cargo.lock

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

src/error.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ pub type CliResult<T> = Result<T, CliError>;
1212
pub enum CliErrorKind {
1313
UnknownBoolArg,
1414
TomlTableRoot,
15+
TomlNoName,
1516
CurrentDir,
1617
Unknown,
1718
Io(io::Error),
@@ -23,6 +24,7 @@ impl CliErrorKind {
2324
match *self {
2425
CliErrorKind::Generic(ref e) => e,
2526
CliErrorKind::TomlTableRoot => "No root table found for toml file",
27+
CliErrorKind::TomlNoName => "No name for package in toml file",
2628
CliErrorKind::CurrentDir => "Unable to determine the current working directory",
2729
CliErrorKind::UnknownBoolArg => "The value supplied isn't valid, either use 'true/false', 'yes/no', or the first letter of either.",
2830
CliErrorKind::Unknown => "An unknown fatal error has occurred, please consider filing a bug-report!",

src/graph.rs

Lines changed: 40 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ impl<'c, 'o> DepGraph<'c, 'o> {
7070
}
7171

7272
pub fn remove(&mut self, id: usize) {
73-
debugln!("remove; name={}; index={}", name, id);
73+
debugln!("remove; index={}", id);
7474
self.nodes.remove(id);
7575
// Remove edges of the removed node.
7676
self.edges = self.edges.iter()
@@ -112,7 +112,7 @@ impl<'c, 'o> DepGraph<'c, 'o> {
112112
debugln!("remove_orphans; idr={}", idr);
113113
used[idr] = true;
114114
}
115-
debugln!("remove_orphans; unsued_nodes={:?}", used);
115+
debugln!("remove_orphans; unused_nodes={:?}", used);
116116

117117
for (id, &u) in used.iter().enumerate() {
118118
if !u {
@@ -166,12 +166,48 @@ impl<'c, 'o> DepGraph<'c, 'o> {
166166
}
167167
}
168168

169-
pub fn find_or_add(&mut self, name: &str, ver: &str) -> usize {
169+
pub fn set_root(&mut self, name: &str, ver: &str) -> bool {
170+
let root_id = if let Some(i) = self.find(name, ver) {
171+
i
172+
} else {
173+
return false;
174+
};
175+
if root_id == 0 {
176+
return true;
177+
}
178+
179+
// Swap with 0
180+
self.nodes.swap(0, root_id);
181+
182+
// Adjust edges
183+
for edge in self.edges.iter_mut() {
184+
if edge.0 == 0 {
185+
edge.0 = root_id;
186+
} else if edge.0 == root_id {
187+
edge.0 = 0;
188+
}
189+
if edge.1 == 0 {
190+
edge.1 = root_id;
191+
} else if edge.1 == root_id {
192+
edge.1 = 0;
193+
}
194+
}
195+
true
196+
}
197+
198+
pub fn find(&self, name: &str, ver: &str) -> Option<usize> {
170199
for (i, d) in self.nodes.iter().enumerate() {
171200
if d.name == name && d.ver == ver {
172-
return i;
201+
return Some(i);
173202
}
174203
}
204+
None
205+
}
206+
207+
pub fn find_or_add(&mut self, name: &str, ver: &str) -> usize {
208+
if let Some(i) = self.find(name, ver) {
209+
return i;
210+
}
175211
self.nodes.push(ResolvedDep::new(name.to_owned(), ver.to_owned()));
176212
self.nodes.len() - 1
177213
}

src/project.rs

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,11 @@ impl<'c, 'o> Project<'c, 'o> {
2121
}
2222

2323
pub fn graph(mut self) -> CliResult<DepGraph<'c, 'o>> {
24-
let root_deps = try!(self.parse_root_deps());
24+
let (root_deps, root_name, root_version) = try!(self.parse_root_deps());
2525
let mut dg = try!(self.parse_lock_file());
26+
if !dg.set_root(&root_name, &root_version) {
27+
return Err(From::from(CliErrorKind::TomlNoName));
28+
}
2629
self.set_resolved_kind(&root_deps, &mut dg);
2730
if !self.cfg.include_vers {
2831
Project::show_version_on_duplicates(&mut dg);
@@ -155,8 +158,6 @@ impl<'c, 'o> Project<'c, 'o> {
155158

156159
if let Some(root) = lock_toml.get("root") {
157160
parse_package(&mut dg, root);
158-
} else {
159-
return Err(From::from(CliErrorKind::TomlTableRoot));
160161
}
161162

162163
if let Some(&Value::Array(ref packages)) = lock_toml.get("package") {
@@ -166,18 +167,39 @@ impl<'c, 'o> Project<'c, 'o> {
166167
}
167168

168169
debugln!("return=parse_lock_file; self={:#?}", self);
170+
debugln!("return=parse_lock_file; dg={:#?}", dg);
169171
Ok(dg)
170172
}
171173

172174
/// Builds a list of the dependencies declared in the manifest file.
173-
pub fn parse_root_deps(&mut self) -> CliResult<Vec<DeclaredDep>> {
175+
pub fn parse_root_deps(&mut self) -> CliResult<(Vec<DeclaredDep>, String, String)> {
174176
debugln!("executing; parse_root_deps;");
175177
let manifest_path = try!(util::find_manifest_file(self.cfg.manifest_file));
176178
let manifest_toml = try!(util::toml_from_file(manifest_path));
177179

178180
let mut declared_deps = vec![];
179181
let mut v = vec![];
180182

183+
let (root_name, root_version) = {
184+
let mut name = None;
185+
let mut version = None;
186+
if let Some(table) = manifest_toml.get("package") {
187+
if let Some(table) = table.as_table() {
188+
if let Some(&Value::String(ref n)) = table.get("name") {
189+
name = Some(n);
190+
}
191+
if let Some(&Value::String(ref v)) = table.get("version") {
192+
version = Some(v);
193+
}
194+
}
195+
}
196+
if let (Some(n), Some(v)) = (name, version) {
197+
(n.to_owned(), v.to_owned())
198+
} else {
199+
return Err(From::from(CliErrorKind::TomlNoName));
200+
}
201+
};
202+
181203
if let Some(table) = manifest_toml.get("dependencies") {
182204
if let Some(table) = table.as_table() {
183205
for (name, dep_table) in table.into_iter() {
@@ -202,6 +224,7 @@ impl<'c, 'o> Project<'c, 'o> {
202224

203225
debugln!("return=parse_root_deps; self={:#?}", self);
204226
debugln!("return=parse_root_deps; declared_deps={:#?}", declared_deps);
205-
Ok(declared_deps)
227+
debugln!("return=parse_root_deps; root_name={:#?}", root_name);
228+
Ok((declared_deps, root_name, root_version))
206229
}
207230
}

0 commit comments

Comments
 (0)