]> git.ipfire.org Git - thirdparty/openwrt.git/commitdiff
imagebuilder: implement STRIP_ABI option for manifest target 19278/head
authorEric Fahlgren <ericfahlgren@gmail.com>
Tue, 1 Jul 2025 21:02:41 +0000 (14:02 -0700)
committerRobert Marko <robimarko@gmail.com>
Thu, 3 Jul 2025 10:45:59 +0000 (12:45 +0200)
When using apk as the package manager, imagebuilder make command

    make manifest STRIP_ABI=1

does not strip package names of their ABI-version suffix.  The ASU
server relies on this to validate builds, so many snapshot build
requests are failing.

Fix this by using the already existing package data parser in
make-index-json.py and augment it to write the result in manifest
format.

Fixes: https://github.com/openwrt/openwrt/issues/19274
Signed-off-by: Eric Fahlgren <ericfahlgren@gmail.com>
Link: https://github.com/openwrt/openwrt/pull/19278
Signed-off-by: Robert Marko <robimarko@gmail.com>
scripts/make-index-json.py
target/imagebuilder/files/Makefile

index 4d71c3fca32b8178b55c58dca306b1b90ea9de92..7751cde810236a81f5416d29374d893614e216ec 100755 (executable)
@@ -31,6 +31,8 @@ def parse_args():
                         help="Required device architecture: like 'x86_64' or 'aarch64_generic'")
     parser.add_argument("-f", "--source-format", required=True, choices=source_format,
                         help="Required source format of input: 'apk' or 'opkg'")
+    parser.add_argument("-m", "--manifest", action="store_true", default=False,
+                        help="Print output in manifest format, as package:version pairs")
     parser.add_argument(dest="source",
                         help="File name for input, '-' for stdin")
     # fmt: on
@@ -42,7 +44,11 @@ def parse_apk(text: str) -> dict:
     packages: dict = {}
 
     data = json.loads(text)
-    for package in data.get("packages", []):
+    if isinstance(data, dict) and "packages" in data:
+        # Extract 'apk adbdump' dict field to 'apk query' package list
+        data = data["packages"]
+
+    for package in data:
         package_name: str = package["name"]
 
         for tag in package.get("tags", []):
@@ -83,9 +89,13 @@ if __name__ == "__main__":
         text: str = input.read()
 
     packages = parse_apk(text) if args.source_format == "apk" else parse_opkg(text)
-    index = {
-        "version": 2,
-        "architecture": args.architecture,
-        "packages": packages,
-    }
-    print(json.dumps(index, indent=2))
+    if args.manifest:
+        for name, version in packages.items():
+            print(name, version)
+    else:
+        index = {
+            "version": 2,
+            "architecture": args.architecture,
+            "packages": packages,
+        }
+        print(json.dumps(index, indent=2))
index d8c1c3c5e8c3b5c3f2227980be2600facf930610..3f919a06589e9ed0d345d503edac8d3e4f102ebb 100644 (file)
@@ -168,7 +168,8 @@ _call_manifest: FORCE
 ifeq ($(CONFIG_USE_APK),)
        $(OPKG) list-installed $(if $(STRIP_ABI),--strip-abi)
 else
-       $(APK) list --quiet --manifest --no-network
+       $(APK) query --format json --fields name,version,$(if $(STRIP_ABI),tags) --installed '*' | \
+               $(SCRIPT_DIR)/make-index-json.py -a $(ARCH_PACKAGES) -f apk --manifest -
 endif
 
 package_index: FORCE