diff --git a/mkosi/mkosi.conf.d/debian-ubuntu/mkosi.prepare b/mkosi/mkosi.conf.d/debian-ubuntu/mkosi.prepare new file mode 100755 index 0000000000..3a4415c547 --- /dev/null +++ b/mkosi/mkosi.conf.d/debian-ubuntu/mkosi.prepare @@ -0,0 +1,90 @@ +#!/usr/bin/env bash +# SPDX-License-Identifier: LGPL-2.1-or-later +set -e +set -o pipefail + +if [[ "$1" == "build" ]]; then + exit 0 +fi + +pkgdir=/usr/host-pkgs +develver=$(dpkg-query --root="$BUILDROOT" --showformat='${Version}' --show systemd) +distrover=$( + apt-cache madison systemd | + awk -F '|' '$3 !~ /file:\/+repository/ && !found { gsub(/^[[:space:]]+|[[:space:]]+$/, "", $2); print $2; found=1 }' +) + +if [[ -z $distrover ]]; then + echo "Skipping upgrade test, no distro version found" + exit 0 +fi + +if [[ ${distrover#*:} =~ ^([0-9]+) ]]; then + distromajor=${BASH_REMATCH[1]} +else + echo "Skipping upgrade test, unable to parse distro version: $distrover" + exit 0 +fi + +if [[ ${develver#*:} =~ ^([0-9]+) ]]; then + develmajor=${BASH_REMATCH[1]} +else + echo "Skipping upgrade test, unable to parse development version: $develver" + exit 0 +fi + +deltaver=$((develmajor - distromajor)) + +if [[ $deltaver -le 0 ]]; then + echo "Skipping upgrade test, distro version is newer or equal: $distrover" + exit 0 +fi + +distro_packages=() +devel_packages=() + +while IFS=$'\t' read -r package source package_architecture; do + [[ $source == systemd ]] || continue + [[ $package_architecture == "$DISTRIBUTION_ARCHITECTURE" || $package_architecture == all ]] || continue + [[ $package != *-dbgsym* ]] || continue + + devel_packages+=("$package=$(dpkg-query --root="$BUILDROOT" --showformat='${Version}' --show "$package")") + + package_versions=$(apt-cache madison "$package") + if awk -F '|' -v version="$distrover" ' + $3 !~ /file:\/+repository/ { + gsub(/^[[:space:]]+|[[:space:]]+$/, "", $2) + if ($2 == version) + found=1 + } + END { + exit !found + } + ' <<<"$package_versions"; then + distro_packages+=("$package=$distrover") + fi +done < <(dpkg-query --root="$BUILDROOT" --show --showformat='${binary:Package}\t${source:Package}\t${Architecture}\n') + +if (( ${#distro_packages[@]} == 0 )); then + echo "Skipping upgrade test, no distro packages found" + exit 0 +fi + +if (( ${#devel_packages[@]} == 0 )); then + echo "Skipping upgrade test, no development packages found" + exit 0 +fi + +rm -rf "$BUILDROOT$pkgdir/distro" "$BUILDROOT$pkgdir/devel" +mkdir -p "$BUILDROOT$pkgdir"/{distro,devel} + +# apt-get download writes packages to the current directory +( + cd "$BUILDROOT$pkgdir/distro" + apt-get download "${distro_packages[@]}" +) + +( + cd "$BUILDROOT$pkgdir/devel" + apt-get download "${devel_packages[@]}" +) diff --git a/test/units/TEST-88-UPGRADE.sh b/test/units/TEST-88-UPGRADE.sh index 5cc1df21aa..153fc0ba49 100755 --- a/test/units/TEST-88-UPGRADE.sh +++ b/test/units/TEST-88-UPGRADE.sh @@ -12,8 +12,25 @@ if ! [[ -d $pkgdir ]]; then exit 77 fi -if ! command -v dnf >/dev/null; then - echo 'dnf not found, skipping test.' >/skipped +if command -v dnf >/dev/null; then + package_extension=rpm + downgrade=(dnf downgrade --nogpgcheck -y --allowerasing --disablerepo '*') + upgrade=(dnf -y upgrade --nogpgcheck --disablerepo '*') +elif command -v apt-get >/dev/null; then + package_extension=deb + apt_sources=/run/TEST-88-UPGRADE.sources + apt_source_parts=/run/TEST-88-UPGRADE.sources.d + : >"$apt_sources" + mkdir -p "$apt_source_parts" + apt_options=( + -o "Dir::Etc::sourcelist=$apt_sources" + -o "Dir::Etc::sourceparts=$apt_source_parts" + --no-install-recommends + ) + downgrade=(apt-get "${apt_options[@]}" install --allow-downgrades -y) + upgrade=(apt-get "${apt_options[@]}" install -y) +else + echo 'No supported package manager found, skipping test.' >/skipped exit 77 fi @@ -84,7 +101,7 @@ timer2=$(systemctl show -P NextElapseUSecRealtime upgrade_timer_test.timer) # FIXME: See https://github.com/systemd/systemd/pull/39293 systemctl stop systemd-networkd-resolve-hook.socket || true -dnf downgrade --nogpgcheck -y --allowerasing --disablerepo '*' "$pkgdir"/distro/*.rpm +"${downgrade[@]}" "$pkgdir"/distro/*."$package_extension" # Some distros don't ship networkd, so the test will always fail if command -v networkctl >/dev/null; then @@ -105,7 +122,7 @@ fi check_sd # Finally test the upgrade -dnf -y upgrade --nogpgcheck --disablerepo '*' "$pkgdir"/devel/*.rpm +"${upgrade[@]}" "$pkgdir"/devel/*."$package_extension" # TODO: sanity checks check_sd