mirror of
ssh://git.janware.com/janware/proj/jw-pkg
synced 2026-04-25 09:35:54 +02:00
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 <jan@janware.com>
This commit is contained in:
parent
0be02c7154
commit
e39047e0dd
1 changed files with 35 additions and 63 deletions
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue