From 52458bd31442ac27f4d8a5d4ad636d26be66179d Mon Sep 17 00:00:00 2001 From: InsanePrawn Date: Sun, 17 Oct 2021 03:19:44 +0200 Subject: [PATCH] manage (download, pull) pkgbuilds.git, move it inside .cache. add git() convenience wrapper --- config.py | 8 ++++++-- packages.py | 44 ++++++++++++++++++++++++++++++++++++++++---- utils.py | 4 ++++ wrapper.py | 2 +- 4 files changed, 51 insertions(+), 7 deletions(-) diff --git a/config.py b/config.py index 86554e6..d922416 100644 --- a/config.py +++ b/config.py @@ -32,13 +32,17 @@ CONFIG_DEFAULTS = { 'crossdirect': True, 'threads': 0, }, + 'pkgbuilds': { + 'git_repo': 'https://gitlab.com/kupfer/packages/pkgbuilds.git', + 'git_branch': 'dev', + }, 'paths': { 'cache_dir': CACHE_DIR, 'chroots': os.path.join('%cache_dir%', 'chroots'), 'pacman': os.path.join('%cache_dir%', 'pacman'), - 'jumpdrive': os.path.join('%cache_dir%', 'jumpdrive'), 'packages': os.path.join('%cache_dir%', 'packages'), - 'pkgbuilds': os.path.abspath(os.getcwd()), + 'pkgbuilds': os.path.join('%cache_dir%', 'pkgbuilds'), + 'jumpdrive': os.path.join('%cache_dir%', 'jumpdrive'), }, 'profiles': { 'current': 'default', diff --git a/packages.py b/packages.py index 77f433e..4ad4718 100644 --- a/packages.py +++ b/packages.py @@ -12,7 +12,7 @@ from config import config from chroot import create_chroot, run_chroot_cmd, try_install_packages, mount_crossdirect, write_cross_makepkg_conf, mount_packages, mount_pacman_cache from distro import get_kupfer_local from wrapper import enforce_wrap -from utils import mount, umount +from utils import mount, umount, git from binfmt import register as binfmt_register makepkg_env = os.environ.copy() | { @@ -99,6 +99,36 @@ class Package: return f'package({self.name},{repr(self.names)})' +def clone_pkbuilds(pkgbuilds_dir: str, repo_url: str, branch: str, interactive=False): + git_dir = os.path.join(pkgbuilds_dir, '.git') + if not os.path.exists(git_dir): + logging.info('Cloning branch {branch} from {repo}') + result = git(['clone', '-b', branch, repo_url, pkgbuilds_dir]) + if result.returncode != 0: + raise Exception('Error cloning pkgbuilds') + else: + result = git(['--git-dir', git_dir, 'branch', '--show-current'], capture_output=True) + current_branch = result.stdout.decode().strip() + if current_branch != branch: + logging.warning(f'pkgbuilds repository is on the wrong branch: {current_branch}, requested: {branch}') + if interactive and click.confirm('Would you like to switch branches?', default=False): + result = git(['switch', branch], dir=pkgbuilds_dir) + if result.returncode != 0: + raise Exception('failed switching branches') + if interactive: + if click.confirm('Would you like to try updating the PKGBUILDs repo?'): + result = git(['pull'], pkgbuilds_dir) + if result.returncode != 0: + raise Exception('failed to update pkgbuilds') + + +def init_pkgbuilds(interactive=False): + pkgbuilds_dir = config.get_path('pkgbuilds') + repo_url = config.file['pkgbuilds']['git_repo'] + branch = config.file['pkgbuilds']['git_branch'] + clone_pkbuilds(pkgbuilds_dir, repo_url, branch, interactive=interactive) + + def init_prebuilts(arch: str, dir: str = None): """Ensure that all `constants.REPOSITORIES` inside `dir` exist""" prebuilts_dir = dir if dir else config.get_package_dir(arch) @@ -127,7 +157,7 @@ def discover_packages(dir: str = None) -> dict[str, Package]: dir = dir if dir else config.get_path('pkgbuilds') packages = {} paths = [] - + init_pkgbuilds(interactive=False) for repo in REPOSITORIES: for _dir in os.listdir(os.path.join(dir, repo)): paths.append(os.path.join(repo, _dir)) @@ -569,6 +599,13 @@ def cmd_packages(): pass +@cmd_packages.command(name='update') +@click.option('--non-interactive', is_flag=True) +def cmd_update(non_interactive: bool = False): + enforce_wrap() + init_pkgbuilds(interactive=not non_interactive) + + @cmd_packages.command(name='build') @click.option('--force', is_flag=True, default=False) @click.option('--arch', default=None) @@ -608,8 +645,7 @@ def cmd_build(paths: list[str], force=False, arch=None): @cmd_packages.command(name='clean') def cmd_clean(): enforce_wrap() - result = subprocess.run([ - 'git', + result = git([ 'clean', '-dffX', ] + REPOSITORIES) diff --git a/utils.py b/utils.py index 0755208..303bf70 100644 --- a/utils.py +++ b/utils.py @@ -41,3 +41,7 @@ def mount(src: str, dest: str, options=['bind'], fs_type=None) -> subprocess.Com if result.returncode == 0: atexit.register(umount, dest) return result + + +def git(cmd: list[str], dir='.', capture_output=False) -> subprocess.CompletedProcess: + return subprocess.run(['git'] + cmd, cwd=dir, capture_output=capture_output) diff --git a/wrapper.py b/wrapper.py index 777a41b..51df81a 100644 --- a/wrapper.py +++ b/wrapper.py @@ -13,6 +13,7 @@ DOCKER_PATHS = { 'jumpdrive': '/var/cache/jumpdrive', 'pacman': '/var/cache/pacman', 'packages': '/prebuilts', + 'pkgbuilds': '/src', } @@ -103,7 +104,6 @@ def wrap_docker(): dump_config_file(file_path=wrapped_config, config=(config.file | {'paths': DOCKER_PATHS})) volumes = { '/dev': '/dev', - os.getcwd(): '/src', wrapped_config: '/root/.config/kupfer/kupferbootstrap.toml', } volumes |= dict({config.get_path(vol_name): vol_dest for vol_name, vol_dest in DOCKER_PATHS.items()})