packages.discover_packages(): don't use chroot for running makepkg --printsrcinfo, pass config, cache results

This commit is contained in:
InsanePrawn 2022-08-15 05:51:34 +02:00
parent a6129a82bd
commit 7fcd68ced9
2 changed files with 26 additions and 11 deletions

View file

@ -100,7 +100,14 @@ def init_prebuilts(arch: Arch, dir: str = None):
raise Exception(f'Failed to create local repo {repo}') 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') pkgbuilds_dir = config.get_path('pkgbuilds')
packages: dict[str, Pkgbuild] = {} packages: dict[str, Pkgbuild] = {}
paths = [] 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)): for dir in os.listdir(os.path.join(pkgbuilds_dir, repo)):
paths.append(os.path.join(repo, dir)) paths.append(os.path.join(repo, dir))
native_chroot = setup_build_chroot(config.runtime['arch'], add_kupfer_repos=False)
results = [] results = []
logging.info("Parsing PKGBUILDs") logging.info("Parsing PKGBUILDs")
logging.debug(f"About to parse pkgbuilds. verbosity: {config.runtime['verbose']}")
if parallel: 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: else:
chunks = (parse_pkgbuild(path, native_chroot) for path in paths) chunks = (parse_pkgbuild(path, config) for path in paths)
for pkglist in chunks: for pkglist in chunks:
results += pkglist results += pkglist
@ -145,6 +152,7 @@ def discover_packages(parallel: bool = True) -> dict[str, Pkgbuild]:
logging.debug(f'Removing {dep} from dependencies') logging.debug(f'Removing {dep} from dependencies')
package.local_depends.remove(dep) package.local_depends.remove(dep)
_pkgbuilds_discovered = packages.copy()
return packages return packages

View file

@ -1,14 +1,15 @@
from __future__ import annotations from __future__ import annotations
from . import logging
import os import os
import subprocess import subprocess
from typing import Optional, Sequence from typing import Optional, Sequence
from chroot import Chroot from config import ConfigStateHolder
from constants import Arch, CHROOT_PATHS, MAKEPKG_CMD from exec import run_cmd
from constants import Arch, MAKEPKG_CMD
from distro.package import PackageInfo from distro.package import PackageInfo
from logger import logging, setup_logging
class Pkgbuild(PackageInfo): class Pkgbuild(PackageInfo):
@ -91,8 +92,14 @@ class SubPkgbuild(Pkgbuild):
self.pkgrel = pkgbase.pkgrel self.pkgrel = pkgbase.pkgrel
def parse_pkgbuild(relative_pkg_dir: str, native_chroot: Chroot) -> Sequence[Pkgbuild]: def parse_pkgbuild(relative_pkg_dir: str, config: ConfigStateHolder) -> Sequence[Pkgbuild]:
filename = os.path.join(native_chroot.get_path(CHROOT_PATHS['pkgbuilds']), relative_pkg_dir, '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}") logging.debug(f"Parsing {filename}")
mode = None mode = None
with open(filename, 'r') as file: 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 = Pkgbase(relative_pkg_dir)
base_package.mode = mode base_package.mode = mode
base_package.repo = relative_pkg_dir.split('/')[0] base_package.repo = relative_pkg_dir.split('/')[0]
srcinfo = native_chroot.run_cmd( srcinfo = run_cmd(
MAKEPKG_CMD + ['--printsrcinfo'], MAKEPKG_CMD + ['--printsrcinfo'],
cwd=os.path.join(CHROOT_PATHS['pkgbuilds'], base_package.path), cwd=pkgdir,
stdout=subprocess.PIPE, stdout=subprocess.PIPE,
) )
assert (isinstance(srcinfo, subprocess.CompletedProcess)) assert (isinstance(srcinfo, subprocess.CompletedProcess))