diff options
author | Matthias Beyer <mail@beyermatthias.de> | 2021-02-05 08:54:18 +0100 |
---|---|---|
committer | Matthias Beyer <mail@beyermatthias.de> | 2021-02-06 11:54:23 +0100 |
commit | 284f46561253e977691916b1bad6568d7033fc48 (patch) | |
tree | ac8db9f5b0642e36456069291b85b7658f5904f4 /src/package | |
parent | efe07be74cf1ae704cb73b0f20c28b33aa46c217 (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.rs | 36 |
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<()>>() } |