diff --git a/src/python/jw/pkg/cmds/projects/lib/pkg_relations.py b/src/python/jw/pkg/cmds/projects/lib/pkg_relations.py index 8156ad7e..4a42b070 100644 --- a/src/python/jw/pkg/cmds/projects/lib/pkg_relations.py +++ b/src/python/jw/pkg/cmds/projects/lib/pkg_relations.py @@ -52,47 +52,52 @@ def pkg_relations( ret: list[str] = [] for flavour in flavours: # build / release / run / devel - cur_pkgs = seed_pkgs.copy() - visited_pkgs: set[str] = set() - while len(cur_pkgs): - cur_pkg = cur_pkgs.pop(0) - if cur_pkg in visited_pkgs or cur_pkg in ignore: - continue + closure: list[str] = [] + visited: set[str] = set() + for seed in seed_pkgs: + app.walk_project_deps( + closure, + visited, + seed, + ['pkg.' + rel_type + '.jw'], + flavour, + add_self = True, + scope = Scope.Subtree, + names_only = True, + check_installed = False, + exclude = ignore, + recurse = recursive, + ) + for cur_pkg in closure: for subsec in subsections: section = 'pkg.' + rel_type + '.' + subsec - visited_pkgs.add(cur_pkg) - deps_spec = app.get_value(cur_pkg, section, flavour) - if not deps_spec: - continue - for dep in Dependency.parse_deps_spec( - deps_spec, - lookup_version = app.get_version, - dependent_package = cur_pkg, - ): - dep_name = dep.base_name - if dep_name in ignore or dep.full_name in ignore: - continue - if subsec == 'jw': - if (recursive and dep_name not in visited_pkgs - and dep_name not in cur_pkgs): - cur_pkgs.append(dep_name) - if hide_jw_pkg and dep_name == 'jw-pkg': + for deps_spec in app.read_dep_edges(cur_pkg, [section], flavour): + for dep in Dependency.parse_deps_spec( + deps_spec, + lookup_version = app.get_version, + dependent_package = cur_pkg, + ): + dep_name = dep.base_name + if dep_name in ignore or dep.full_name in ignore: continue - expand_version_macros = subsec == 'jw' - if dont_expand_version_macros and dep_name in cur_pkgs: - expand_version_macros = False - if hide_self and dep_name in seed_pkgs: - continue - dep_str = dep.constraint_str( - untemplated = expand_version_macros, - include_revision = dont_strip_revision, - as_range = expand_semver_revision_range, - no_subpackages = no_subpackages, - syntax = syntax, - quote = '"' if quote else None, - ) - if dep_str in ret: - continue - log(DEBUG, f'Appending dependency >{dep_str}<') - ret.append(dep_str) + if subsec == 'jw': + if hide_jw_pkg and dep_name == 'jw-pkg': + continue + expand_version_macros = subsec == 'jw' + if dont_expand_version_macros and dep_name in visited: + expand_version_macros = False + if hide_self and dep_name in seed_pkgs: + continue + dep_str = dep.constraint_str( + untemplated = expand_version_macros, + include_revision = dont_strip_revision, + as_range = expand_semver_revision_range, + no_subpackages = no_subpackages, + syntax = syntax, + quote = '"' if quote else None, + ) + if dep_str in ret: + continue + log(DEBUG, f'Appending dependency >{dep_str}<') + ret.append(dep_str) return ret