summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuke Shumaker <lukeshu@parabola.nu>2017-02-15 14:40:06 -0500
committerLuke Shumaker <lukeshu@parabola.nu>2017-07-05 15:37:17 -0400
commit7c20294dd96519953537d2d6b5d1735dceafb05e (patch)
treee6a62010f859856da42265dfcdda3eaa38a77471
parentc242c6bf2f21d212d935f9ef6f7dd78910d6c601 (diff)
downloaddevtools32-7c20294dd96519953537d2d6b5d1735dceafb05e.tar.xz
makechrootpkg, arch-nspawn: Force-enable local '/repo/' repository.
The change in arch-nspawn is subtle: This was the source of "infamous" "it fails every other time" bug that took me over a year to solve. <https://labs.parabola.nu/issues/435> By having a repository of local packages (rather than simply running `pacman -U`), we are inviting pacman to cache them in `/var/cache/pacman/pkg`. Besides being needless disk writes, this actually causes a real issue. If the package gets rebuilt, pacman will balk, as the file no longer matches the cached signature. So, how do we prevent pacman from caching these local packages? Simple: include the directory they are already in in the pacman.conf:CacheDir list. This will prevent pacman from copying the files to one of the other cache directories.
-rw-r--r--arch-nspawn.in1
-rw-r--r--makechrootpkg.in13
2 files changed, 14 insertions, 0 deletions
diff --git a/arch-nspawn.in b/arch-nspawn.in
index e695a29..0b0dc68 100644
--- a/arch-nspawn.in
+++ b/arch-nspawn.in
@@ -105,6 +105,7 @@ elif [[ $(cat "$working_dir/.arch-chroot") != "$CHROOT_VERSION" ]]; then
fi
build_mount_args
+cache_dirs+=('/repo/')
copy_hostconf
eval "$(grep '^CARCH=' "$working_dir/etc/makepkg.conf")"
diff --git a/makechrootpkg.in b/makechrootpkg.in
index ccfe77f..4985172 100644
--- a/makechrootpkg.in
+++ b/makechrootpkg.in
@@ -223,6 +223,19 @@ builduser ALL = NOPASSWD: /usr/bin/pacman
EOF
chmod 440 "$copydir/etc/sudoers.d/builduser-pacman"
+ if ! grep -q '^\[repo\]' "$copydir/etc/pacman.conf"; then
+ local line
+ line=$(grep -n '^\[' "$copydir/etc/pacman.conf" |grep -Fv ':[options]'|sed 's/:.*//;1q')
+ local ins='[repo]
+SigLevel = Optional TrustAll
+Server = file:///repo
+'
+ sed -i "${line}i${ins//$'\n'/\\n}" "$copydir/etc/pacman.conf"
+ fi
+ # Avoid having to use `pacman -Sy` to update [repo], as
+ # networking might be disabled inside of the chroot.
+ cp "$copydir/repo/repo.db" "$copydir/var/lib/pacman/sync/repo.db"
+
# This is a little gross, but this way the script is recreated every time in the
# working copy
{