summaryrefslogtreecommitdiffstats
path: root/src/package
diff options
context:
space:
mode:
authorMatthias Beyer <mail@beyermatthias.de>2021-02-05 08:54:18 +0100
committerMatthias Beyer <mail@beyermatthias.de>2021-02-06 11:54:23 +0100
commit284f46561253e977691916b1bad6568d7033fc48 (patch)
treeac8db9f5b0642e36456069291b85b7658f5904f4 /src/package
parentefe07be74cf1ae704cb73b0f20c28b33aa46c217 (diff)
Fix: If we added the package already, do not recurse
In a DAG, we can find a (packagename, packageversion) multiple times: .-> C -. / \ D > A \ / `-> B -ยด for example, in this scenario we would find "A" multiple times. If we re-find a package that we already recursed for, do not recurse again for it. Signed-off-by: Matthias Beyer <mail@beyermatthias.de>
Diffstat (limited to 'src/package')
-rw-r--r--src/package/dag.rs36
1 files changed, 17 insertions, 19 deletions
diff --git a/src/package/dag.rs b/src/package/dag.rs
index a4596aa..b698ff3 100644
--- a/src/package/dag.rs
+++ b/src/package/dag.rs
@@ -51,28 +51,26 @@ impl Dag {
) -> Result<()> {
p.get_self_packaged_dependencies()
.and_then_ok(|(name, constr)| {
- trace!("Dependency: {:?}", name);
+ trace!("Dependency for {} {} found: {:?}", p.name(), p.version(), name);
let packs = repo.find_with_version(&name, &constr);
- trace!("Found: {:?}", packs);
+ trace!("Found in repo: {:?}", packs);
- if mappings.keys().any(|p| packs.iter().any(|pk| pk.name() == p.name() && pk.version() == p.version())) {
- return Err(anyhow!(
- "Duplicate version of some package in {:?} found",
- packs
- ));
+ // If we didn't check that dependency already
+ if !mappings.keys().any(|p| packs.iter().any(|pk| pk.name() == p.name() && pk.version() == p.version())) {
+ // recurse
+ packs.into_iter()
+ .try_for_each(|p| {
+ progress.tick();
+
+ let idx = dag.add_node(p);
+ mappings.insert(p, idx);
+
+ trace!("Recursing for: {:?}", p);
+ add_sub_packages(repo, mappings, dag, p, progress)
+ })
+ } else {
+ Ok(())
}
- trace!("All dependecies available...");
-
- packs.into_iter()
- .map(|p| {
- progress.tick();
- trace!("Following dependecy: {:?}", p);
-
- let idx = dag.add_node(p);
- mappings.insert(p, idx);
- add_sub_packages(repo, mappings, dag, p, progress)
- })
- .collect()
})
.collect::<Result<()>>()
}