#!/usr/bin/env bash # SPDX-License-Identifier: MIT # Run in a Fedora build environment with the application's dependencies. set -euo pipefail if (( $# != 2 )); then printf 'Usage: %s OLD_RPM NEW_RPM\n' "$0" >&2 exit 2 fi old_rpm=$(realpath "$1") new_rpm=$(realpath "$2") work=$(mktemp -d) trap 'rm -rf -- "$work"' EXIT mkdir -p "$work/root" "$work/runtime" export XDG_CONFIG_HOME="$work/config" XDG_CACHE_HOME="$work/cache" export XDG_DATA_HOME="$work/data" XDG_DATA_DIRS="$work/root/usr/share:/usr/share" export XDG_RUNTIME_DIR="$work/runtime" export QT_QPA_PLATFORM=offscreen QT_QUICK_BACKEND=software unset QML_DISABLE_DISK_CACHE QML_FORCE_DISK_CACHE QML_DISK_CACHE_PATH QML_DISK_CACHE launch_settings() { if timeout 3s dbus-run-session -- "$work/root/usr/bin/plasma-panel-actions" --settings > "$work/launch.log" 2>&1; then printf 'Settings exited before the test timeout.\n' >&2 cat "$work/launch.log" >&2 exit 1 else status=$? if (( status != 124 )); then cat "$work/launch.log" >&2 exit "$status" fi fi } cache_for() { for file in "$XDG_CACHE_HOME"/plasma-panel-actions/qmlcache/*.qmlc; do [[ -f $file ]] || continue if strings -el "$file" | grep -Fx "file://$1" > /dev/null; then printf '%s\n' "$file" return fi done printf 'No QML cache was generated for %s\n' "$1" >&2 return 1 } rpm2cpio "$old_rpm" | (cd "$work/root" && cpio -idm --quiet) launch_settings old_ui="$work/root/usr/share/plasma-panel-actions/ConfigGeneral.qml" old_cache=$(cache_for "$old_ui") old_checksum=$(sha256sum "$old_cache") # Extract over the same location and keep the old cache intact. Changing # the staging directory would hide the cache-collision regression. rpm2cpio "$new_rpm" | (cd "$work/root" && cpio -idmu --quiet) new_ui="$work/root$(rpm -qpl "$new_rpm" | grep '/ConfigGeneral.qml$')" [[ $(stat -c %Y "$old_ui") == "$(stat -c %Y "$new_ui")" ]] launch_settings new_cache=$(cache_for "$new_ui") [[ $new_cache != "$old_cache" ]] [[ $(sha256sum "$old_cache") == "$old_checksum" ]] strings -el "$new_cache" | grep -Fx twinFormLayouts > /dev/null printf 'PASS: updated settings loaded with identical source timestamps and the old cache intact.\n'