diff options
author | Eli Schwartz <eschwartz@archlinux.org> | 2019-12-16 19:27:27 -0500 |
---|---|---|
committer | Levente Polyak <anthraxx@archlinux.org> | 2020-02-27 14:50:19 +0100 |
commit | e963b6da9e2c0aa82a0b80a5b6bfe7294561734f (patch) | |
tree | bc15039413ea7f2a0cd7ff4b8bddf737da2d3b46 | |
parent | b2cbb8628eba3f64207c6d60f8b57ce023599000 (diff) | |
download | devtools-e963b6da9e2c0aa82a0b80a5b6bfe7294561734f.tar.xz |
makechrootpkg: use the chroot database to find checkpkg packages
We don't want to check against the current version known to the host
system, because that will be incorrect in a wide variety of situations,
including:
- the build host hasn't done a full system upgrade yet
- we're building against staging, and want to see the delta between
different staging versions
- we're building against extra, but the host runs testing which carries
changes we don't want to visualize right now
- the chroot has a configured database not available to the host, and
the package is only available there
Essentially, it's rarely 100% correct to run checkpkg on the host, but
we already have a database we *know* is correct, and that is the one we
just built the package against. So let's use that.
This also fixes a bug in the current logic, where in order to try
downloading fresh databases, we work in a non-cached temporary working
database to download the package files, but then let checkpkg default to
comparing packages in the system database. Since we are explicitly
trying to compare against packages that differ from the host's pacman
database, we need to pass the package files as options to checkpkg,
using the additional modes added in commit c14338c0fe71a74f5e56b4f3af7c548fe0928e15
Signed-off-by: Eli Schwartz <eschwartz@archlinux.org>
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
-rw-r--r-- | makechrootpkg.in | 32 |
1 files changed, 14 insertions, 18 deletions
diff --git a/makechrootpkg.in b/makechrootpkg.in index dfea18c..bfa69be 100644 --- a/makechrootpkg.in +++ b/makechrootpkg.in @@ -366,11 +366,7 @@ if arch-nspawn "$copydir" \ "${bindmounts_ro[@]}" "${bindmounts_rw[@]}" \ /chrootbuild "${makepkg_args[@]}" then - pkgnames=() - for pkgfile in "$copydir"/pkgdest/*; do - pkgfile=${pkgfile##*/}; - pkgnames+=("${pkgfile%-*-*-*}"); - done + mapfile -t pkgnames < <(sudo -u "$makepkg_user" bash -c 'source PKGBUILD; printf "%s\n" "${pkgname[@]}"') move_products else (( ret += 1 )) @@ -388,29 +384,29 @@ else if (( run_checkpkg )); then msg "Running checkpkg" - # sync off-site databases for up-to-date queries - trap 'rm -rf $dbpath; cleanup' EXIT INT TERM QUIT - dbpath=$(mktemp -d --tmpdir makechrootpkg-database.XXXXXXXXXX) - mkdir -p "$dbpath" - pacman -Sy --dbpath "$dbpath" --logfile /dev/null + mapfile -t remotepkgs < <(pacman --config "$copydir"/etc/pacman.conf \ + --dbpath "$copydir"/var/lib/pacman \ + -Sddp "${pkgnames[@]}") - # query current package locations - remotepkgs=($(pacman -Sddp --dbpath "$dbpath" --logfile /dev/null "${pkgnames[@]}")) - if (( $? )); then + if ! wait $!; then warning "Skipped checkpkg due to missing repo packages" exit 0 fi # download package files if any non-local location exists for remotepkg in "${remotepkgs[@]}"; do - [[ $remotepkg == file://* ]] && continue - msg2 "Downloading current versions" - pacman --noconfirm -Swdd --dbpath "$dbpath" --logfile /dev/null "${pkgnames[@]}" - break + if [[ $remotepkg != file://* ]]; then + msg2 "Downloading current versions" + arch-nspawn "$copydir" pacman --noconfirm -Swdd "${pkgnames[@]}" + mapfile -t remotepkgs < <(pacman --config "$copydir"/etc/pacman.conf \ + --dbpath "$copydir"/var/lib/pacman \ + -Sddp "${pkgnames[@]}") + break + fi done msg2 "Checking packages" - sudo -u "$makepkg_user" checkpkg --rmdir --warn + sudo -u "$makepkg_user" checkpkg --rmdir --warn "${remotepkgs[@]/#file:\/\//}" fi true fi |