pythonCatchConflictsHook: cleanup due to visiting each path once

Now that we only visit each path once, a few things can be simplified.
We no longer have to keep a list of different dependency chains leading
to a package, since only one chain will ever be found. Also, the already
visited check also takes care of cycles, so the other cycle check can be
removed.

Changed files
+7 -13
pkgs
development
interpreters
python
catch_conflicts
+7 -13
pkgs/development/interpreters/python/catch_conflicts/catch_conflicts.py
···
import os
from typing import Dict, List, Set, Tuple
do_abort: bool = False
-
packages: Dict[str, Dict[str, List[Dict[str, List[str]]]]] = collections.defaultdict(list)
+
packages: Dict[str, Dict[str, Dict[str, List[str]]]] = collections.defaultdict(dict)
found_paths: Set[Path] = set()
out_path: Path = Path(os.getenv("out"))
version: Tuple[int, int] = sys.version_info
···
# inserts an entry into 'packages'
def add_entry(name: str, version: str, store_path: str, parents: List[str]) -> None:
-
if name not in packages:
-
packages[name] = {}
-
if store_path not in packages[name]:
-
packages[name][store_path] = []
-
packages[name][store_path].append(dict(
+
packages[name][store_path] = dict(
version=version,
parents=parents,
-
))
+
)
# transitively discover python dependencies and store them in 'packages'
···
with open(propagated_build_inputs, "r") as f:
build_inputs: List[str] = f.read().strip().split(" ")
for build_input in build_inputs:
-
if build_input not in parents:
-
find_packages(Path(build_input), site_packages_path, parents + [build_input])
+
find_packages(Path(build_input), site_packages_path, parents + [build_input])
find_packages(out_path, site_packages_path, [f"this derivation: {out_path}"])
···
if len(store_paths) > 1:
do_abort = True
print("Found duplicated packages in closure for dependency '{}': ".format(name))
-
for store_path, candidates in store_paths.items():
-
for candidate in candidates:
-
print(f" {name} {candidate['version']} ({store_path})")
-
print(describe_parents(candidate['parents']))
+
for store_path, candidate in store_paths.items():
+
print(f" {name} {candidate['version']} ({store_path})")
+
print(describe_parents(candidate['parents']))
# fail if duplicates were found
if do_abort: