Send patches - preferably formatted by git format-patch - to patches at archlinux32 dot org.
summaryrefslogtreecommitdiff
path: root/makechrootpkg.in
diff options
context:
space:
mode:
authorLuke Shumaker <lukeshu@parabola.nu>2017-02-15 15:36:21 -0500
committerLuke Shumaker <lukeshu@parabola.nu>2017-02-15 15:36:21 -0500
commit37eec3ff31c4a709fcd8e21dbf4e53624f0fc2f1 (patch)
tree0699a5722e66bb342879c94958769412c9ce8fd0 /makechrootpkg.in
parent914cf4f45d3dfc3a566e77397a0ef8ed97ad41cc (diff)
makechrootpkg: Have functions be more function-y.
Rather than them simply being named blocks of code with braces around them. That is: have them take things via arguments rather than global variables. Specific notes: - download_sources: Observation: if $SUDO_USER is set, then src_owner=$SUDO_USER. So (for clarity), rather than checking if $SUDO_USER is set, check if $src_owner is different than $USER. This reduces how much we have to worry about global state. - install_packages: 1. Receive the list of packages as arguments, rather than a global variable. 2. Make the caller responsible for looking at PKGBUILD. From the name and arguments, one would never expect it to look at PKGBUILD. - create_chroot->sync_chroot: I pulled the `if [[ ! -d $copydir ]] || $clean_first;` check out; it is now the caller's responsibility to use that check when deciding if to call sync_chroot.
Diffstat (limited to 'makechrootpkg.in')
-rw-r--r--makechrootpkg.in136
1 files changed, 100 insertions, 36 deletions
diff --git a/makechrootpkg.in b/makechrootpkg.in
index ee4a933..970d3e9 100644
--- a/makechrootpkg.in
+++ b/makechrootpkg.in
@@ -70,6 +70,14 @@ usage() {
}
# {{{ functions
+# Usage: load_vars $makepkg_conf
+# Globals:
+# - SRCDEST
+# - SRCPKGDEST
+# - PKGDEST
+# - LOGDEST
+# - MAKEFLAGS
+# - PACKAGER
load_vars() {
local makepkg_conf="$1" var
@@ -137,39 +145,56 @@ btrfs_subvolume_delete() {
btrfs subvolume delete "$dir"
}
-create_chroot() {
- # Lock the chroot we want to use. We'll keep this lock until we exit.
- lock 9 "$copydir.lock" "Locking chroot copy [%s]" "$copy"
-
- if [[ ! -d $copydir ]] || $clean_first; then
- # Get a read lock on the root chroot to make
- # sure we don't clone a half-updated chroot
- slock 8 "$chrootdir/root.lock" \
- "Locking clean chroot [%s]" "$chrootdir/root"
-
- stat_busy "Synchronizing chroot copy [%s] -> [%s]" "$chrootdir/root" "$copydir"
- if [[ "$chroottype" == btrfs ]] && ! mountpoint -q "$copydir"; then
- if [[ -d $copydir ]]; then
- btrfs_subvolume_delete "$copydir" >/dev/null ||
- die "Unable to delete subvolume %s" "$copydir"
- fi
- btrfs subvolume snapshot "$chrootdir/root" "$copydir" >/dev/null ||
- die "Unable to create subvolume %s" "$copydir"
- else
- mkdir -p "$copydir"
- rsync -a --delete -q -W -x "$chrootdir/root/" "$copydir"
- fi
- stat_done
+# Usage: sync_chroot $CHROOTDIR/$CHROOT <$CHROOTCOPY|$copydir>
+# Globals:
+# - chroottype
+sync_chroot() {
+ local chrootdir=$1
+ local copy=$2
+ local copydir=''
+ if [[ ${copy:0:1} = / ]]; then
+ copydir=$copy
+ else
+ copydir="$chrootdir/$copy"
+ fi
+
+ if [[ "$chrootdir/root" -ef "$copydir" ]]; then
+ error 'Cannot sync copy with itself: %s' "$copydir"
+ return 1
+ fi
- # Drop the read lock again
- lock_close 8
+ # Get a read lock on the root chroot to make
+ # sure we don't clone a half-updated chroot
+ slock 8 "$chrootdir/root.lock" \
+ "Locking clean chroot [%s]" "$chrootdir/root"
+
+ stat_busy "Synchronizing chroot copy [%s] -> [%s]" "$chrootdir/root" "$copydir"
+ if [[ "$chroottype" == btrfs ]] && ! mountpoint -q "$copydir"; then
+ if [[ -d $copydir ]]; then
+ btrfs_subvolume_delete "$copydir" >/dev/null ||
+ die "Unable to delete subvolume %s" "$copydir"
+ fi
+ btrfs subvolume snapshot "$chrootdir/root" "$copydir" >/dev/null ||
+ die "Unable to create subvolume %s" "$copydir"
+ else
+ mkdir -p "$copydir"
+ rsync -a --delete -q -W -x "$chrootdir/root/" "$copydir"
fi
+ stat_done
+
+ # Drop the read lock again
+ lock_close 8
# Update mtime
touch "$copydir"
}
-clean_temporary() {
+# Usage: delete_chroot $copydir
+# Globals:
+# - chroottype
+delete_chroot() {
+ local copydir=$1
+
stat_busy "Removing chroot copy [%s]" "$copydir"
if [[ "$chroottype" == btrfs ]] && ! mountpoint -q "$copydir"; then
btrfs_subvolume_delete "$copydir" >/dev/null ||
@@ -185,9 +210,14 @@ clean_temporary() {
stat_done
}
+# Usage: install_packages $copydir $pkgs...
install_packages() {
+ local copydir=$1
+ local install_pkgs=("${@:2}")
+ declare -i ret=0
local pkgname
+ local install_pkg
for install_pkg in "${install_pkgs[@]}"; do
pkgname="${install_pkg##*/}"
cp "$install_pkg" "$copydir/$pkgname"
@@ -200,11 +230,19 @@ install_packages() {
rm "$copydir/$pkgname"
done
- # If there is no PKGBUILD we are done
- [[ -f PKGBUILD ]] || exit $ret
+ return $ret
}
+# Usage: prepare_chroot $copydir $HOME $repack $run_namcap
+# Globals:
+# - MAKEFLAGS
+# - PACKAGER
prepare_chroot() {
+ local copydir=$1
+ local USER_HOME=$2
+ local repack=$3
+ local run_namcap=$4
+
$repack || rm -rf "$copydir/build"
mkdir -p "$copydir/build"
@@ -289,13 +327,20 @@ EOF
chmod +x "$copydir/chrootbuild"
}
+# Usage: download_sources $copydir $src_owner
+# Globals:
+# - SRCDEST
+# - USER
download_sources() {
+ local copydir=$1
+ local src_owner=$2
+
local builddir="$(mktemp -d)"
chmod 1777 "$builddir"
# Ensure sources are downloaded
- if [[ -n $SUDO_USER ]]; then
- sudo -u $SUDO_USER env SRCDEST="$SRCDEST" BUILDDIR="$builddir" \
+ if [[ $USER != $src_owner ]]; then
+ sudo -u $src_owner env SRCDEST="$SRCDEST" BUILDDIR="$builddir" \
makepkg --config="$copydir/etc/makepkg.conf" --verifysource -o
else
( export SRCDEST BUILDDIR="$builddir"
@@ -349,12 +394,21 @@ _chrootbuild() {
sudo -u builduser makepkg "$@"
}
+# Usage: move_products $copydir $owner
+# Globals:
+# - PKGDEST
+# - LOGDEST
move_products() {
+ local copydir=$1
+ local src_owner=$2
+
+ local pkgfile
for pkgfile in "$copydir"/pkgdest/*; do
chown "$src_owner" "$pkgfile"
mv "$pkgfile" "$PKGDEST"
done
+ local l
for l in "$copydir"/logdest/*; do
[[ $l == */logpipe.* ]] && continue
chown "$src_owner" "$l"
@@ -433,17 +487,27 @@ load_vars /etc/makepkg.conf
[[ -d $SRCPKGDEST ]] || SRCPKGDEST=$PWD
[[ -d $LOGDEST ]] || LOGDEST=$PWD
-create_chroot
+# Lock the chroot we want to use. We'll keep this lock until we exit.
+lock 9 "$copydir.lock" "Locking chroot copy [%s]" "$copy"
+
+if [[ ! -d $copydir ]] || $clean_first; then
+ sync_chroot "$chrootdir" "$copy"
+fi
$update_first && arch-nspawn "$copydir" \
"${bindmounts_ro[@]}" "${bindmounts_rw[@]}" \
pacman -Syu --noconfirm
-[[ -n ${install_pkgs[*]} ]] && install_packages
+if [[ -n ${install_pkgs[*]} ]]; then
+ install_packages "$copydir" "${install_pkgs[@]}"
+ ret=$?
+ # If there is no PKGBUILD we have done
+ [[ -f PKGBUILD ]] || return $ret
+fi
-download_sources
+download_sources "$copydir" "$src_owner"
-prepare_chroot
+prepare_chroot "$copydir" "$USER_HOME" "$repack"
if arch-nspawn "$copydir" \
--bind-ro="$PWD:/startdir_host" \
@@ -451,12 +515,12 @@ if arch-nspawn "$copydir" \
"${bindmounts_ro[@]}" "${bindmounts_rw[@]}" \
/chrootbuild "${makepkg_args[@]}"
then
- move_products
+ move_products "$copydir" "$src_owner"
else
(( ret += 1 ))
fi
-$temp_chroot && clean_temporary
+$temp_chroot && delete_chroot "$copydir"
if (( ret != 0 )); then
if $temp_chroot; then