forked from Mirror/pmbootstrap
treewide: migrate to pkgrepo API (MR 2252)
Make use of the new pmb.core.pkgrepo API to handle multiple aports and extra-repos. Signed-off-by: Caleb Connolly <caleb@postmarketos.org>
This commit is contained in:
parent
8a61d67053
commit
560cea46ea
19 changed files with 153 additions and 91 deletions
|
@ -1,7 +1,9 @@
|
|||
# Copyright 2023 Danct12 <danct12@disroot.org>
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
from pathlib import Path
|
||||
from typing import Dict, List
|
||||
from pmb.core.chroot import Chroot
|
||||
from pmb.core.pkgrepo import pkgrepo_iter_package_dirs, pkgrepo_names, pkgrepo_relative_path
|
||||
from pmb.helpers import logging
|
||||
import os
|
||||
|
||||
|
@ -13,7 +15,7 @@ import pmb.helpers.run
|
|||
import pmb.helpers.pmaports
|
||||
|
||||
|
||||
def check(args: PmbArgs, pkgnames):
|
||||
def check(args: PmbArgs, pkgnames: List[str]):
|
||||
"""Run apkbuild-lint on the supplied packages.
|
||||
|
||||
:param pkgnames: Names of the packages to lint
|
||||
|
@ -23,18 +25,27 @@ def check(args: PmbArgs, pkgnames):
|
|||
|
||||
# Mount pmaports.git inside the chroot so that we don't have to copy the
|
||||
# package folders
|
||||
pmaports = Path("/mnt/pmaports")
|
||||
pmb.build.mount_pmaports(pmaports, chroot)
|
||||
dest_paths = pmb.build.mount_pmaports(chroot)
|
||||
|
||||
# Locate all APKBUILDs and make the paths be relative to the pmaports
|
||||
# root
|
||||
apkbuilds = []
|
||||
for pkgname in pkgnames:
|
||||
aport = pmb.helpers.pmaports.find(pkgname)
|
||||
if not (aport / "APKBUILD").exists():
|
||||
raise ValueError(f"Path does not contain an APKBUILD file: {aport}")
|
||||
relpath = os.path.relpath(aport, args.aports)
|
||||
apkbuilds.append(f"{relpath}/APKBUILD")
|
||||
apkbuilds: Dict[str, List[str]] = dict(map(lambda x: (x, []), pkgrepo_names()))
|
||||
found_pkgnames = set()
|
||||
# If a package exists in multiple aports we will lint all of them
|
||||
# since.. well, what else do we do?
|
||||
for pkgdir in pkgrepo_iter_package_dirs():
|
||||
if pkgdir.name not in pkgnames:
|
||||
continue
|
||||
|
||||
repo, relpath = pkgrepo_relative_path(pkgdir)
|
||||
apkbuilds[repo.name].append(os.fspath(relpath / "APKBUILD"))
|
||||
found_pkgnames.add(pkgdir.name)
|
||||
|
||||
# Check we found all the packages in pkgnames
|
||||
if len(found_pkgnames) != len(pkgnames):
|
||||
missing = set(pkgnames) - found_pkgnames
|
||||
logging.error(f"Could not find the following packages: {missing}")
|
||||
return
|
||||
|
||||
# Run apkbuild-lint in chroot from the pmaports mount point. This will
|
||||
# print a nice source identifier à la "./cross/grub-x86/APKBUILD" for
|
||||
|
@ -42,8 +53,11 @@ def check(args: PmbArgs, pkgnames):
|
|||
pkgstr = ", ".join(pkgnames)
|
||||
logging.info(f"(native) linting {pkgstr} with apkbuild-lint")
|
||||
options = pmb.config.apkbuild_custom_valid_options
|
||||
return pmb.chroot.root(["apkbuild-lint"] + apkbuilds,
|
||||
check=False, output="stdout",
|
||||
output_return=True,
|
||||
working_dir=pmaports,
|
||||
env={"CUSTOM_VALID_OPTIONS": " ".join(options)})
|
||||
|
||||
# For each pkgrepo run the linter on the relevant packages
|
||||
for repo, apkbuild_paths in apkbuilds.items():
|
||||
pmb.chroot.root(["apkbuild-lint"] + apkbuild_paths,
|
||||
check=False, output="stdout",
|
||||
output_return=True,
|
||||
working_dir=dest_paths[repo],
|
||||
env={"CUSTOM_VALID_OPTIONS": " ".join(options)})
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue