mirror of
ssh://git.janware.com/janware/proj/jw-pkg
synced 2026-04-28 13:55:24 +02:00
Most run_xxx() return stdout and stderr. There's no way, really, for the caller to get hold of the exit code of the spawned executable. It can pass throw=true, catch, and assume a non-zero exit status. But that's not semantically clean, since the spawned function can well be a test function which is expected to return a non-zero status code, and the caller might be interested in what code that was, exactly. The clearest way to solve this is to return the exit code as well. This commit does that. Signed-off-by: Jan Lindemann <jan@janware.com>
63 lines
2.6 KiB
Python
63 lines
2.6 KiB
Python
# -*- coding: utf-8 -*-
|
|
|
|
import re, os
|
|
from argparse import Namespace, ArgumentParser
|
|
from urllib.parse import urlparse
|
|
|
|
from ...lib.log import *
|
|
from ...lib.util import run_cmd
|
|
from ..Cmd import Cmd
|
|
from ..CmdProjects import CmdProjects
|
|
|
|
class CmdGetAuthInfo(Cmd): # export
|
|
|
|
def __init__(self, parent: CmdProjects) -> None:
|
|
super().__init__(parent, 'get-auth-info', help='Try to retrieve authentication information from the source tree')
|
|
|
|
def add_arguments(self, parser: ArgumentParser) -> None:
|
|
super().add_arguments(parser)
|
|
parser.add_argument('--only-values', default=False, action='store_true',
|
|
help='Don\'t prefix values by "<field-name>="')
|
|
parser.add_argument('--username', default=False, action='store_true',
|
|
help='Show user name')
|
|
parser.add_argument('--password', default=False, action='store_true',
|
|
help='Show password')
|
|
parser.add_argument('--remote-owner-base', default=False, action='store_true',
|
|
help='Show remote base URL for owner jw-pkg was cloned from')
|
|
parser.add_argument('--remote-base', default=False, action='store_true',
|
|
help='Show remote base URL')
|
|
|
|
async def _run(self, args: Namespace) -> None:
|
|
keys = ['username', 'password']
|
|
|
|
# --- Milk jw-pkg repo
|
|
jw_pkg_dir = self.app.find_dir('jw-pkg', pretty=False)
|
|
if not os.path.isdir(jw_pkg_dir + '/.git'):
|
|
log(DEBUG, f'jw-pkg directory is not a Git repo: {jw_pkg_dir}')
|
|
return
|
|
remotes, stderr, status = await run_cmd(['git', '-C', jw_pkg_dir, 'remote', '-v'])
|
|
result: dict[str, str] = {}
|
|
for line in remotes.splitlines():
|
|
name, url, typ = re.split(r'\s+', line)
|
|
if name == 'origin' and typ in ['(pull)', '(fetch)']: # TODO: Use other remotes, too?
|
|
parsed = urlparse(url)
|
|
for key in keys:
|
|
result[key] = getattr(parsed, key)
|
|
base = parsed.geturl()
|
|
base = re.sub(r'/jw-pkg', '', base)
|
|
base = re.sub(r'/proj$', '', base)
|
|
base = re.sub(r'/proj$', '', base)
|
|
result['remote_owner_base'] = base
|
|
result['remote_base'] = os.path.dirname(base)
|
|
break
|
|
|
|
# --- Print results
|
|
for key, val in result.items():
|
|
if getattr(args, key, None) != True:
|
|
continue
|
|
if val is None:
|
|
continue
|
|
if args.only_values:
|
|
print(val)
|
|
continue
|
|
print(f'{key}="{val}"')
|