From 40233cb6de28c2df84b2877604ce24edb2f70383 Mon Sep 17 00:00:00 2001
From: David Wronek <david@mainlining.org>
Date: Fri, 28 Feb 2025 09:31:02 +0000
Subject: [PATCH 1/4] jobs: send BPO_KERNEL to API (MR 121)

Send the kernel variant to the API to allow adding a new field the JSON index.

Signed-off-by: David Wronek <david@mainlining.org>
---
 bpo/jobs/build_image.py    | 61 ++++++++++++++++++++++++++++++++------
 bpo/jobs/build_package.py  |  1 +
 bpo/jobs/get_depends.py    |  1 +
 bpo/jobs/repo_bootstrap.py |  1 +
 bpo/jobs/sign_index.py     |  1 +
 helpers/submit.py          |  2 ++
 6 files changed, 58 insertions(+), 9 deletions(-)

diff --git a/bpo/jobs/build_image.py b/bpo/jobs/build_image.py
index b5fc06e..1bb317e 100644
--- a/bpo/jobs/build_image.py
+++ b/bpo/jobs/build_image.py
@@ -115,14 +115,23 @@ def run(device, branch, ui):
             if [ -e {arg_work_rootfs}/{arg_device}.img ]; then
                 sudo mv {arg_work_rootfs}/{arg_device}.img \\
                         "out/$IMG_PREFIX.img"
+                if [ -n {arg_kernel} ]; then
+                    echo "out/$IMG_PREFIX.img" >> kernel-{arg_kernel}
+                fi
             else
                 # Boot and root partitions in separate files (pmbootstrap!1871)
                 # Name the second file -bootpart.img instead of -boot.img to
                 # avoid confusion with Android boot.img files.
                 sudo mv {arg_work_rootfs}/{arg_device}-root.img \\
                         "out/$IMG_PREFIX.img"
+                if [ -n {arg_kernel} ]; then
+                    echo "out/$IMG_PREFIX.img" >> kernel-{arg_kernel}
+                fi
                 sudo mv {arg_work_rootfs}/{arg_device}-boot.img \\
                         "out/$IMG_PREFIX-bootpart.img"
+                if [ -n {arg_kernel} ]; then
+                    echo "out/$IMG_PREFIX-bootpart.img" >> kernel-{arg_kernel}
+                fi
             fi
             ls -lh out
         """
@@ -139,6 +148,9 @@ def run(device, branch, ui):
             for i in {arg_work_boot}/boot.img*; do
                 if [ -e "$i" ]; then
                     sudo mv "$i" "out/$IMG_PREFIX-boot.img"
+                    if [ -n {arg_kernel} ]; then
+                        echo "out/$IMG_PREFIX-boot.img" >> kernel-{arg_kernel}
+                    fi
                 fi
             done
 
@@ -154,6 +166,9 @@ def run(device, branch, ui):
             for i in {arg_work_boot}/lk2nd.img; do
                 if [ -e "$i" ]; then
                     sudo mv "$i" "out/$IMG_PREFIX-lk2nd.img"
+                    if [ -n {arg_kernel} ]; then
+                        echo "out/$IMG_PREFIX-lk2nd.img" >> kernel-{arg_kernel}
+                    fi
                 fi
             done
 
@@ -163,9 +178,19 @@ def run(device, branch, ui):
     tasks["compress"] = """
             sudo chown "$(id -u):$(id -g)" out/*.img
 
-            for i in out/*.img; do
-                xz -0 -T0 "$i"
-            done
+            kernels="$(find * -name 'kernel-*' -maxdepth 0)"
+            if [ -z "$kernels" ]; then
+                for i in out/*.img; do
+                    xz -0 -T0 "$i"
+                done
+            else
+                for kernel in ${kernels}; do
+                    for i in $(cat $kernel); do
+                        xz -0 -T0 "$i"
+                        sed -i "s:$i:$i.xz:" "$kernel"
+                    done
+                done
+            fi
 
             ls -lh out
     """
@@ -190,6 +215,10 @@ def run(device, branch, ui):
             sudo mv {arg_work}/chroot_*/var/lib/postmarketos-android-recovery-installer/pmos-{arg_device}.zip \
                     "$OUTPUT_FILE"
 
+            if [ -n {arg_kernel} ]; then
+                echo "$OUTPUT_FILE" >> kernel-{arg_kernel}
+            fi
+
             sudo chown "$(id -u):$(id -g)" "$OUTPUT_FILE"
             ls -lh "$OUTPUT_FILE"
             """
@@ -215,12 +244,26 @@ def run(device, branch, ui):
 
             # Upload one file at a time
             prev=""
-            for i in out/*; do
-                export BPO_PAYLOAD_FILES_PREVIOUS="$prev"
-                export BPO_PAYLOAD_FILES="$i"
-                build.postmarketos.org/helpers/submit.py
-                prev="$prev$(basename "$i")#"
-            done
+            kernels="$(find * -name 'kernel-*' -maxdepth 0)"
+            if [ -z "$kernels" ]; then
+                for i in out/*; do
+                    export BPO_KERNEL=""
+                    export BPO_PAYLOAD_FILES_PREVIOUS="$prev"
+                    export BPO_PAYLOAD_FILES="$i"
+                    build.postmarketos.org/helpers/submit.py
+                    prev="$prev$(basename "$i")#"
+                done
+            else
+                for kernel in ${{kernels}}; do
+                    for file in "$(cat $kernel)"; do
+                        export BPO_KERNEL="${{kernel#'kernel-'}}"
+                        export BPO_PAYLOAD_FILES_PREVIOUS="$prev"
+                        export BPO_PAYLOAD_FILES="$file"
+                        build.postmarketos.org/helpers/submit.py
+                        prev="$prev$(basename "$file")#"
+                    done
+                done
+            fi
 
             # Finalize upload
             export BPO_PAYLOAD_FILES_PREVIOUS="$prev"
diff --git a/bpo/jobs/build_package.py b/bpo/jobs/build_package.py
index 0563525..fb56d77 100644
--- a/bpo/jobs/build_package.py
+++ b/bpo/jobs/build_package.py
@@ -119,6 +119,7 @@ def run(arch, pkgname, branch, splitrepo):
         export BPO_BRANCH={shlex.quote(branch)}
         export BPO_DEVICE=""
         packages="$(pmbootstrap -q config work)/packages"
+        export BPO_KERNEL=""
         export BPO_PAYLOAD_FILES="$(find "$packages" -name '*.apk')"
         export BPO_PAYLOAD_FILES_PREVIOUS=""
         export BPO_PAYLOAD_IS_JSON="0"
diff --git a/bpo/jobs/get_depends.py b/bpo/jobs/get_depends.py
index 583b1c7..45e5feb 100644
--- a/bpo/jobs/get_depends.py
+++ b/bpo/jobs/get_depends.py
@@ -54,6 +54,7 @@ def run(branch):
         export BPO_ARCH=""
         export BPO_BRANCH=""" + shlex.quote(branch) + """
         export BPO_DEVICE=""
+        export BPO_KERNEL=""
         export BPO_PAYLOAD_FILES="$(ls -1 depends.*.json)"
         export BPO_PAYLOAD_FILES_PREVIOUS=""
         export BPO_PAYLOAD_IS_JSON="0"
diff --git a/bpo/jobs/repo_bootstrap.py b/bpo/jobs/repo_bootstrap.py
index f194d64..5ed389c 100644
--- a/bpo/jobs/repo_bootstrap.py
+++ b/bpo/jobs/repo_bootstrap.py
@@ -65,6 +65,7 @@ def run(session, rb, test_pmaports_cfg=None):
         export BPO_BRANCH={shlex.quote(rb.branch)}
         export BPO_SPLITREPO={shlex.quote(rb.dir_name)}
         export BPO_DEVICE=""
+        export BPO_KERNEL=""
         packages="$(pmbootstrap -q config work)/packages"
         export BPO_PAYLOAD_FILES="$(find "$packages" -name '*.apk')"
         export BPO_PAYLOAD_FILES_PREVIOUS=""
diff --git a/bpo/jobs/sign_index.py b/bpo/jobs/sign_index.py
index 36abd5d..faca0b5 100644
--- a/bpo/jobs/sign_index.py
+++ b/bpo/jobs/sign_index.py
@@ -67,6 +67,7 @@ def run(arch, branch, splitrepo):
             export BPO_ARCH={shlex.quote(arch)}
             export BPO_BRANCH={shlex.quote(branch)}
             export BPO_DEVICE=""
+            export BPO_KERNEL=""
             export BPO_PAYLOAD_FILES="APKINDEX.tar.gz"
             export BPO_PAYLOAD_FILES_PREVIOUS=""
             export BPO_PAYLOAD_IS_JSON="0"
diff --git a/helpers/submit.py b/helpers/submit.py
index 8c48faa..f6dc6be 100755
--- a/helpers/submit.py
+++ b/helpers/submit.py
@@ -17,6 +17,7 @@ for key in ["BPO_API_ENDPOINT",
             "BPO_DEVICE",
             "BPO_JOB_ID",
             "BPO_JOB_NAME",
+            "BPO_KERNEL",
             "BPO_PAYLOAD_FILES_PREVIOUS",  # separated by '#'
             "BPO_PAYLOAD_IS_JSON",  # set to "1" to enable
             "BPO_PKGNAME",
@@ -54,6 +55,7 @@ headers = {"X-BPO-Arch": os.environ["BPO_ARCH"],
            "X-BPO-Device": os.environ["BPO_DEVICE"],
            "X-BPO-Job-Id": os.environ["BPO_JOB_ID"],
            "X-BPO-Job-Name": os.environ["BPO_JOB_NAME"],
+           "X-BPO-Kernel": os.environ["BPO_KERNEL"],
            "X-BPO-Payload-Files-Previous":
                os.environ["BPO_PAYLOAD_FILES_PREVIOUS"],
            "X-BPO-Pkgname": os.environ["BPO_PKGNAME"],
-- 
GitLab


From f80d70f87180542fd356f257c5df87b7cd504f59 Mon Sep 17 00:00:00 2001
From: David Wronek <david@mainlining.org>
Date: Fri, 28 Feb 2025 09:51:08 +0000
Subject: [PATCH 2/4] bpo.images.ui.write_index_json: Add kernel variant if set
 (MR 121)

With this field, desktop installers like the UBports Installer can list
different kernel variants without having to do fuzzy searching.

Signed-off-by: David Wronek <david@mainlining.org>
---
 bpo/api/job_callback/build_image.py | 7 ++++---
 bpo/ui/images.py                    | 8 +++++---
 2 files changed, 9 insertions(+), 6 deletions(-)

diff --git a/bpo/api/job_callback/build_image.py b/bpo/api/job_callback/build_image.py
index af334bb..66d39a6 100644
--- a/bpo/api/job_callback/build_image.py
+++ b/bpo/api/job_callback/build_image.py
@@ -98,7 +98,7 @@ def upload_new_files(path_temp, files):
     return f"got {count} file(s)"
 
 
-def upload_finish(session, image, path_temp, dir_name):
+def upload_finish(session, image, path_temp, dir_name, kernel):
     # Create target dir
     path = bpo.images.path(image.branch, image.device, image.ui, dir_name)
     os.makedirs(path, exist_ok=True)
@@ -123,7 +123,7 @@ def upload_finish(session, image, path_temp, dir_name):
 
     # Generate HTML files (for all dirs in the images path, including the path
     # of this image and its potentially new parent directories)
-    bpo.ui.images.write_index_all()
+    bpo.ui.images.write_index_all(kernel)
 
     # Start next build job
     bpo.repo.build()
@@ -137,6 +137,7 @@ def job_callback_build_image():
     device = bpo.api.get_header(request, "Device")
     dir_name = get_dir_name(request)
     job_id = bpo.api.get_header(request, "Job-Id")
+    kernel = bpo.api.get_header(request, "Kernel")
     ui = bpo.api.get_header(request, "Ui")
 
     session = bpo.db.session()
@@ -148,4 +149,4 @@ def job_callback_build_image():
 
     if files:
         return upload_new_files(path_temp, files)
-    return upload_finish(session, image, path_temp, dir_name)
+    return upload_finish(session, image, path_temp, dir_name, kernel)
diff --git a/bpo/ui/images.py b/bpo/ui/images.py
index bbd9502..081bd0d 100644
--- a/bpo/ui/images.py
+++ b/bpo/ui/images.py
@@ -165,7 +165,7 @@ def parse_files_from_disk():
     return index
 
 
-def write_index_json():
+def write_index_json(kernel):
     """ Write an index.json file, which can be used by a desktop installer to
         list and download available images. """
     logging.info("Writing index.json to images dir")
@@ -244,6 +244,8 @@ def write_index_json():
                             "size": i["size"],
                             "url": i["url"]
                         }
+                        if kernel:
+                            image["kernel"] = kernel
                         # these are optional
                         for s in ["sha256", "sha512"]:
                             if s in i:
@@ -283,6 +285,6 @@ def write_index_html():
             write_index_file_list(path, "05_files.html")
 
 
-def write_index_all():
-    write_index_json()
+def write_index_all(kernel = ""):
+    write_index_json(kernel)
     write_index_html()
-- 
GitLab


From 0f8515641d76e648f6eebebc38f3edcc1a09562b Mon Sep 17 00:00:00 2001
From: David Wronek <david@mainlining.org>
Date: Wed, 5 Mar 2025 10:27:22 +0000
Subject: [PATCH 3/4] fixup! jobs: send BPO_KERNEL to API (MR 121)

---
 bpo/jobs/build_image.py | 43 ++++++++++++++++++++++++++++-------------
 1 file changed, 30 insertions(+), 13 deletions(-)

diff --git a/bpo/jobs/build_image.py b/bpo/jobs/build_image.py
index 1bb317e..57febfc 100644
--- a/bpo/jobs/build_image.py
+++ b/bpo/jobs/build_image.py
@@ -185,10 +185,10 @@ def run(device, branch, ui):
                 done
             else
                 for kernel in ${kernels}; do
-                    for i in $(cat $kernel); do
+                    while read -r i; do
                         xz -0 -T0 "$i"
                         sed -i "s:$i:$i.xz:" "$kernel"
-                    done
+                    done < "$kernel"
                 done
             fi
 
@@ -225,10 +225,25 @@ def run(device, branch, ui):
 
     tasks["checksums"] = """
             cd out
-            for i in *; do
-                sha256sum "$i" | tee "$i.sha256"
-                sha512sum "$i" | tee "$i.sha512"
-            done
+
+            kernels="$(cd ..; find * -name 'kernel-*' -maxdepth 0)"
+            if [ -z "$kernels" ]; then
+                for i in *; do
+                    sha256sum "$i" | tee "$i.sha256"
+                    sha512sum "$i" | tee "$i.sha512"
+                done
+            else
+                for kernel in ${kernels}; do
+                    while read -r file; do
+                        sha256sum "$file" | tee "$file.sha256"
+                        sha512sum "$file" | tee "$file.sha512"
+                        echo "$file.sha256" >> ../tmp-"$kernel"
+                        echo "$file.sha512" >> ../tmp-"$kernel"
+                    done < ../"$kernel"
+                    cat ../tmp-"$kernel" >> ../"$kernel"
+                    rm ../tmp-"$kernel"
+                done
+            fi
     """
 
     tasks["submit"] = f"""
@@ -255,13 +270,15 @@ def run(device, branch, ui):
                 done
             else
                 for kernel in ${{kernels}}; do
-                    for file in "$(cat $kernel)"; do
-                        export BPO_KERNEL="${{kernel#'kernel-'}}"
-                        export BPO_PAYLOAD_FILES_PREVIOUS="$prev"
-                        export BPO_PAYLOAD_FILES="$file"
-                        build.postmarketos.org/helpers/submit.py
-                        prev="$prev$(basename "$file")#"
-                    done
+                    while read -r file; do
+                        if [ -f "$file" ]; then
+                            export BPO_KERNEL="${{kernel#'kernel-'}}"
+                            export BPO_PAYLOAD_FILES_PREVIOUS="$prev"
+                            export BPO_PAYLOAD_FILES="$file"
+                            build.postmarketos.org/helpers/submit.py
+                            prev="$prev$(basename "$file")#"
+                        fi
+                    done < "$kernel"
                 done
             fi
 
-- 
GitLab


From 3096feaf40185ebd1589a48e1d4a34610cd4ca53 Mon Sep 17 00:00:00 2001
From: David Wronek <david@mainlining.org>
Date: Wed, 5 Mar 2025 11:11:41 +0000
Subject: [PATCH 4/4] fixup! jobs: send BPO_KERNEL to API (MR 121)

---
 bpo/jobs/build_image.py | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/bpo/jobs/build_image.py b/bpo/jobs/build_image.py
index 57febfc..45d5f85 100644
--- a/bpo/jobs/build_image.py
+++ b/bpo/jobs/build_image.py
@@ -235,10 +235,10 @@ def run(device, branch, ui):
             else
                 for kernel in ${kernels}; do
                     while read -r file; do
-                        sha256sum "$file" | tee "$file.sha256"
-                        sha512sum "$file" | tee "$file.sha512"
-                        echo "$file.sha256" >> ../tmp-"$kernel"
-                        echo "$file.sha512" >> ../tmp-"$kernel"
+                        sha256sum $(basename "$file") | tee "$(basename $file).sha256"
+                        sha512sum $(basename "$file") | tee "$(basename $file).sha512"
+                        echo "out/$file.sha256" >> ../tmp-"$kernel"
+                        echo "out/$file.sha512" >> ../tmp-"$kernel"
                     done < ../"$kernel"
                     cat ../tmp-"$kernel" >> ../"$kernel"
                     rm ../tmp-"$kernel"
-- 
GitLab