From e39047e0dd2ee6bab7d771db27038c8aa8216f36 Mon Sep 17 00:00:00 2001 From: Jan Lindemann Date: Wed, 21 Jan 2026 09:56:00 +0100 Subject: [PATCH] jw.pkg.App: Derive from jw.pkg.lib.App Derive jw.pkg.App from jw.pkg.lib.App. App.run() dissolves as follows: - Its sub-command invocation logic is left to the base class - parser.add_arguments() are moved into self._add_arguments() - So is handling of early-parsed arguments - async def _run() is reimplemented to set some member variables Signed-off-by: Jan Lindemann --- src/python/jw/pkg/App.py | 98 ++++++++++++++-------------------------- 1 file changed, 35 insertions(+), 63 deletions(-) diff --git a/src/python/jw/pkg/App.py b/src/python/jw/pkg/App.py index 9cb3143d..26ee7c42 100644 --- a/src/python/jw/pkg/App.py +++ b/src/python/jw/pkg/App.py @@ -5,6 +5,9 @@ import os, sys, argparse, pwd, re +from .lib.App import App as Base +from .cmds.build import * + # meaning of pkg.requires.xxx variables # build: needs to be built and installed before this can be built # devel: needs to be installed before this-devel can be installed, i.e. before _other_ packages can be built against this @@ -44,9 +47,10 @@ class ResultCache(object): # ----------------------------------------------------------------- class App -class App(object): +class App(Base): def __init__(self): + super().__init__("jw-pkg swiss army knife", modules=["jw.pkg.cmds.build"]) self.global_args = [] self.opt_os = None @@ -58,7 +62,36 @@ class App(object): self.opt_debug = False self.res_cache = ResultCache() self.topdir = None - self.projs_root = os.path.expanduser("~") + '/local/src/jw.dev/proj' + + # -- defaults + self.projs_root = pwd.getpwuid(os.getuid()).pw_dir + "/local/src/jw.dev/proj" + + def _add_arguments(self, parser): + super()._add_arguments(parser) + parser.add_argument('-d', '--debug', action='store_true', + default=False, help='Output debug information to stderr') + parser.add_argument('-t', '--topdir', nargs=1, default = [], help='Project Path') + parser.add_argument('-p', '--prefix', nargs=1, default = [ self.projs_root ], + help='Parent directory of project source directories') + parser.add_argument('-O', '--os', default = None, help='Target operating system') + + async def _run(self, args: argparse.Namespace) -> None: + + self.opt_debug = args.debug + if len(args.os): + self.opt_os = args.os[0] + + if args.prefix is not None: + self.projs_root = args.prefix + self.debug("projs_root = ", self.projs_root) + self.topdir = args.topdir + + if self.topdir is not None: + self.top_name = self.res_cache.run(self.read_value, [self.topdir + '/make/project.conf', 'build', 'name']) + if not self.top_name: + self.top_name = re.sub('-[0-9.-]*$', '', os.path.basename(os.path.realpath(self.topdir))) + + return await super()._run(args) def debug(self, *objs): if self.opt_debug: @@ -414,64 +447,3 @@ class App(object): return last unvisited.remove(module) temp.remove(module) - - # -------------------------------------------------------------------- here we go - def run(self): - - skip = 0 - for a in sys.argv[1::]: - self.global_args.append(a) - if a in [ '-p', '--prefix', '-t', '--topdir', '-O', '--os' ]: - skip = 1 - continue - if skip > 0: - skip = skip -1 - continue - if a[0] != '-': - break - - # -- defaults - self.projs_root = pwd.getpwuid(os.getuid()).pw_dir + "/local/src/jw.dev/proj" - - parser = argparse.ArgumentParser(description='Project metadata evaluation') - parser.add_argument('-d', '--debug', action='store_true', - default=False, help='Output debug information to stderr') - parser.add_argument('-t', '--topdir', nargs=1, default = [], help='Project Path') - parser.add_argument('-p', '--prefix', nargs=1, default = [ self.projs_root ], - help='Parent directory of project source directories') - parser.add_argument('-O', '--os', nargs=1, default = [], help='Target operating system') - parser.add_argument('cmd', default='', help=f'Command, run "{sys.argv[0]} commands" for a list of supported commands') - parser.add_argument('arg', nargs='*', help='Command arguments') - args = parser.parse_args(self.global_args) - - self.opt_debug = args.debug - if len(args.os): - self.opt_os = args.os[0] - - self.debug("----------------------------------------- running ", ' '.join(sys.argv)) - - self.projs_root = args.prefix[0] - self.debug("projs_root = ", self.projs_root) - if len(args.topdir): - self.topdir = args.topdir[0] - - if self.topdir: - self.top_name = self.res_cache.run(self.read_value, [self.topdir + '/make/project.conf', 'build', 'name']) - if not self.top_name: - self.top_name = re.sub('-[0-9.-]*$', '', os.path.basename(os.path.realpath(self.topdir))) - - import importlib - cmd_name = args.cmd.replace('-', '_') - cc_cmd_name = 'Cmd' + ''.join(x.capitalize() for x in cmd_name.lower().split("_")) - module = importlib.import_module('jw.pkg.build.cmds.' + cc_cmd_name) - cmd = getattr(module, cc_cmd_name)() - cmd.app = self - subparser = argparse.ArgumentParser(description=cmd_name) - cmd.add_arguments(subparser) - args = subparser.parse_args(sys.argv[(len(self.global_args) + 1)::]) - try: - return cmd.run(args) - except Exception as e: - self.err('Failed to run >{}<: {}'.format(' '.join(sys.argv), e)) - raise - sys.exit(1)