Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package sdbootutil for openSUSE:Factory 
checked in at 2026-07-06 13:11:38
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/sdbootutil (Old)
 and      /work/SRC/openSUSE:Factory/.sdbootutil.new.1982 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "sdbootutil"

Mon Jul  6 13:11:38 2026 rev:103 rq:1363998 version:1+git20260706.f9f4faf

Changes:
--------
--- /work/SRC/openSUSE:Factory/sdbootutil/sdbootutil.changes    2026-05-08 
16:42:13.449333083 +0200
+++ /work/SRC/openSUSE:Factory/.sdbootutil.new.1982/sdbootutil.changes  
2026-07-06 13:11:43.437500293 +0200
@@ -1,0 +2,27 @@
+Mon Jul 06 08:55:10 UTC 2026 - Alberto Planas Dominguez <[email protected]>
+
+- Update to version 1+git20260706.f9f4faf:
+  * After reboot the shutdown service is not active
+  * Disable the shutdown service after main service
+  * Update uhmac dependencies (bsc#1270192, CVE-2026-41676)
+  * Add systemd transient service to update predictions
+  * Install extra EFI binaries
+
+-------------------------------------------------------------------
+Thu Jun 25 11:59:20 UTC 2026 - Alberto Planas Dominguez <[email protected]>
+
+- Update to version 1+git20260625.7fa275e:
+  * Remove duplicate code and parametrize timers
+  * Check boot entry before kernel installation
+  * Re-install an old kernel if initrd cannot be reused
+  * Skip installation for already installed kernel
+  * Add configurable devicetree entry support
+  * Set explicit kernel and initrd paths
+  * Remove the full tmpdir in the service
+  * Fix /run/sdbootutil permissions
+  * Execute predictions in the background
+  * Add --disable-predictions parameter
+  * Fix comparison operator
+  * Add print-loader-path command
+
+-------------------------------------------------------------------

Old:
----
  sdbootutil-1+git20260506.25d47bf.obscpio

New:
----
  sdbootutil-1+git20260706.f9f4faf.obscpio

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ sdbootutil.spec ++++++
--- /var/tmp/diff_new_pack.pW9gQ5/_old  2026-07-06 13:11:44.825548245 +0200
+++ /var/tmp/diff_new_pack.pW9gQ5/_new  2026-07-06 13:11:44.825548245 +0200
@@ -18,7 +18,7 @@
 
 %global rustflags '-Clink-arg=-Wl,-z,relro,-z,now'
 Name:           sdbootutil
-Version:        1+git20260506.25d47bf
+Version:        1+git20260706.f9f4faf
 Release:        0
 Summary:        Bootctl wrapper for BLS boot loaders
 License:        MIT

++++++ _servicedata ++++++
--- /var/tmp/diff_new_pack.pW9gQ5/_old  2026-07-06 13:11:44.877550042 +0200
+++ /var/tmp/diff_new_pack.pW9gQ5/_new  2026-07-06 13:11:44.881550181 +0200
@@ -1,6 +1,6 @@
 <servicedata>
 <service name="tar_scm">
                 <param 
name="url">https://github.com/openSUSE/sdbootutil.git</param>
-              <param 
name="changesrevision">25d47bf10ddc4b8b8c6061e82670e8f82fe8916b</param></service></servicedata>
+              <param 
name="changesrevision">f9f4faf9ccf726e6a2943f6b94e5b087ede5f49c</param></service></servicedata>
 (No newline at EOF)
 

++++++ sdbootutil-1+git20260506.25d47bf.obscpio -> 
sdbootutil-1+git20260706.f9f4faf.obscpio ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/sdbootutil-1+git20260506.25d47bf/10-sdbootutil.snapper 
new/sdbootutil-1+git20260706.f9f4faf/10-sdbootutil.snapper
--- old/sdbootutil-1+git20260506.25d47bf/10-sdbootutil.snapper  2026-05-06 
20:45:00.000000000 +0200
+++ new/sdbootutil-1+git20260706.f9f4faf/10-sdbootutil.snapper  2026-07-06 
10:53:28.000000000 +0200
@@ -9,6 +9,71 @@
        findmnt --fstab / -O ro >/dev/null
 }
 
+# Decoupling the calls for update-predictions from the plugin is
+# tricky.  Those are the basic requirements:
+#
+# * The plugin launch a detached process with `nohup` that will
+#   trigger the update
+#
+# * The call to update-predictions is done by a transient timer
+#
+# * Because in Tumbleweed the create-snapshot event is received two
+#   times (pre / post snapshots), to avoid triggering two times the
+#   update-predictions, we set a large timeout for the
+#   `create_snapshot` event
+#
+# * The marker file `/run/sdbootutil/update-predictions` is used to
+#   mark when there is a pending update-predictions
+#
+# * If the timer is up, this means that the service has not been
+#   executed, we reset the timer shutting it down and re-creating it
+#
+# * Inside the service we remove the marker file, update the
+#   predictions, and if the file is there again we update the
+#   predictions again.  This guarantee that the predictions are also
+#   updated for the latest point that is still required (even if this
+#   means that it is executed multiple times)
+#
+# * In case that a reboot or shutdown is commanded when the service is
+#   running, it will not accept the SIGTERM signal, and will require 2
+#   minutes before forcing it down
+#
+# * Finally, if the reboot or shutdown command is launched before the
+#   timer triggers, a transient service will be executed to run the
+#   update-predictions.  This is done in the ExecStop, because systemd
+#   will stop this service before the reboot
+#
+# * The same marker file is used to detect that there is a pending
+#   update-predictions
+
+set_update_predictions_timer()
+{
+       local to="${1:-2}"
+       # Reset transient timer to `to` seconds (find a better
+       # estimator than a random number)
+       mkdir -p /run/sdbootutil; chmod 700 /run/sdbootutil; touch 
/run/sdbootutil/update-predictions
+       systemctl --quiet is-active sdbootutil-update-predictions.timer && \
+               systemctl stop sdbootutil-update-predictions.timer
+       echo "Resetting sdbootutil-update-predictions timer to $to seconds"
+       systemd-run --on-active="$to" --unit 
sdbootutil-update-predictions.service
+
+       # Set the transient service that will guarantee updating the
+       # prediction before the shutdown
+       if ! systemctl --quiet is-active 
sdbootutil-update-predictions-shutdown.service; then
+               systemd-run 
--unit=sdbootutil-update-predictions-shutdown.service \
+                           --property=Description="Update TPM predictions 
before shutdown" \
+                           --property=ConditionSecurity=tpm2 \
+                           --property=RemainAfterExit=yes \
+                           --property=DefaultDependencies=no \
+                           --property=Conflicts=umount.target \
+                           --property=Before=umount.target \
+                           --property=RequiresMountsFor="/ /var /run /tmp 
/boot/efi" \
+                           --property=TimeoutStopSec=120 \
+                           --property=ExecStop='/bin/bash -c "[ $(systemctl 
is-system-running) = stopping ] && [ -f /run/sdbootutil/update-predictions ] && 
/usr/bin/sdbootutil -v update-predictions || true"' \
+                           /bin/true
+       fi
+}
+
 # When creating a snapshot we fetch all bls configs from previous
 # snapshot dir, mangle them to contain current snapshot number, then
 # install to efi partition.
@@ -21,18 +86,26 @@
        [ "$path" = "/" ] || return 0
        [ "$fs" = btrfs ] || return 1
 
-       /usr/bin/sdbootutil update --sync "$num" || :
+       nohup bash -c "(
+         $(declare -f is_transactional)
+         $(declare -f set_update_predictions_timer)
+
+         /usr/bin/sdbootutil update --disable-predictions \"$num\"
+
+         # If we are in a transactional system we abort here.  The
+         # kernel entries are added later via set_default_snapshot,
+         # when tukit set via snapper the new snapshot as complete
+         is_transactional && return 0
+
+         # The entries are added here only for Tumbleweed
+         # (non-transactional systems)
+         /usr/bin/sdbootutil add-all-kernels --disable-predictions \"$num\"
+         # In Tumbleweed clean the default snapshot, not the new
+         # created
+         /usr/bin/sdbootutil cleanup --disable-predictions
 
-       # If we are in a transactional system we abort here.  The
-       # kernel entries are added later via set_default_snapshot,
-       # when tukit set via snapper the new snapshot as complete
-       is_transactional && return 0
-
-       # The entries are added here only for Tumbleweed
-       # (non-transactional systems)
-       /usr/bin/sdbootutil add-all-kernels "$num" || :
-       # In Tumbleweed clean the default snapshot, not the new created
-       /usr/bin/sdbootutil cleanup || :
+         set_update_predictions_timer 30
+       )" 2>&1 | logger &
 }
 
 delete_snapshot()
@@ -44,8 +117,14 @@
        [ "$path" = "/" ] || return 0
        [ "$fs" = btrfs ] || return 1
 
-       /usr/bin/sdbootutil remove-all-kernels "$num" || :
-       /usr/bin/sdbootutil cleanup "$num" || :
+       nohup bash -c "(
+         $(declare -f set_update_predictions_timer)
+
+         /usr/bin/sdbootutil remove-all-kernels --disable-predictions \"$num\"
+         /usr/bin/sdbootutil cleanup --disable-predictions \"$num\"
+
+         set_update_predictions_timer
+       )" 2>&1 | logger &
 }
 
 set_default_snapshot()
@@ -57,19 +136,26 @@
        [ "$path" = "/" ] || return 0
        [ "$fs" = btrfs ] || return 1
 
-       if is_transactional; then
-               # In transactional systems the boot entries are added
-               # here, once the transaction is complete and tukit
-               # decides to keep it
-               /usr/bin/sdbootutil add-all-kernels "$num" || :
-
-               if [ -e /usr/lib/module-init-tools/regenerate-initrd-posttrans 
]; then
-                       /usr/lib/module-init-tools/regenerate-initrd-posttrans
-               fi
-       fi
+       nohup bash -c "(
+         $(declare -f is_transactional)
+         $(declare -f set_update_predictions_timer)
+
+         if is_transactional; then
+           # In transactional systems the boot entries are added
+           # here, once the transaction is complete and tukit
+           # decides to keep it
+           /usr/bin/sdbootutil add-all-kernels --disable-predictions \"$num\"
+
+           if [ -e /usr/lib/module-init-tools/regenerate-initrd-posttrans ]; 
then
+             /usr/lib/module-init-tools/regenerate-initrd-posttrans
+           fi
+         fi
+
+         /usr/bin/sdbootutil set-default-snapshot --disable-predictions 
\"$num\"
+         /usr/bin/sdbootutil update --disable-predictions --sync \"$num\"
 
-       /usr/bin/sdbootutil set-default-snapshot "$num" || :
-       /usr/bin/sdbootutil update --sync "$num" || :
+         set_update_predictions_timer
+       )" 2>&1 | logger &
 }
 
 h()
@@ -78,6 +164,34 @@
        echo "${!commands[@]}"
 }
 
+# In Tumbleweed (non-transactional btrfs) the ordering of events are
+# (for last snapshot n):
+# * create-snapshot-pre / btrfs n+1   # "pre" snapshot
+# * create-snapshot / btrfs n+1       # "pre" snapshot
+# * create-snapshot-post / btrfs n+1  # "pre" snapshot
+# * modify-snapshot-pre / btrfs n+1
+# * modify-snapshot / btrfs n+1
+# * modify-snapshot-post / btrfs n+1
+# * create-snapshot-pre / btrfs n+2   # "post" snapshot
+# * create-snapshot / btrfs n+2       # "post" snapshot
+# * create-snapshot-post / btrfs n+2  # "post" snapshot
+#
+# In MicroOS (transactional btrfs) the ordering is:
+# * create-snapshot-pre / btrfs n+1
+# * create-snapshot / btrfs n+1
+# * create-snapshot-post / btrfs n+1
+# * modify-snapshot-pre / btrfs n+1
+# * modify-snapshot / btrfs n+1
+# * modify-snapshot-post / btrfs n+1
+# * set-read-only-pre / btrfs n+1
+# * set-read-only-post / btrfs n+1
+# * set-default-snapshot-pre / btrfs n+1   # Not is snapperd.logs
+# * set-default-snapshot / btrfs n+1       # Not is snapperd.logs
+# * set-default-snapshot-post / btrfs n+1  # Not is snapperd.logs
+
+# For "timeline" snapshots only the create-snapshot-* events are
+# emitted
+
 declare -A commands
 
 commands['create-snapshot-post']=create_snapshot
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/sdbootutil-1+git20260506.25d47bf/completions/bash_sdbootutil 
new/sdbootutil-1+git20260706.f9f4faf/completions/bash_sdbootutil
--- old/sdbootutil-1+git20260506.25d47bf/completions/bash_sdbootutil    
2026-05-06 20:45:00.000000000 +0200
+++ new/sdbootutil-1+git20260706.f9f4faf/completions/bash_sdbootutil    
2026-07-06 10:53:28.000000000 +0200
@@ -113,6 +113,9 @@
        elif [ "$opt_arg_fun" == "_path" ]; then
                # shellcheck disable=SC2207
                COMPREPLY=($(compgen -d -- "$cur"))
+       elif [ "$opt_arg_fun" == "_file" ]; then
+               # shellcheck disable=SC2207
+               COMPREPLY=($(compgen -f -- "$cur"))
        elif [ "$opt_arg_fun" ]; then
                eval "$opt_arg_fun"
                # shellcheck disable=SC2207
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/sdbootutil-1+git20260506.25d47bf/sdbootutil 
new/sdbootutil-1+git20260706.f9f4faf/sdbootutil
--- old/sdbootutil-1+git20260506.25d47bf/sdbootutil     2026-05-06 
20:45:00.000000000 +0200
+++ new/sdbootutil-1+git20260706.f9f4faf/sdbootutil     2026-07-06 
10:53:28.000000000 +0200
@@ -45,7 +45,9 @@
 arg_rootfs=
 arg_rootfs_data=
 arg_esp_free_space=
+arg_devicetree_source=
 arg_force=
+arg_disable_predictions=
 have_snapshots=
 in_buildroot=
 # Possible values: vmlinuz image vmlinux linux bzImage uImage Image zImage
@@ -145,7 +147,17 @@
                                        (uuid, partuuid, label, partlabel, 
device)
                  --rootfs-data         Extra data when --rootfs is used
                  --esp-free-space      Percentage of free space in the ESP
+                 --devicetree-source   Absolute source path of a device tree 
blob to copy
+                                       into the boot partition and reference 
from generated
+                                       BLS entries. The source path is 
resolved in the
+                                       target rootfs/snapshot. %K expands to 
the full
+                                       kernel version and %V to the kernel 
package version
+                                       without the flavor suffix. If 
configured, the
+                                       resolved file must exist and be 
readable, and
+                                       must be usable without Secure Boot, or 
kernel
+                                       installation is aborted.
                  --force               Force certain operations inside a 
transaction
+                 --disable-predictions Disable automatic update predictions
                  -v, --verbose         More verbose output
                  --start-trace-code    Create /var/log/sdbootutil.log to trace 
the code.
                                        (verbose output is enabled)
@@ -235,6 +247,9 @@
                get-timeout
                           Get the menu timeout in seconds
 
+               print-loader-path
+                          Print path to currently booted boot loader binary
+
                enroll
                           Enroll a TPM2 (+PIN), a FIDO2 key or a password for
                           all devices
@@ -351,6 +366,7 @@
        ROOTFS="${arg_rootfs:-$ROOTFS}"
 
        ESP_FREE_SPACE="${arg_esp_free_space:-10}"
+       DEVICETREE_SOURCE="${arg_devicetree_source:-}"
 }
 
 create_default_config_file()
@@ -371,6 +387,15 @@
        # Percentage (%) of free space in the ESP that sdbootutil should 
guarantee
        # Default values is 10%
        ESP_FREE_SPACE="$ESP_FREE_SPACE"
+
+       # Optional absolute path to a device tree blob. If set, it is copied to 
the
+       # boot partition and a devicetree field is added to generated BLS 
entries.
+       # The source path is resolved in the target rootfs/snapshot. %K expands 
to
+       # the full kernel version, %V to the kernel package version without the
+       # flavor suffix. If set, the resolved file must exist and be readable,
+       # otherwise kernel installation aborts. Currently supported only with
+       # Secure Boot disabled.
+       DEVICETREE_SOURCE="$DEVICETREE_SOURCE"
        EOF
 }
 
@@ -405,6 +430,7 @@
        FDE_SEAL_PCR_LIST="${arg_pcr:-$FDE_SEAL_PCR_LIST}"
        ROOTFS="${arg_rootfs:-$ROOTFS}"
        ESP_FREE_SPACE="${arg_esp_free_space:-$ESP_FREE_SPACE}"
+       DEVICETREE_SOURCE="${arg_devicetree_source:-$DEVICETREE_SOURCE}"
 }
 
 is_secure_boot()
@@ -678,6 +704,11 @@
        update_entries jq 
"[.[]|select(has(\"options\"))|select(.options|test(\"root=(?:$root)\"))]"
 }
 
+update_entries_for_extra()
+{
+       update_entries jq 
"[.[]|select((.linux//.efi//\"\")|startswith(\"/EFI/extra\"))]"
+}
+
 entry_conf_file()
 {
        local kernel_version="${1:?}"
@@ -823,7 +854,7 @@
        fi
        rollback+=("$old")
        install -p -m 0644 "$src" "$dst" || return "$?"
-       chown root:root "$dst" 2> /dev/null || :
+       chown root:root "$dst" 2> /dev/null || true
        info "Installed $dst"
 }
 
@@ -906,9 +937,9 @@
        local conf
 
        [ -z "$arg_no_reuse_initrd" ] || return 1
-       settle_entry_token "${snapshot}"
+       settle_entry_token "$snapshot"
 
-       conf="$(find_conf_file "$kernel_version" "${snapshot}")"
+       conf="$(find_conf_file "$kernel_version" "$snapshot")"
        local find_conf_status=$?
 
        if [ $find_conf_status -ne 0 ]; then
@@ -1023,6 +1054,16 @@
        echo $((size / 1024 + 1))
 }
 
+pending_devicetree_size()
+{
+       local devicetree="$1"
+       [ -n "$devicetree" ] || {
+               echo 0
+               return 0
+       }
+       echo $(($(stat -L -c %s "$devicetree") / 1024 + 1))
+}
+
 boot_space()
 {
        echo $(($(findmnt --noheadings --bytes -o SIZE --target "${boot_root}" 
| head -n 1) / 1024))
@@ -1171,15 +1212,37 @@
 make_free_space_for_kernel()
 {
        local snapshot="$1"
+       local kernel="$2"
+       local initrds="$3"
+       local devicetree="${4:-}"
 
        # Calculate the free space and the required size.  All sizes
        # are in Kb to avoid big numbers
        local free_space total_size
-       total_size=$(($(pending_kernel_size "$src") + $(pending_initrds_size 
"$tmpdir")))
+       total_size=$(($(pending_kernel_size "$kernel") + $(pending_initrds_size 
"$initrds") + $(pending_devicetree_size "$devicetree")))
 
        make_free_space "$snapshot" "$total_size"
 }
 
+resolve_devicetree_source()
+{
+       local subvol="$1"
+       local kernel_version="$2"
+       local kernel_package_version="${kernel_version%-*}"
+       local devicetree_source="${DEVICETREE_SOURCE:-}"
+
+       [ -n "$devicetree_source" ] || return 0
+       devicetree_source="${devicetree_source//%K/$kernel_version}"
+       devicetree_source="${devicetree_source//%V/$kernel_package_version}"
+       [[ "$devicetree_source" == '/'* ]] || err "DEVICETREE_SOURCE must be an 
absolute path"
+
+       local snapshot_prefix="${subvol#"${subvol_prefix}"}"
+       devicetree_source="$snapshot_prefix$devicetree_source"
+       [ -f "$devicetree_source" ] || err "Can't find device tree blob 
$devicetree_source"
+       [ -r "$devicetree_source" ] || err "Device tree blob is not readable: 
$devicetree_source"
+       echo "$devicetree_source"
+}
+
 create_boot_options() {
        local subvol="$1"
        local cmdline
@@ -1239,10 +1302,32 @@
        calc_chksum "$src"
        settle_entry_token "${snapshot}"
        local dst="/$entry_token/$kernel_version/linux-$chksum"
+       local devicetree_src=
+       local devicetree_dst=
+
+       # Because nullglob, the second condition can be false
+       # shellcheck disable=SC2144 disable=SC2157
+       [ -z "${boot_root}${dst}" ] \
+               || [ -z "${boot_root}/$entry_token/$kernel_version/initrd-"* ] \
+               || ! find_conf_file "$kernel_version" "$snapshot" > /dev/null \
+               || [ -n "$arg_no_reuse_initrd" ] \
+               || [ -n "$arg_force" ] \
+               || {
+               info "Kernel $kernel_version already in the ESP"
+               return 0
+       }
 
        local initrd="${src%/*}/initrd"
 
-       mkdir -p "${boot_root}${dst%/*}"
+       # Resolve the device tree before creating any ESP directory, so a
+       # missing (but configured) blob aborts without leaving an empty
+       # "$entry_token/$kernel_version" directory behind
+       devicetree_src="$(resolve_devicetree_source "$subvol" 
"$kernel_version")" || err "Failed to resolve DEVICETREE_SOURCE"
+       if [ -n "$devicetree_src" ]; then
+               ! is_secure_boot || err "External devicetree files are not 
supported when Secure Boot is enabled"
+               calc_chksum "$devicetree_src"
+               devicetree_dst="${dst%/*}/devicetree-$chksum.dtb"
+       fi
 
        if [ -e "$initrd" ]; then
                ln -s "$initrd" "$tmpdir/initrd-0"
@@ -1273,7 +1358,7 @@
                fi
        fi
 
-       make_free_space_for_kernel "$snapshot" || err "No free space in 
${boot_root} for new kernel"
+       make_free_space_for_kernel "$snapshot" "$src" "$tmpdir" 
"$devicetree_src" || err "No free space in ${boot_root} for new kernel"
 
        local boot_options
        [ -z "$in_buildroot" ] || 
subvol="${subvol_prefix}/.snapshots/${snapshot}/snapshot"
@@ -1305,7 +1390,7 @@
        title      $title
        version    
${snapshot:+$snapshot@}$kernel_version${entry_machine_id:+${nl}machine-id 
$entry_machine_id}${sort_key:+${nl}sort-key   $sort_key}
        options    $boot_options
-       linux      $dst
+       linux      $dst${devicetree_dst:+${nl}devicetree ${devicetree_dst}}
        EOF
        for i in "${dstinitrd[@]}"; do
                echo "initrd     $i" >> "$tmpdir/entry.conf"
@@ -1313,12 +1398,21 @@
        dbg "Generated new boot entry"
        dbg_cat "$tmpdir/entry.conf"
 
+       mkdir -p "${boot_root}${dst%/*}"
+
        local failed=
        if [ ! -e "${boot_root}$dst" ]; then
                install_with_rollback "$src" "${boot_root}$dst" || failed=kernel
        else
                info "Reusing ${boot_root}$dst"
        fi
+       if [ -z "$failed" ] && [ -n "$devicetree_src" ]; then
+               if [ ! -e "${boot_root}${devicetree_dst}" ]; then
+                       install_with_rollback "$devicetree_src" 
"${boot_root}${devicetree_dst}" || failed=devicetree
+               else
+                       info "Reusing ${boot_root}${devicetree_dst}"
+               fi
+       fi
        if [ -z "$failed" ] && [ -e "$tmpdir/initrd-0" ]; then
                i=0
                while [ -e "$tmpdir/initrd-$i" ]; do
@@ -1483,7 +1577,7 @@
                        local k
                        local v
                        while read -r k v; do
-                               if [ "$k" = 'linux' ] || [ "$k" = 'initrd' ]; 
then
+                               if [ "$k" = 'linux' ] || [ "$k" = 'initrd' ] || 
[ "$k" = 'devicetree' ]; then
                                        if [ ! -e "$root$v" ]; then
                                                errors+=("$root/$v does not 
exist")
                                        fi
@@ -1523,7 +1617,7 @@
        local v
        while read -r k v; do
                case "$k" in
-                       title|version|sort-key|options|linux|initrd) ;;
+                       title|version|sort-key|options|linux|initrd|devicetree) 
;;
                        *) continue ;;
                esac
 
@@ -1892,6 +1986,106 @@
           ' < "$devicefile"
 }
 
+extra_entry_needs_update()
+{
+       local entry="$1"
+
+       # If we do not have a version in the entry file (or the entry
+       # file is missing), then we assume that an update is required
+       [ -n "$entry" ] || return 0
+       read -r _ nv < <(grep -ao '^version .*$' "$entry")
+       [ -n "$nv" ] || return 0
+
+       entry="${boot_root}/loader/entries/$(basename "$entry")"
+       [ -f "$entry" ] || return 0
+       read -r _ v < <(grep -ao '^version .*$' "$entry")
+       [ -n "$v" ] || return 0
+
+       systemd-analyze compare-versions "$v" "<" "$nv" 2> /dev/null
+}
+
+install_extra_entry()
+{
+       local subvol="$1"
+       local entry="$2"
+
+       local -A e
+       local -a l
+       while read -r line; do
+               [[ "$line" == '#'* ]] && continue
+               IFS="=" read -r -a l <<<"$line"
+               [ "${#l[@]}" -eq 2 ] || err "Cannot parse line $line"
+               e["${l[0]}"]="${l[1]}"
+       done < "$entry"
+
+       [ -n "${e[EFI]}" ] || return 0
+       [ -f "${subvol:1}${e[EFI]}" ] || err "Missing extra entry file 
${e[EFI]}"
+       [ -z "${e[ENTRY]}" ] || [ -f "${subvol:1}${e[ENTRY]}" ] || err "Missing 
extra entry file ${e[ENTRY]}"
+
+       # If the file can be installed, echo the name so it can be
+       # registered as installed (even if does not needs to be
+       # updated)
+       echo "/EFI/extra/$(basename "${e[EFI]}")"
+
+       extra_entry_needs_update "${subvol:1}${e[ENTRY]}" || return 0
+
+       mkdir -p "${esp_root}/EFI/extra"
+       install -p -D "${subvol:1}${e[EFI]}" "${esp_root}/EFI/extra"
+       [ -z "${e[ENTRY]}" ] || install -p -D "${subvol:1}${e[ENTRY]}" 
"${boot_root}/loader/entries"
+}
+
+install_extra_entries()
+{
+       local snapshot="$1"
+
+       local subvol=""
+       [ -z "$have_snapshots" ] || 
subvol="${subvol_prefix}/.snapshots/${snapshot}/snapshot"
+
+       update_entries_for_extra
+
+       local efi install_extra_entry_status
+       local -A entries
+       for i in "${subvol:1}"/usr/lib/sdbootutil/entries.d/*.conf; do
+               [ -e "${subvol:1}/etc/sdbootutil/entries.d/$(basename "$i")" ] 
&& continue
+               dbg_cat "$i"
+               efi="$(install_extra_entry "$subvol" "$i")"
+               install_extra_entry_status=$?
+               [ "$install_extra_entry_status" -eq 0 ] || {
+                       warn "Error installing extra entry $(basename "$i")"
+               }
+               [ -z "$efi" ] || entries["$efi"]=1
+       done
+
+       for i in "${subvol:1}"/etc/sdbootutil/entries.d/*.conf; do
+               dbg_cat "$i"
+               efi="$(install_extra_entry "$subvol" "$i")"
+               install_extra_entry_status=$?
+               [ "$install_extra_entry_status" -eq 0 ] || {
+                       warn "Error installing extra entry $(basename "$i")"
+               }
+               [ -z "$efi" ] || entries["$efi"]=1
+       done
+
+       # Remove the entry + efi pairs not installed
+       local entry
+       while read -r efi; do
+               read -r entry
+               [ -n "${entries[$efi]}" ] || {
+                       rm -f "${esp_root}/EFI${efi}"
+                       rm -f "$entry"
+               }
+       done < <(jq -r '.[] | .linux // .efi, .path' < "$entryfile")
+
+       # Finally, remove the single efi files not installed
+       for i in "${esp_root}"/EFI/extra/*; do
+               efi="${i#"${esp_root}"}"
+               [ "${entries[$efi]:-0}" -eq 1 ] || rm -f "${esp_root}${efi}"
+       done
+
+       # This action will require to update the PCR predictions
+       update_predictions=1
+}
+
 install_bootloader()
 {
        local snapshot=""
@@ -2009,6 +2203,8 @@
                info "The bootloader will be downgraded"
                install_bootloader "${1:-$root_snapshot}"
        fi
+
+       install_extra_entries "${1:-$root_snapshot}"
 }
 
 hex_to_binary()
@@ -2334,6 +2530,28 @@
        fi
 }
 
+print_loader_path()
+{
+       local loader_path
+       loader_path="$(bootctl --print-loader-path 2> /dev/null)" && {
+               echo "${loader_path}"
+               return 0
+       } || true
+
+       # Simple approach: try the different options
+       local bootloader
+       bootloader=$(find_bootloader "$snapshot")
+       for i in "grub.efi" "${bootloader##*/}" "BOOT${firmware_arch^^}.EFI"; do
+               if [ -e "${esp_root}${esp_dst}/$i" ]; then
+                       echo "${esp_root}${esp_dst}/$i"
+                       return 0
+               fi
+       done
+
+       echo "No loader EFI binary path found"
+       return 1
+}
+
 set_default_snapshot()
 {
        [ -n "$have_snapshots" ] || {
@@ -2613,10 +2831,12 @@
 {
        local linux="$1"
        local initrd="$2"
-       local cmdline="$3"
-       local suffix="$4"
+       local devicetree="$3"
+       local cmdline="$4"
+       local suffix="$5"
 
        local elements=("$linux" "$initrd")
+       [ -z "$devicetree" ] || elements+=("$devicetree")
        local locks=()
        local n=0
        for element in "${elements[@]}"; do
@@ -2671,8 +2891,10 @@
        local linux="$1"
        local cmdline="$2"
        local initrd="$3"
-       local suffix="$4"
+       local devicetree="$4"
+       local suffix="$5"
        local lines=("$linux" "$cmdline" "$initrd")
+       [ -z "$devicetree" ] || lines+=("$devicetree")
 
        local locks=()
        local n=0
@@ -2836,6 +3058,7 @@
        while read -r options; do
                read -r linux
                read -r initrd
+               read -r devicetree
                [ -f "${esp_root}$linux" ] || {
                        info "Missing ${esp_root}$linux, ignoring entry for 
prediction"
                        continue
@@ -2844,6 +3067,10 @@
                        info "Missing ${esp_root}$initrd, ignoring entry for 
prediction"
                        continue
                }
+               if [ -n "$devicetree" ] && [ ! -f "${esp_root}$devicetree" ]; 
then
+                       info "Missing ${esp_root}$devicetree, ignoring entry 
for prediction"
+                       continue
+               fi
                n=$((n+1))
                [ "$n" -le 8 ] || {
                        info "More than 8 variations for 
650-grub2-bls-entry-cmdline"
@@ -2851,8 +3078,10 @@
                }
                pcrlock_grub2_bls_cmdline "linux ${grub2_bls_drive}$linux 
$options" \
                                          "${grub2_bls_drive}$linux $options" \
-                                         "initrd ${grub2_bls_drive}$initrd" 
"$n"
-       done < <(jq --raw-output 'sort_by(.priority, (.kernel | map(-.))) | .[] 
| .options, .linux, .initrd[0]' "$entryfile")
+                                         "initrd ${grub2_bls_drive}$initrd" \
+                                         "${devicetree:+devicetree 
${grub2_bls_drive}$devicetree}" \
+                                         "$n"
+       done < <(jq --raw-output 'sort_by(.priority, (.kernel | map(-.))) | .[] 
| .options, .linux, .initrd[0], (.devicetree // "")' "$entryfile")
 
        # Generate variation for 650-grub2-bls-entry-cmdline component
        # that contains the current cmdline and the current initrd,
@@ -2865,11 +3094,14 @@
                while read -r options; do
                        read -r linux
                        read -r initrd
+                       read -r devicetree
                        n=$((n+1))
                        pcrlock_grub2_bls_cmdline "linux 
${grub2_bls_drive}$linux $options" \
                                                  "${grub2_bls_drive}$linux 
$options" \
-                                                 "initrd 
${grub2_bls_drive}$initrd" "0-$n"
-               done < <(jq --raw-output '.[] | .options, .linux, .initrd[0]' 
"$initialentryfile")
+                                                 "initrd 
${grub2_bls_drive}$initrd" \
+                                                 "${devicetree:+devicetree 
${grub2_bls_drive}$devicetree}" \
+                                                 "0-$n"
+               done < <(jq --raw-output '.[] | .options, .linux, .initrd[0], 
(.devicetree // "")' "$initialentryfile")
        fi
 
        # If shim is installed, grub2-bls invokes shim to extend PCR4
@@ -2949,6 +3181,7 @@
        while read -r cmdline; do
                read -r linux
                read -r initrd
+               read -r devicetree
                [ -f "${esp_root}$linux" ] || {
                        info "Missing ${esp_root}$linux, ignoring entry for 
prediction"
                        continue
@@ -2957,13 +3190,21 @@
                        info "Missing ${esp_root}$initrd, ignoring entry for 
prediction"
                        continue
                }
+               if [ -n "$devicetree" ] && [ ! -f "${esp_root}$devicetree" ]; 
then
+                       info "Missing ${esp_root}$devicetree, ignoring entry 
for prediction"
+                       continue
+               fi
                n=$((n+1))
                [ "$n" -le 4 ] || {
                        info "More than 4 variations for 
710-grub2-bls-kernel-initrd-entry"
                        continue
                }
-               pcrlock_grub2_bls_kernel_initrd_cmdline_initrd 
"${esp_root}$linux" "${esp_root}$initrd" "BOOT_IMAGE=${grub2_bls_drive}$linux 
$cmdline" "$n"
-       done < <(jq --raw-output 'sort_by(.priority, (.kernel | map(-.))) | .[] 
| .options, .linux, .initrd[0]' "$entryfile")
+               pcrlock_grub2_bls_kernel_initrd_cmdline_initrd \
+                       "${esp_root}$linux" "${esp_root}$initrd" \
+                       "${devicetree:+${esp_root}$devicetree}" \
+                       "BOOT_IMAGE=${grub2_bls_drive}$linux $cmdline" \
+                       "$n"
+       done < <(jq --raw-output 'sort_by(.priority, (.kernel | map(-.))) | .[] 
| .options, .linux, .initrd[0], (.devicetree // "")' "$entryfile")
 
        # Generate variation for
        # 710-grub2-bls-kernel-initrd-kernel-cmdline-initrd-entry for
@@ -2973,9 +3214,14 @@
                while read -r cmdline; do
                        read -r linux
                        read -r initrd
+                       read -r devicetree
                        n=$((n+1))
-                       pcrlock_grub2_bls_kernel_initrd_cmdline_initrd 
"${tmpdir}$linux" "${tmpdir}$initrd" "BOOT_IMAGE=${grub2_bls_drive}$linux 
$cmdline" "0-$n"
-               done < <(jq --raw-output '.[] | .options, .linux, .initrd[0]' 
"$initialentryfile")
+                       pcrlock_grub2_bls_kernel_initrd_cmdline_initrd \
+                               "${tmpdir}$linux" "${tmpdir}$initrd" \
+                               "${devicetree:+${tmpdir}$devicetree}" \
+                               "BOOT_IMAGE=${grub2_bls_drive}$linux $cmdline" \
+                               "0-$n"
+               done < <(jq --raw-output '.[] | .options, .linux, .initrd[0], 
(.devicetree // "")' "$initialentryfile")
        fi
 }
 
@@ -3032,7 +3278,7 @@
 
        # If no PCRs are included, we are starting from a very
        # misaligned event log (initial installation, for example)
-       [ ! "$output" = "{}" ] || {
+       [ "$output" != "{}" ] || {
                echo "$pcrs"
                return 0
        }
@@ -3429,6 +3675,10 @@
                return 0
        }
 
+       [ -z "${DEVICETREE_SOURCE:-}" ] || ! is_sdboot || {
+               warn "TPM2 predictions with systemd-boot devicetree entries are 
not validated. Use --disable-predictions if this affects boot."
+       }
+
        ! is_pcr_oracle || {
                warn "System enrolled with pcr-oracle. Re-enroll to use 
systemd-pcrlock"
                return 0
@@ -4124,6 +4374,7 @@
                [get-default]=""
                [set-timeout]="seconds"
                [get-timeout]=""
+               [print-loader-path]=""
                [enroll]=""
                [unenroll]=""
                [update-predictions]=""
@@ -4163,7 +4414,9 @@
                [rootfs]="_rootfs"
                [rootfs-data]="_rootfs_data"
                [esp-free-space]="_esp_free_space"
+               [devicetree-source]="_file"
                [force]=""
+               [disable-predictions]=""
        )
        opts_long=""
        for opt in "${!options_with_arg[@]}"; do
@@ -4220,7 +4473,9 @@
                --rootfs) arg_rootfs="$2"; shift 2 ;;
                --rootfs-data) arg_rootfs_data="$2"; shift 2 ;;
                --esp-free-space) arg_esp_free_space="$2"; shift 2 ;;
+               --devicetree-source) arg_devicetree_source="$2"; shift 2 ;;
                --force) arg_force=1; shift ;;
+               --disable-predictions) arg_disable_predictions=1; shift ;;
                --) shift ; break ;;
                *) echo "Internal error!" ; exit 1 ;;
        esac
@@ -4275,7 +4530,7 @@
 fi
 
 if [ -n "$arg_esp_path" ] && [ "$esp_root" != "$arg_esp_path" ]; then
-       err "mismatch of esp path"
+       err "Mismatch of ESP path"
 fi
 [ -n "$arg_arch" ] && firmware_arch="$arg_arch"
 
@@ -4360,6 +4615,7 @@
 case "$1" in
        install)
                install_bootloader "${2:-$root_snapshot}"
+               install_extra_entries "${2:-$root_snapshot}"
                create_default_config_file ;;
        needs-update)
                bootloader_needs_update "${2:-$root_snapshot}" ;;
@@ -4420,6 +4676,8 @@
                set_timeout "$2" ;;
        get-timeout)
                get_timeout "$2" ;;
+       print-loader-path)
+               print_loader_path ;;
        enroll)
                enroll ;;
        unenroll)
@@ -4430,4 +4688,4 @@
                helpandquit ;;
 esac
 
-[ -z "$update_predictions" ] || generate_tpm2_predictions
+[ -z "$update_predictions" ] || [ -n "$arg_disable_predictions" ] || 
generate_tpm2_predictions
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/sdbootutil-1+git20260506.25d47bf/sdbootutil-update-predictions.service 
new/sdbootutil-1+git20260706.f9f4faf/sdbootutil-update-predictions.service
--- old/sdbootutil-1+git20260506.25d47bf/sdbootutil-update-predictions.service  
2026-05-06 20:45:00.000000000 +0200
+++ new/sdbootutil-1+git20260706.f9f4faf/sdbootutil-update-predictions.service  
2026-07-06 10:53:28.000000000 +0200
@@ -4,19 +4,29 @@
 
 [Service]
 Type=oneshot
-RemainAfterExit=yes
 KeyringMode=shared
 PrivateTmp=yes
 ExecStartPre=/usr/bin/sh -c 'mkdir "/tmp/$INVOCATION_ID"; cp -a 
/var/lib/pcrlock.d /tmp/$INVOCATION_ID/pcrlock.d'
-ExecStart=/usr/bin/sdbootutil -v update-predictions
+ExecStart=/usr/bin/sh -c '\
+    while true; do \
+        rm -f /run/sdbootutil/update-predictions; \
+        /usr/bin/sdbootutil -v update-predictions || exit $?; \
+       [ -f /run/sdbootutil/update-predictions ] || break; \
+    done'
 ExecStopPost=/usr/bin/sh -c '\
+    systemctl --quiet is-active sdbootutil-update-predictions-shutdown.service 
&& systemctl stop sdbootutil-update-predictions-shutdown.service; \
     if [ "$SERVICE_RESULT" != "success" ]; then \
         echo "Command failed. Reason: $SERVICE_RESULT (Status: $EXIT_STATUS). 
Restoring backup..."; \
         rm -rf /var/lib/pcrlock.d/*; \
         cp -a "/tmp/$INVOCATION_ID/pcrlock.d/." /var/lib/pcrlock.d/; \
     fi; \
-    rm -rf "/tmp/$INVOCATION_ID/pcrlock.d"'
+    rm -rf "/tmp/$INVOCATION_ID"'
 ImportCredential=sdbootutil-update-predictions.*
+# The service can be triggered by a timer (snapper plugin), this
+# prevents systemd from killing the script mid-run during a reboot,
+# and gives 2 minutes to complete
+KillSignal=SIGCONT
+TimeoutStopSec=120
 
 [Install]
 WantedBy=default.target
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/sdbootutil-1+git20260506.25d47bf/uhmac/Cargo.lock 
new/sdbootutil-1+git20260706.f9f4faf/uhmac/Cargo.lock
--- old/sdbootutil-1+git20260506.25d47bf/uhmac/Cargo.lock       2026-05-06 
20:45:00.000000000 +0200
+++ new/sdbootutil-1+git20260706.f9f4faf/uhmac/Cargo.lock       2026-07-06 
10:53:28.000000000 +0200
@@ -4,9 +4,9 @@
 
 [[package]]
 name = "anstream"
-version = "0.6.19"
+version = "1.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "301af1932e46185686725e0fad2f8f2aa7da69dd70bf6ecc44d6b703844a3933"
+checksum = "824a212faf96e9acacdbd09febd34438f8f711fb84e09a8916013cd7815ca28d"
 dependencies = [
  "anstyle",
  "anstyle-parse",
@@ -19,33 +19,33 @@
 
 [[package]]
 name = "anstyle"
-version = "1.0.11"
+version = "1.0.14"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "862ed96ca487e809f1c8e5a8447f6ee2cf102f846893800b20cebdf541fc6bbd"
+checksum = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000"
 
 [[package]]
 name = "anstyle-parse"
-version = "0.2.7"
+version = "1.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2"
+checksum = "52ce7f38b242319f7cabaa6813055467063ecdc9d355bbb4ce0c68908cd8130e"
 dependencies = [
  "utf8parse",
 ]
 
 [[package]]
 name = "anstyle-query"
-version = "1.1.3"
+version = "1.1.5"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "6c8bdeb6047d8983be085bab0ba1472e6dc604e7041dbf6fcd5e71523014fae9"
+checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc"
 dependencies = [
  "windows-sys",
 ]
 
 [[package]]
 name = "anstyle-wincon"
-version = "3.0.9"
+version = "3.0.11"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "403f75924867bb1033c59fbf0797484329750cfbe3c4325cd33127941fabc882"
+checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d"
 dependencies = [
  "anstyle",
  "once_cell_polyfill",
@@ -54,30 +54,31 @@
 
 [[package]]
 name = "bitflags"
-version = "2.9.1"
+version = "2.13.0"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967"
+checksum = "b4388bee8683e3d04af747c73422af53102d2bd24d9eadb6cbc100baef4b43f8"
 
 [[package]]
 name = "cc"
-version = "1.2.26"
+version = "1.2.65"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "956a5e21988b87f372569b66183b78babf23ebc2e744b733e4350a752c4dafac"
+checksum = "e228eec9be7c17ccb640b59b36a5cd805ea2a564a4c5e162c2f659fea30d3b96"
 dependencies = [
+ "find-msvc-tools",
  "shlex",
 ]
 
 [[package]]
 name = "cfg-if"
-version = "1.0.1"
+version = "1.0.4"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268"
+checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801"
 
 [[package]]
 name = "clap"
-version = "4.5.40"
+version = "4.6.1"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "40b6887a1d8685cebccf115538db5c0efe625ccac9696ad45c409d96566e910f"
+checksum = "1ddb117e43bbf7dacf0a4190fef4d345b9bad68dfc649cb349e7d17d28428e51"
 dependencies = [
  "clap_builder",
  "clap_derive",
@@ -85,9 +86,9 @@
 
 [[package]]
 name = "clap_builder"
-version = "4.5.40"
+version = "4.6.0"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "e0c66c08ce9f0c698cbce5c0279d0bb6ac936d8674174fe48f736533b964f59e"
+checksum = "714a53001bf66416adb0e2ef5ac857140e7dc3a0c48fb28b2f10762fc4b5069f"
 dependencies = [
  "anstream",
  "anstyle",
@@ -97,9 +98,9 @@
 
 [[package]]
 name = "clap_derive"
-version = "4.5.40"
+version = "4.6.1"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "d2c7947ae4cc3d851207c1adb5b5e260ff0cca11446b1d6d1423788e442257ce"
+checksum = "f2ce8604710f6733aa641a2b3731eaa1e8b3d9973d5e3565da11800813f997a9"
 dependencies = [
  "heck",
  "proc-macro2",
@@ -109,15 +110,21 @@
 
 [[package]]
 name = "clap_lex"
-version = "0.7.5"
+version = "1.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "b94f61472cee1439c0b966b47e3aca9ae07e45d070759512cd390ea2bebc6675"
+checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9"
 
 [[package]]
 name = "colorchoice"
-version = "1.0.4"
+version = "1.0.5"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570"
+
+[[package]]
+name = "find-msvc-tools"
+version = "0.1.9"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75"
+checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582"
 
 [[package]]
 name = "foreign-types"
@@ -148,39 +155,32 @@
 
 [[package]]
 name = "is_terminal_polyfill"
-version = "1.70.1"
+version = "1.70.2"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf"
+checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695"
 
 [[package]]
 name = "libc"
-version = "0.2.172"
+version = "0.2.186"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa"
-
-[[package]]
-name = "once_cell"
-version = "1.21.3"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d"
+checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66"
 
 [[package]]
 name = "once_cell_polyfill"
-version = "1.70.1"
+version = "1.70.2"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad"
+checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe"
 
 [[package]]
 name = "openssl"
-version = "0.10.73"
+version = "0.10.81"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "8505734d46c8ab1e19a1dce3aef597ad87dcb4c37e7188231769bd6bd51cebf8"
+checksum = "77823a27f0babb03091cb9ed9ef80af3b39dbc82f97e8fa530374b7dafd87a45"
 dependencies = [
  "bitflags",
  "cfg-if",
  "foreign-types",
  "libc",
- "once_cell",
  "openssl-macros",
  "openssl-sys",
 ]
@@ -198,9 +198,9 @@
 
 [[package]]
 name = "openssl-sys"
-version = "0.9.109"
+version = "0.9.117"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "90096e2e47630d78b7d1c20952dc621f957103f8bc2c8359ec81290d75238571"
+checksum = "b47e7e6bb2c38cd930d25a23b40fa52e068c10e85f3e03a7f5ba5aaca5713695"
 dependencies = [
  "cc",
  "libc",
@@ -210,33 +210,33 @@
 
 [[package]]
 name = "pkg-config"
-version = "0.3.32"
+version = "0.3.33"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c"
+checksum = "19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e"
 
 [[package]]
 name = "proc-macro2"
-version = "1.0.95"
+version = "1.0.106"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778"
+checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934"
 dependencies = [
  "unicode-ident",
 ]
 
 [[package]]
 name = "quote"
-version = "1.0.40"
+version = "1.0.46"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d"
+checksum = "dfbc457d0c7a0759a614551b11a6409e5951f6c7537be1f1b7682b9ae9230368"
 dependencies = [
  "proc-macro2",
 ]
 
 [[package]]
 name = "shlex"
-version = "1.3.0"
+version = "2.0.1"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
+checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba"
 
 [[package]]
 name = "strsim"
@@ -246,9 +246,9 @@
 
 [[package]]
 name = "syn"
-version = "2.0.103"
+version = "2.0.118"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "e4307e30089d6fd6aff212f2da3a1f9e32f3223b1f010fb09b7c95f90f3ca1e8"
+checksum = "1b9ae57f904213ebb649ce6895b8a66c66f0203b9319718f69a5612a065b1422"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -266,9 +266,9 @@
 
 [[package]]
 name = "unicode-ident"
-version = "1.0.18"
+version = "1.0.24"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512"
+checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75"
 
 [[package]]
 name = "utf8parse"
@@ -283,74 +283,16 @@
 checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426"
 
 [[package]]
-name = "windows-sys"
-version = "0.59.0"
+name = "windows-link"
+version = "0.2.1"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b"
-dependencies = [
- "windows-targets",
-]
+checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5"
 
 [[package]]
-name = "windows-targets"
-version = "0.52.6"
+name = "windows-sys"
+version = "0.61.2"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973"
+checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc"
 dependencies = [
- "windows_aarch64_gnullvm",
- "windows_aarch64_msvc",
- "windows_i686_gnu",
- "windows_i686_gnullvm",
- "windows_i686_msvc",
- "windows_x86_64_gnu",
- "windows_x86_64_gnullvm",
- "windows_x86_64_msvc",
+ "windows-link",
 ]
-
-[[package]]
-name = "windows_aarch64_gnullvm"
-version = "0.52.6"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
-
-[[package]]
-name = "windows_aarch64_msvc"
-version = "0.52.6"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
-
-[[package]]
-name = "windows_i686_gnu"
-version = "0.52.6"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"
-
-[[package]]
-name = "windows_i686_gnullvm"
-version = "0.52.6"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
-
-[[package]]
-name = "windows_i686_msvc"
-version = "0.52.6"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
-
-[[package]]
-name = "windows_x86_64_gnu"
-version = "0.52.6"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
-
-[[package]]
-name = "windows_x86_64_gnullvm"
-version = "0.52.6"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
-
-[[package]]
-name = "windows_x86_64_msvc"
-version = "0.52.6"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/sdbootutil-1+git20260506.25d47bf/uhmac/Cargo.toml 
new/sdbootutil-1+git20260706.f9f4faf/uhmac/Cargo.toml
--- old/sdbootutil-1+git20260506.25d47bf/uhmac/Cargo.toml       2026-05-06 
20:45:00.000000000 +0200
+++ new/sdbootutil-1+git20260706.f9f4faf/uhmac/Cargo.toml       2026-07-06 
10:53:28.000000000 +0200
@@ -4,6 +4,6 @@
 edition = "2024"
 
 [dependencies]
-clap = { version = "4.5.38", features = ["derive"] }
+clap = { version = "4.6.1", features = ["derive"] }
 hex = "0.4.3"
-openssl = "0.10.72"
+openssl = "0.10.81"

++++++ sdbootutil.obsinfo ++++++
--- /var/tmp/diff_new_pack.pW9gQ5/_old  2026-07-06 13:11:45.141559162 +0200
+++ /var/tmp/diff_new_pack.pW9gQ5/_new  2026-07-06 13:11:45.145559301 +0200
@@ -1,5 +1,5 @@
 name: sdbootutil
-version: 1+git20260506.25d47bf
-mtime: 1778093100
-commit: 25d47bf10ddc4b8b8c6061e82670e8f82fe8916b
+version: 1+git20260706.f9f4faf
+mtime: 1783328008
+commit: f9f4faf9ccf726e6a2943f6b94e5b087ede5f49c
 

++++++ vendor.tar.zst ++++++
/work/SRC/openSUSE:Factory/sdbootutil/vendor.tar.zst 
/work/SRC/openSUSE:Factory/.sdbootutil.new.1982/vendor.tar.zst differ: char 7, 
line 1

Reply via email to