diff --git a/pmb/build/other.py b/pmb/build/other.py
index 45b0238f..94997fdd 100644
--- a/pmb/build/other.py
+++ b/pmb/build/other.py
@@ -43,6 +43,10 @@ def find_aport(args, package, must_exist=True):
if package in args.cache["find_aport"]:
ret = args.cache["find_aport"][package]
else:
+ # Sanity check
+ if "*" in package:
+ raise RuntimeError("Invalid pkgname: " + package)
+
# Search in packages
paths = glob.glob(args.aports + "/*/" + package)
if len(paths) > 2:
diff --git a/pmb/helpers/frontend.py b/pmb/helpers/frontend.py
index 1610533d..1c431e4d 100644
--- a/pmb/helpers/frontend.py
+++ b/pmb/helpers/frontend.py
@@ -244,13 +244,24 @@ def kconfig_check(args):
raise RuntimeError("kconfig_check failed!")
-def parse_apkbuild(args):
- aport = pmb.build.other.find_aport(args, args.package)
- path = aport + "/APKBUILD"
- print(json.dumps(pmb.parse.apkbuild(args, path), indent=4))
+def apkbuild_parse(args):
+ # Default to all packages
+ packages = args.packages
+ if not packages:
+ for apkbuild in glob.glob(args.aports + "/*/*/APKBUILD"):
+ packages.append(os.path.basename(os.path.dirname(apkbuild)))
+
+ # Iterate over all packages
+ packages.sort()
+ for package in packages:
+ print(package + ":")
+ aport = pmb.build.other.find_aport(args, package)
+ path = aport + "/APKBUILD"
+ print(json.dumps(pmb.parse.apkbuild(args, path), indent=4,
+ sort_keys=True))
-def parse_apkindex(args):
+def apkindex_parse(args):
result = pmb.parse.apkindex.parse(args, args.apkindex_path)
if args.package:
if args.package not in result:
diff --git a/pmb/parse/apkbuild.py b/pmb/parse/apkbuild.py
index cdf42e84..5499e4bd 100644
--- a/pmb/parse/apkbuild.py
+++ b/pmb/parse/apkbuild.py
@@ -19,6 +19,7 @@ along with pmbootstrap. If not, see .
import os
import logging
import pmb.config
+import pmb.parse.version
def replace_variables(apkbuild):
@@ -80,16 +81,17 @@ def cut_off_function_names(apkbuild):
return apkbuild
-def apkbuild(args, path):
+def apkbuild(args, path, check_pkgver=True):
"""
Parse relevant information out of the APKBUILD file. This is not meant
to be perfect and catch every edge case (for that, a full shell parser
would be necessary!). Instead, it should just work with the use-cases
covered by pmbootstrap and not take too long.
- :param path: Full path to the APKBUILD
- :returns: Relevant variables from the APKBUILD. Arrays get returned as
- arrays.
+ :param path: full path to the APKBUILD
+ :param version_check: verify that the pkgver is valid.
+ :returns: relevant variables from the APKBUILD. Arrays get returned as
+ arrays.
"""
# Try to get a cached result first (we assume, that the aports don't change
# in one pmbootstrap call)
@@ -160,6 +162,14 @@ def apkbuild(args, path):
if not len(ret["arch"]):
raise RuntimeError("Arch must not be empty: " + path)
+ # Sanity check: pkgver
+ if check_pkgver:
+ if "-r" in ret["pkgver"] or not pmb.parse.version.validate(ret["pkgver"]):
+ logging.info("NOTE: Valid pkgvers are described here:")
+ logging.info("")
+ raise RuntimeError("Invalid pkgver '" + ret["pkgver"] +
+ "' in APKBUILD: " + path)
+
# Fill cache
args.cache["apkbuild"][path] = ret
return ret
diff --git a/pmb/parse/arguments.py b/pmb/parse/arguments.py
index 60294c5f..2301a302 100644
--- a/pmb/parse/arguments.py
+++ b/pmb/parse/arguments.py
@@ -289,15 +289,13 @@ def arguments():
help="do not overwrite the existing kernel",
action="store_false", dest="recovery_flash_kernel")
- # Action: menuconfig / parse_apkbuild
+ # Action: menuconfig
menuconfig = sub.add_parser("menuconfig", help="run menuconfig on"
" a kernel aport")
menuconfig.add_argument("--arch", choices=arch_choices)
- parse_apkbuild = sub.add_parser("parse_apkbuild")
- for action in [menuconfig, parse_apkbuild]:
- action.add_argument("package")
+ menuconfig.add_argument("package")
- # Action: build / checksum / aportgen
+ # Action: checksum / aportgen / build
checksum = sub.add_parser("checksum", help="update aport checksums")
aportgen = sub.add_parser("aportgen", help="generate a postmarketOS"
" specific package build recipe (aport/APKBUILD)")
@@ -322,11 +320,13 @@ def arguments():
for action in [checksum, build, aportgen]:
action.add_argument("packages", nargs="+")
- # Action: kconfig_check
+ # Action: kconfig_check / apkbuild_parse
kconfig_check = sub.add_parser("kconfig_check", help="check, whether all"
" the necessary options are"
" enabled/disabled in the kernel config")
- kconfig_check.add_argument("packages", nargs="*")
+ apkbuild_parse = sub.add_parser("apkbuild_parse")
+ for action in [kconfig_check, apkbuild_parse]:
+ action.add_argument("packages", nargs="*")
# Action: challenge
challenge = sub.add_parser("challenge",
@@ -343,10 +343,10 @@ def arguments():
" .apk, or must be named"
" APKINDEX.tar.gz.")
- # Action: parse_apkindex
- parse_apkindex = sub.add_parser("parse_apkindex")
- parse_apkindex.add_argument("apkindex_path")
- parse_apkindex.add_argument("package", default=None, nargs="?")
+ # Action: apkindex_parse
+ apkindex_parse = sub.add_parser("apkindex_parse")
+ apkindex_parse.add_argument("apkindex_path")
+ apkindex_parse.add_argument("package", default=None, nargs="?")
# Action: config
config = sub.add_parser("config",
diff --git a/test/test_aportgen_device_wizard.py b/test/test_aportgen_device_wizard.py
index 9889947b..ca797bd3 100644
--- a/test/test_aportgen_device_wizard.py
+++ b/test/test_aportgen_device_wizard.py
@@ -87,7 +87,8 @@ def generate(args, monkeypatch, answers):
apkbuild_path_linux = (args.aports + "/device/"
"linux-testsuite-testdevice/APKBUILD")
apkbuild = pmb.parse.apkbuild(args, apkbuild_path)
- apkbuild_linux = pmb.parse.apkbuild(args, apkbuild_path_linux)
+ apkbuild_linux = pmb.parse.apkbuild(args, apkbuild_path_linux,
+ check_pkgver=False)
deviceinfo = pmb.parse.deviceinfo(args, "testsuite-testdevice")
return (deviceinfo, apkbuild, apkbuild_linux)