forked from Mirror/pmbootstrap
Abort the "pmbootstrap kconfig check" on the first error, unless the --keep-going argument was passed. This makes it easier to go through the failed kernels one by one until they are all fixed.
68 lines
2.3 KiB
Python
68 lines
2.3 KiB
Python
# Copyright 2024 Oliver Smith
|
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
|
|
|
from __future__ import annotations
|
|
from pmb import commands
|
|
from pmb.core.context import get_context
|
|
import pmb.parse.kconfig
|
|
import pmb.helpers.git
|
|
import pmb.config
|
|
import logging
|
|
|
|
|
|
class KConfigCheck(commands.Command):
|
|
details: bool
|
|
file: str
|
|
packages: list[str]
|
|
keep_going: bool
|
|
|
|
def __init__(self, details, file, packages, keep_going):
|
|
self.details = details
|
|
self.file = file
|
|
self.packages = packages
|
|
self.keep_going = keep_going
|
|
|
|
def run(self):
|
|
# Build the components list from cli arguments (--waydroid etc.)
|
|
components_list: list[str] = []
|
|
|
|
# Handle passing a file directly
|
|
if self.file:
|
|
if pmb.parse.kconfig.check_file(self.file, components_list, details=self.details):
|
|
logging.info("kconfig check succeeded!")
|
|
return
|
|
raise RuntimeError("kconfig check failed!")
|
|
|
|
# Default to all kernel packages
|
|
if not self.packages:
|
|
for pkg in pmb.helpers.pmaports.get_list():
|
|
if pkg.startswith("linux-"):
|
|
self.packages.append(pkg.split("linux-")[1])
|
|
|
|
# Iterate over all kernels
|
|
error = False
|
|
skipped = 0
|
|
self.packages.sort()
|
|
for package in self.packages:
|
|
if not get_context().force:
|
|
pkgname = package if package.startswith("linux-") else f"linux-{package}"
|
|
aport = pmb.helpers.pmaports.find(pkgname)
|
|
apkbuild = pmb.parse.apkbuild(aport)
|
|
if "!pmb:kconfigcheck" in apkbuild["options"]:
|
|
skipped += 1
|
|
continue
|
|
if not pmb.parse.kconfig.check(package, components_list, details=self.details):
|
|
error = True
|
|
if not self.keep_going:
|
|
break
|
|
|
|
# At least one failure
|
|
if error:
|
|
raise RuntimeError("kconfig check failed!")
|
|
else:
|
|
if skipped:
|
|
logging.info(
|
|
f"NOTE: {skipped} kernel{' was' if skipped == 1 else 's were'} skipped"
|
|
" (consider 'pmbootstrap kconfig check -f')"
|
|
)
|
|
logging.info("kconfig check succeeded!")
|