diff --git a/packages/__init__.py b/packages/__init__.py index 254f972..317a258 100644 --- a/packages/__init__.py +++ b/packages/__init__.py @@ -100,7 +100,14 @@ def init_prebuilts(arch: Arch, dir: str = None): raise Exception(f'Failed to create local repo {repo}') -def discover_packages(parallel: bool = True) -> dict[str, Pkgbuild]: +_pkgbuilds_discovered = dict[str, Pkgbuild]() + + +def discover_packages(parallel: bool = True, lazy: bool = True) -> dict[str, Pkgbuild]: + global _pkgbuilds_discovered + if lazy and _pkgbuilds_discovered: + logging.debug("Reusing cached pkgbuilds repo") + return _pkgbuilds_discovered.copy() pkgbuilds_dir = config.get_path('pkgbuilds') packages: dict[str, Pkgbuild] = {} paths = [] @@ -109,15 +116,15 @@ def discover_packages(parallel: bool = True) -> dict[str, Pkgbuild]: for dir in os.listdir(os.path.join(pkgbuilds_dir, repo)): paths.append(os.path.join(repo, dir)) - native_chroot = setup_build_chroot(config.runtime['arch'], add_kupfer_repos=False) results = [] logging.info("Parsing PKGBUILDs") + logging.debug(f"About to parse pkgbuilds. verbosity: {config.runtime['verbose']}") if parallel: - chunks = (Parallel(n_jobs=multiprocessing.cpu_count() * 4)(delayed(parse_pkgbuild)(path, native_chroot) for path in paths)) + chunks = (Parallel(n_jobs=multiprocessing.cpu_count() * 4)(delayed(parse_pkgbuild)(path, config) for path in paths)) else: - chunks = (parse_pkgbuild(path, native_chroot) for path in paths) + chunks = (parse_pkgbuild(path, config) for path in paths) for pkglist in chunks: results += pkglist @@ -145,6 +152,7 @@ def discover_packages(parallel: bool = True) -> dict[str, Pkgbuild]: logging.debug(f'Removing {dep} from dependencies') package.local_depends.remove(dep) + _pkgbuilds_discovered = packages.copy() return packages diff --git a/packages/pkgbuild.py b/packages/pkgbuild.py index 2410309..abc0dc1 100644 --- a/packages/pkgbuild.py +++ b/packages/pkgbuild.py @@ -1,14 +1,15 @@ from __future__ import annotations -from . import logging import os import subprocess from typing import Optional, Sequence -from chroot import Chroot -from constants import Arch, CHROOT_PATHS, MAKEPKG_CMD +from config import ConfigStateHolder +from exec import run_cmd +from constants import Arch, MAKEPKG_CMD from distro.package import PackageInfo +from logger import logging, setup_logging class Pkgbuild(PackageInfo): @@ -91,8 +92,14 @@ class SubPkgbuild(Pkgbuild): self.pkgrel = pkgbase.pkgrel -def parse_pkgbuild(relative_pkg_dir: str, native_chroot: Chroot) -> Sequence[Pkgbuild]: - filename = os.path.join(native_chroot.get_path(CHROOT_PATHS['pkgbuilds']), relative_pkg_dir, 'PKGBUILD') +def parse_pkgbuild(relative_pkg_dir: str, config: ConfigStateHolder) -> Sequence[Pkgbuild]: + """ + Since function may run in a different subprocess, we need to be passed the config via parameter + """ + setup_logging(verbose=config.runtime['verbose'], log_setup=False) # different thread needs log setup. + pkgbuilds_dir = config.get_path('pkgbuilds') + pkgdir = os.path.join(pkgbuilds_dir, relative_pkg_dir) + filename = os.path.join(pkgdir, 'PKGBUILD') logging.debug(f"Parsing {filename}") mode = None with open(filename, 'r') as file: @@ -107,9 +114,9 @@ def parse_pkgbuild(relative_pkg_dir: str, native_chroot: Chroot) -> Sequence[Pkg base_package = Pkgbase(relative_pkg_dir) base_package.mode = mode base_package.repo = relative_pkg_dir.split('/')[0] - srcinfo = native_chroot.run_cmd( + srcinfo = run_cmd( MAKEPKG_CMD + ['--printsrcinfo'], - cwd=os.path.join(CHROOT_PATHS['pkgbuilds'], base_package.path), + cwd=pkgdir, stdout=subprocess.PIPE, ) assert (isinstance(srcinfo, subprocess.CompletedProcess))