from __future__ import annotations import os import re from ...lib.log import DEBUG, log from ...lib.Uri import Uri from .Cmd import Cmd, Parent from typing import TYPE_CHECKING if TYPE_CHECKING: from argparse import ArgumentParser, Namespace class CmdGetAuthInfo(Cmd): # export def __init__(self, parent: Parent) -> 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 "="', ) 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 git_result = await self.app.exec_context.run( ['git', '-C', jw_pkg_dir, 'remote', '-v'] ) result: dict[str, str] = {} for line in git_result.stdout_str.splitlines(): name, url, typ = re.split(r'\s+', line) if name == 'origin' and typ in [ '(pull)', '(fetch)', ]: # TODO: Use other remotes, too? parsed = Uri(url) for key in keys: result[key] = getattr(parsed, key) base = parsed.to_string 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 not getattr(args, key, None): continue if val is None: continue if args.only_values: print(val) continue print(f'{key}="{val}"')