mirror of
ssh://git.janware.com/janware/proj/jw-pkg
synced 2026-04-25 17:45:55 +02:00
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 <jan@janware.com>
This commit is contained in:
parent
5f81f8d4da
commit
d643956846
1 changed files with 59 additions and 23 deletions
|
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
import re
|
import re
|
||||||
from argparse import Namespace, ArgumentParser
|
from argparse import Namespace, ArgumentParser
|
||||||
|
from enum import Enum, auto
|
||||||
|
|
||||||
from ...lib.log import *
|
from ...lib.log import *
|
||||||
from ..Cmd import Cmd
|
from ..Cmd import Cmd
|
||||||
|
|
@ -9,21 +10,38 @@ from ..CmdProjects import CmdProjects
|
||||||
|
|
||||||
class BaseCmdPkgRelations(Cmd):
|
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 = self.app.os_cascade()
|
||||||
subsecs.append('jw')
|
subsecs.append('jw')
|
||||||
else:
|
else:
|
||||||
subsecs = args.subsections.split(',')
|
subsecs = subsections
|
||||||
ignore = args.ignore.split(',')
|
|
||||||
flavours = args.flavour.split(',')
|
|
||||||
|
|
||||||
expand_semver_revision_range = args.expand_semver_revision_range
|
expand_semver_revision_range = expand_semver_revision_range
|
||||||
if args.syntax == 'debian':
|
if syntax == self.Syntax.debian:
|
||||||
expand_semver_revision_range = True
|
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-.]*")
|
version_pattern = re.compile("[0-9-.]*")
|
||||||
r: list[str] = []
|
r: list[str] = []
|
||||||
|
|
@ -31,9 +49,9 @@ class BaseCmdPkgRelations(Cmd):
|
||||||
for s in subsecs:
|
for s in subsecs:
|
||||||
section = 'pkg.' + rel_type + '.' + s
|
section = 'pkg.' + rel_type + '.' + s
|
||||||
visited = set()
|
visited = set()
|
||||||
modules = args.module.copy()
|
sec_modules = modules.copy()
|
||||||
while len(modules):
|
while len(sec_modules):
|
||||||
m = modules.pop(0)
|
m = sec_modules.pop(0)
|
||||||
if m in visited or m in ignore:
|
if m in visited or m in ignore:
|
||||||
continue
|
continue
|
||||||
visited.add(m)
|
visited.add(m)
|
||||||
|
|
@ -43,26 +61,26 @@ class BaseCmdPkgRelations(Cmd):
|
||||||
deps = value.split(',')
|
deps = value.split(',')
|
||||||
for spec in deps:
|
for spec in deps:
|
||||||
dep = re.split('([=><]+)', spec)
|
dep = re.split('([=><]+)', spec)
|
||||||
if args.syntax == 'names-only':
|
if syntax == self.Syntax.names_only:
|
||||||
dep = dep[:1]
|
dep = dep[:1]
|
||||||
dep = list(map(str.strip, dep))
|
dep = list(map(str.strip, dep))
|
||||||
dep_name = re.sub('-dev$|-devel$|-run$', '', dep[0])
|
dep_name = re.sub('-dev$|-devel$|-run$', '', dep[0])
|
||||||
if dep_name in ignore or dep[0] in ignore:
|
if dep_name in ignore or dep[0] in ignore:
|
||||||
continue
|
continue
|
||||||
if args.no_subpackages:
|
if no_subpackages:
|
||||||
dep[0] = dep_name
|
dep[0] = dep_name
|
||||||
for i, item in enumerate(dep):
|
for i, item in enumerate(dep):
|
||||||
dep[i] = item.strip()
|
dep[i] = item.strip()
|
||||||
if s == 'jw':
|
if s == 'jw':
|
||||||
if args.recursive and not dep_name in visited and not dep_name in modules:
|
if recursive and not dep_name in visited and not dep_name in sec_modules:
|
||||||
modules.append(dep_name)
|
sec_modules.append(dep_name)
|
||||||
if len(dep) == 3:
|
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]
|
version = dep[2]
|
||||||
else:
|
else:
|
||||||
version = self.app.get_value(dep_name, 'version', '')
|
version = self.app.get_value(dep_name, 'version', '')
|
||||||
if dep[2] == 'VERSION':
|
if dep[2] == 'VERSION':
|
||||||
if args.dont_strip_revision:
|
if dont_strip_revision:
|
||||||
dep[2] = version
|
dep[2] = version
|
||||||
else:
|
else:
|
||||||
dep[2] = version.split('-')[0]
|
dep[2] = version.split('-')[0]
|
||||||
|
|
@ -96,23 +114,41 @@ class BaseCmdPkgRelations(Cmd):
|
||||||
case _:
|
case _:
|
||||||
raise NotImplementedError(f'Expanding SemVer range "{dep[0]} {dep[1]} {dep[3]}" is not yet implemented')
|
raise NotImplementedError(f'Expanding SemVer range "{dep[0]} {dep[1]} {dep[3]}" is not yet implemented')
|
||||||
for expanded_dep in expanded_deps:
|
for expanded_dep in expanded_deps:
|
||||||
match args.syntax:
|
match syntax:
|
||||||
case 'semver':
|
case self.Syntax.semver:
|
||||||
pass
|
pass
|
||||||
case 'debian':
|
case self.Syntax.debian:
|
||||||
match expanded_dep[1]:
|
match expanded_dep[1]:
|
||||||
case '<':
|
case '<':
|
||||||
expanded_dep[1] = '<<'
|
expanded_dep[1] = '<<'
|
||||||
case '>':
|
case '>':
|
||||||
expanded_dep[1] = '>>'
|
expanded_dep[1] = '>>'
|
||||||
case '_':
|
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)
|
dep_str = ' '.join(expanded_dep)
|
||||||
if not dep_str in r:
|
if not dep_str in r:
|
||||||
log(DEBUG, f'Appending dependency "{dep_str}"')
|
log(DEBUG, f'Appending dependency "{dep_str}"')
|
||||||
r.append(dep_str)
|
r.append(dep_str)
|
||||||
return r
|
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:
|
def print_pkg_relations(self, rel_type: str, args: Namespace) -> None:
|
||||||
print(self.pkg_relations(rel_type, args))
|
print(self.pkg_relations(rel_type, args))
|
||||||
|
|
||||||
|
|
@ -124,8 +160,8 @@ class BaseCmdPkgRelations(Cmd):
|
||||||
super().add_arguments(parser)
|
super().add_arguments(parser)
|
||||||
parser.add_argument('-S', '--subsections', nargs='?', default=None, help='Subsections to consider, comma-separated')
|
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('-d', '--delimiter', nargs='?', default=', ', help='Output words delimiter')
|
||||||
parser.add_argument('flavour', help='Flavour')
|
parser.add_argument('flavours', help='Dependency flavours (run, build, devel, release)')
|
||||||
parser.add_argument('module', nargs='*', help='Modules')
|
parser.add_argument('modules', nargs='*', help='Modules')
|
||||||
parser.add_argument('-p', '--no-subpackages', action='store_true',
|
parser.add_argument('-p', '--no-subpackages', action='store_true',
|
||||||
default=False, help='Cut -run and -devel from package names')
|
default=False, help='Cut -run and -devel from package names')
|
||||||
parser.add_argument('--dont-strip-revision', action='store_true',
|
parser.add_argument('--dont-strip-revision', action='store_true',
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue