From 509fe1c5e066367c1b107cc71947dea2e7df85ce Mon Sep 17 00:00:00 2001 From: Jan Lindemann Date: Sun, 15 Mar 2026 10:00:56 +0100 Subject: [PATCH] cmds.projects.BaseCmdPkgRelations: --expand-semver-revision-range Add support for --expand-semver-revision-range to cmds.projects.BaseCmdPkgRelations.pkg_relations(). The options turns a dependency in projects.conf pkg.requires.os.devel = jw-pkg-devel = VERSION into jw-pkg-devel >= 1.2.3, jw-pkg-devel < 1.2.4 Note that this will break as soon as a real range is specified in projects.conf. To be fixed later, this commit is at least less breakage than before. Signed-off-by: Jan Lindemann --- .../pkg/cmds/projects/BaseCmdPkgRelations.py | 44 +++++++++++++++---- 1 file changed, 35 insertions(+), 9 deletions(-) diff --git a/src/python/jw/pkg/cmds/projects/BaseCmdPkgRelations.py b/src/python/jw/pkg/cmds/projects/BaseCmdPkgRelations.py index 581a9b69..1bee712f 100644 --- a/src/python/jw/pkg/cmds/projects/BaseCmdPkgRelations.py +++ b/src/python/jw/pkg/cmds/projects/BaseCmdPkgRelations.py @@ -10,18 +10,19 @@ from ..CmdProjects import CmdProjects class BaseCmdPkgRelations(Cmd): def pkg_relations(self, rel_type, args): - version_pattern=re.compile("[0-9-.]*") + if args.subsections is None: subsecs = self.app.os_cascade() subsecs.append('jw') else: subsecs = args.subsections.split(',') - log(DEBUG, 'flavour = ', args.flavour, ', subsecs = ', ' '.join(subsecs)) ignore = args.ignore.split(',') - log(DEBUG, "ignore = ", ignore) - - r = [] flavours = args.flavour.split(',') + + log(DEBUG, f'flavour="{args.flavour}", subsecs="{", ".join(subsecs)}", "ignore="{args.ignore}"') + + version_pattern = re.compile("[0-9-.]*") + r: list[str] = [] for flavour in flavours: for s in subsecs: section = 'pkg.' + rel_type + '.' + s @@ -68,10 +69,33 @@ class BaseCmdPkgRelations(Cmd): pass else: raise Exception("Unknown version specifier in " + spec) - cleaned_dep = ' '.join(dep) - if not cleaned_dep in r: - log(DEBUG, "appending", cleaned_dep) - r.append(cleaned_dep) + if not args.expand_semver_revision_range: + expanded_deps = [dep] + else: + expanded_deps = [] + if args.expand_semver_revision_range and len(dep) == 3: + semver = re.split(r'[.-]', version) + if len(semver) != 4: + expanded_deps = [dep] + else: + release = int(semver[2]) + major_minor = f'{semver[0]}.{semver[1]}' + match dep[1]: + case '>' | '>=': + expanded_deps.append([dep[0], dep[1], dep[2]]) + expanded_deps.append([dep[0], '<', f'{major_minor}.{release + 1}']) + case '<' | '<=': + expanded_deps.append([dep[0], dep[1], dep[2]]) + case '=': + expanded_deps.append([dep[0], '>=', f'{major_minor}.{release}']) + expanded_deps.append([dep[0], '<', f'{major_minor}.{release + 1}']) + case _: + raise NotImplementedError(f'Expanding SemVer range "{dep[0]} {dep[1]} {dep[3]}" is not yet implemented') + for expanded_dep in expanded_deps: + dep_str = ' '.join(expanded_dep) + if not dep_str in r: + log(DEBUG, f'Appending dependency "{dep_str}"') + r.append(dep_str) return args.delimiter.join(r) def print_pkg_relations(self, rel_type, args_): @@ -93,6 +117,8 @@ class BaseCmdPkgRelations(Cmd): default=False, help='Don\'t report version information') parser.add_argument('--dont-strip-revision', action='store_true', default=False, help='Always treat VERSION macro as VERSION-REVISION') + parser.add_argument('--expand-semver-revision-range', action='store_true', + default=False, help='Always treat =VERSION macro as >= VERSION-0 and < (VERSION+1)-0') parser.add_argument('--recursive', action='store_true', default=False, help='Find dependencies recursively') parser.add_argument('--dont-expand-version-macros', action='store_true',