jw-pkg/src/python/jw/pkg/cmds/projects/CmdGetAuthInfo.py
Jan Lindemann 565946643b jw.pkg.*.run_xxx(): Return exit status
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>
2026-03-03 11:23:30 +01:00

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}"')