From d6439568464c3b74b5bf618b5e91a77095f54026 Mon Sep 17 00:00:00 2001 From: Jan Lindemann Date: Sun, 15 Mar 2026 12:56:03 +0100 Subject: [PATCH] cmds.projects.BaseCmdPkgRelations: Add pkg_relations_list() Add a function pkg_relations_list(), doing pretty much the same as pkg_relations(), but taking individual arguments instead of an argparse.Namespace args argument, in order to provide the functionality to derived classes. Signed-off-by: Jan Lindemann --- .../pkg/cmds/projects/BaseCmdPkgRelations.py | 82 +++++++++++++------ 1 file changed, 59 insertions(+), 23 deletions(-) diff --git a/src/python/jw/pkg/cmds/projects/BaseCmdPkgRelations.py b/src/python/jw/pkg/cmds/projects/BaseCmdPkgRelations.py index bd4a4984..fae1246a 100644 --- a/src/python/jw/pkg/cmds/projects/BaseCmdPkgRelations.py +++ b/src/python/jw/pkg/cmds/projects/BaseCmdPkgRelations.py @@ -2,6 +2,7 @@ import re from argparse import Namespace, ArgumentParser +from enum import Enum, auto from ...lib.log import * from ..Cmd import Cmd @@ -9,21 +10,38 @@ from ..CmdProjects import CmdProjects class BaseCmdPkgRelations(Cmd): - def pkg_relations(self, rel_type: str, args: Namespace) -> list[str]: + class Syntax(Enum): + semver = auto() + debian = auto() + names_only = auto() - if args.subsections is None: + def pkg_relations_list( + self, + rel_type: str, + flavours: list[str], + modules: list[str], + subsections: list[str]|None=None, + delimiter: str=' ', + no_subpackages: bool=False, + dont_strip_revision: bool=False, + expand_semver_revision_range: bool=False, + syntax: Syntax=Syntax.semver, + recursive: bool=False, + dont_expand_version_macros: bool=False, + ignore: set[str] = set(), + ) -> list[str]: + + if subsections is None: subsecs = self.app.os_cascade() subsecs.append('jw') else: - subsecs = args.subsections.split(',') - ignore = args.ignore.split(',') - flavours = args.flavour.split(',') + subsecs = subsections - expand_semver_revision_range = args.expand_semver_revision_range - if args.syntax == 'debian': + expand_semver_revision_range = expand_semver_revision_range + if syntax == self.Syntax.debian: expand_semver_revision_range = True - log(DEBUG, f'flavour="{args.flavour}", subsecs="{", ".join(subsecs)}", "ignore="{args.ignore}"') + log(DEBUG, f'flavours="{", ".join(flavours)}", subsecs="{", ".join(subsecs)}", "ignore="{", ".join(ignore)}"') version_pattern = re.compile("[0-9-.]*") r: list[str] = [] @@ -31,9 +49,9 @@ class BaseCmdPkgRelations(Cmd): for s in subsecs: section = 'pkg.' + rel_type + '.' + s visited = set() - modules = args.module.copy() - while len(modules): - m = modules.pop(0) + sec_modules = modules.copy() + while len(sec_modules): + m = sec_modules.pop(0) if m in visited or m in ignore: continue visited.add(m) @@ -43,26 +61,26 @@ class BaseCmdPkgRelations(Cmd): deps = value.split(',') for spec in deps: dep = re.split('([=><]+)', spec) - if args.syntax == 'names-only': + if syntax == self.Syntax.names_only: dep = dep[:1] dep = list(map(str.strip, dep)) dep_name = re.sub('-dev$|-devel$|-run$', '', dep[0]) if dep_name in ignore or dep[0] in ignore: continue - if args.no_subpackages: + if no_subpackages: dep[0] = dep_name for i, item in enumerate(dep): dep[i] = item.strip() if s == 'jw': - if args.recursive and not dep_name in visited and not dep_name in modules: - modules.append(dep_name) + if recursive and not dep_name in visited and not dep_name in sec_modules: + sec_modules.append(dep_name) if len(dep) == 3: - if args.dont_expand_version_macros and dep_name in args.module: + if dont_expand_version_macros and dep_name in sec_modules: version = dep[2] else: version = self.app.get_value(dep_name, 'version', '') if dep[2] == 'VERSION': - if args.dont_strip_revision: + if dont_strip_revision: dep[2] = version else: dep[2] = version.split('-')[0] @@ -96,23 +114,41 @@ class BaseCmdPkgRelations(Cmd): case _: raise NotImplementedError(f'Expanding SemVer range "{dep[0]} {dep[1]} {dep[3]}" is not yet implemented') for expanded_dep in expanded_deps: - match args.syntax: - case 'semver': + match syntax: + case self.Syntax.semver: pass - case 'debian': + case self.Syntax.debian: match expanded_dep[1]: case '<': expanded_dep[1] = '<<' case '>': expanded_dep[1] = '>>' case '_': - raise NotImplementedError(f'Unknown dependency syntax "{args.syntax}" for dependency "{dep[0]} {dep[1]} {dep[3]}"') + raise NotImplementedError(f'Unknown dependency syntax "{syntax}" for dependency "{dep[0]} {dep[1]} {dep[3]}"') dep_str = ' '.join(expanded_dep) if not dep_str in r: log(DEBUG, f'Appending dependency "{dep_str}"') r.append(dep_str) return r + def pkg_relations(self, rel_type: str, args: Namespace) -> str: + + return args.delimiter.join( + self.pkg_relations_list( + rel_type=rel_type, + flavours = args.flavours.split(','), + modules = args.modules, + subsections = None if args.subsections is None else args.subsections.split(','), + no_subpackages = args.no_subpackages, + dont_strip_revision = args.dont_strip_revision, + expand_semver_revision_range = args.expand_semver_revision_range, + syntax = self.Syntax[args.syntax.replace('-', '_')], + recursive = args.recursive, + dont_expand_version_macros = args.dont_expand_version_macros, + ignore = set(args.ignore.split(',')), + ) + ) + def print_pkg_relations(self, rel_type: str, args: Namespace) -> None: print(self.pkg_relations(rel_type, args)) @@ -124,8 +160,8 @@ class BaseCmdPkgRelations(Cmd): super().add_arguments(parser) parser.add_argument('-S', '--subsections', nargs='?', default=None, help='Subsections to consider, comma-separated') parser.add_argument('-d', '--delimiter', nargs='?', default=', ', help='Output words delimiter') - parser.add_argument('flavour', help='Flavour') - parser.add_argument('module', nargs='*', help='Modules') + parser.add_argument('flavours', help='Dependency flavours (run, build, devel, release)') + parser.add_argument('modules', nargs='*', help='Modules') parser.add_argument('-p', '--no-subpackages', action='store_true', default=False, help='Cut -run and -devel from package names') parser.add_argument('--dont-strip-revision', action='store_true',