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 <jan@janware.com>
This commit is contained in:
Jan Lindemann 2026-03-15 10:00:56 +01:00
commit 509fe1c5e0

View file

@ -10,18 +10,19 @@ from ..CmdProjects import CmdProjects
class BaseCmdPkgRelations(Cmd): class BaseCmdPkgRelations(Cmd):
def pkg_relations(self, rel_type, args): def pkg_relations(self, rel_type, args):
version_pattern=re.compile("[0-9-.]*")
if args.subsections is None: if args.subsections is None:
subsecs = self.app.os_cascade() subsecs = self.app.os_cascade()
subsecs.append('jw') subsecs.append('jw')
else: else:
subsecs = args.subsections.split(',') subsecs = args.subsections.split(',')
log(DEBUG, 'flavour = ', args.flavour, ', subsecs = ', ' '.join(subsecs))
ignore = args.ignore.split(',') ignore = args.ignore.split(',')
log(DEBUG, "ignore = ", ignore)
r = []
flavours = args.flavour.split(',') 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 flavour in flavours:
for s in subsecs: for s in subsecs:
section = 'pkg.' + rel_type + '.' + s section = 'pkg.' + rel_type + '.' + s
@ -68,10 +69,33 @@ class BaseCmdPkgRelations(Cmd):
pass pass
else: else:
raise Exception("Unknown version specifier in " + spec) raise Exception("Unknown version specifier in " + spec)
cleaned_dep = ' '.join(dep) if not args.expand_semver_revision_range:
if not cleaned_dep in r: expanded_deps = [dep]
log(DEBUG, "appending", cleaned_dep) else:
r.append(cleaned_dep) 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) return args.delimiter.join(r)
def print_pkg_relations(self, rel_type, args_): def print_pkg_relations(self, rel_type, args_):
@ -93,6 +117,8 @@ class BaseCmdPkgRelations(Cmd):
default=False, help='Don\'t report version information') default=False, help='Don\'t report version information')
parser.add_argument('--dont-strip-revision', action='store_true', parser.add_argument('--dont-strip-revision', action='store_true',
default=False, help='Always treat VERSION macro as VERSION-REVISION') 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', parser.add_argument('--recursive', action='store_true',
default=False, help='Find dependencies recursively') default=False, help='Find dependencies recursively')
parser.add_argument('--dont-expand-version-macros', action='store_true', parser.add_argument('--dont-expand-version-macros', action='store_true',