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: - create_chroot->sync_chroot: I pulled out locking the destination chroot; getting that lock is now the caller's responsibility. It still handles locking the source chroot though. 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. However, when pulling that check out, I left it as `if true;`, to keep an indentation level. This patch has had to be rebased/merged many times, and changing the indentation is a sure way to make that go less smoothly; I'm not going to re-indent this block until I see the check removed in the git.archlinux.org/devtools.git repository. - 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.
This commit is contained in:
parent
6098253f6f
commit
2fd5931a8c
|
@ -76,6 +76,14 @@ usage() {
|
||||||
}
|
}
|
||||||
|
|
||||||
# {{{ functions
|
# {{{ functions
|
||||||
|
# Usage: load_vars $makepkg_conf
|
||||||
|
# Globals:
|
||||||
|
# - SRCDEST
|
||||||
|
# - SRCPKGDEST
|
||||||
|
# - PKGDEST
|
||||||
|
# - LOGDEST
|
||||||
|
# - MAKEFLAGS
|
||||||
|
# - PACKAGER
|
||||||
load_vars() {
|
load_vars() {
|
||||||
local makepkg_conf="$1" var
|
local makepkg_conf="$1" var
|
||||||
|
|
||||||
|
@ -88,11 +96,23 @@ load_vars() {
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
create_chroot() {
|
# Usage: sync_chroot $CHROOTDIR/$CHROOT <$CHROOTCOPY|$copydir>
|
||||||
# Lock the chroot we want to use. We'll keep this lock until we exit.
|
sync_chroot() {
|
||||||
lock 9 "$copydir.lock" "Locking chroot copy [%s]" "$copy"
|
local chrootdir=$1
|
||||||
|
local copy=$2
|
||||||
|
local copydir=''
|
||||||
|
if [[ ${copy:0:1} = / ]]; then
|
||||||
|
copydir=$copy
|
||||||
|
else
|
||||||
|
copydir="$chrootdir/$copy"
|
||||||
|
fi
|
||||||
|
|
||||||
if [[ ! -d $copydir ]] || $clean_first; then
|
if [[ "$chrootdir/root" -ef "$copydir" ]]; then
|
||||||
|
error 'Cannot sync copy with itself: %s' "$copydir"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if true; then # indent for rebasing/merging purposes
|
||||||
# Get a read lock on the root chroot to make
|
# Get a read lock on the root chroot to make
|
||||||
# sure we don't clone a half-updated chroot
|
# sure we don't clone a half-updated chroot
|
||||||
slock 8 "$chrootdir/root.lock" "Locking clean chroot"
|
slock 8 "$chrootdir/root.lock" "Locking clean chroot"
|
||||||
|
@ -117,7 +137,11 @@ create_chroot() {
|
||||||
touch "$copydir"
|
touch "$copydir"
|
||||||
}
|
}
|
||||||
|
|
||||||
clean_temporary() {
|
# Usage: delete_chroot $copydir [$copy]
|
||||||
|
delete_chroot() {
|
||||||
|
local copydir=$1
|
||||||
|
local copy=${1:-$2}
|
||||||
|
|
||||||
stat_busy "Removing temporary copy [%s]" "$copy"
|
stat_busy "Removing temporary copy [%s]" "$copy"
|
||||||
if is_btrfs "$chrootdir" && ! mountpoint -q "$copydir"; then
|
if is_btrfs "$chrootdir" && ! mountpoint -q "$copydir"; then
|
||||||
btrfs subvolume delete "$copydir" >/dev/null ||
|
btrfs subvolume delete "$copydir" >/dev/null ||
|
||||||
|
@ -133,7 +157,11 @@ clean_temporary() {
|
||||||
stat_done
|
stat_done
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Usage: install_packages $copydir $pkgs...
|
||||||
install_packages() {
|
install_packages() {
|
||||||
|
local copydir=$1
|
||||||
|
local install_pkgs=("${@:2}")
|
||||||
|
|
||||||
local -a pkgnames
|
local -a pkgnames
|
||||||
local ret
|
local ret
|
||||||
|
|
||||||
|
@ -145,11 +173,19 @@ install_packages() {
|
||||||
ret=$?
|
ret=$?
|
||||||
rm -- "${pkgnames[@]/#/$copydir/root/}"
|
rm -- "${pkgnames[@]/#/$copydir/root/}"
|
||||||
|
|
||||||
# If there is no PKGBUILD we are done
|
return $ret
|
||||||
[[ -f PKGBUILD ]] || exit $ret
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Usage: prepare_chroot $copydir $HOME $repack $run_namcap
|
||||||
|
# Globals:
|
||||||
|
# - MAKEFLAGS
|
||||||
|
# - PACKAGER
|
||||||
prepare_chroot() {
|
prepare_chroot() {
|
||||||
|
local copydir=$1
|
||||||
|
local USER_HOME=$2
|
||||||
|
local repack=$3
|
||||||
|
local run_namcap=$4
|
||||||
|
|
||||||
$repack || rm -rf "$copydir/build"
|
$repack || rm -rf "$copydir/build"
|
||||||
|
|
||||||
local builduser_uid="${SUDO_UID:-$UID}"
|
local builduser_uid="${SUDO_UID:-$UID}"
|
||||||
|
@ -214,7 +250,14 @@ _chrootnamcap() {
|
||||||
done
|
done
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Usage: download_sources $copydir $src_owner
|
||||||
|
# Globals:
|
||||||
|
# - SRCDEST
|
||||||
|
# - USER
|
||||||
download_sources() {
|
download_sources() {
|
||||||
|
local copydir=$1
|
||||||
|
local src_owner=$2
|
||||||
|
|
||||||
local builddir="$(mktemp -d)"
|
local builddir="$(mktemp -d)"
|
||||||
chmod 1777 "$builddir"
|
chmod 1777 "$builddir"
|
||||||
|
|
||||||
|
@ -233,7 +276,15 @@ download_sources() {
|
||||||
rm -rf "$builddir"
|
rm -rf "$builddir"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Usage: move_products $copydir $owner
|
||||||
|
# Globals:
|
||||||
|
# - PKGDEST
|
||||||
|
# - LOGDEST
|
||||||
move_products() {
|
move_products() {
|
||||||
|
local copydir=$1
|
||||||
|
local src_owner=$2
|
||||||
|
|
||||||
|
local pkgfile
|
||||||
for pkgfile in "$copydir"/pkgdest/*; do
|
for pkgfile in "$copydir"/pkgdest/*; do
|
||||||
chown "$src_owner" "$pkgfile"
|
chown "$src_owner" "$pkgfile"
|
||||||
mv "$pkgfile" "$PKGDEST"
|
mv "$pkgfile" "$PKGDEST"
|
||||||
|
@ -244,6 +295,7 @@ move_products() {
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
|
local l
|
||||||
for l in "$copydir"/logdest/*; do
|
for l in "$copydir"/logdest/*; do
|
||||||
[[ $l == */logpipe.* ]] && continue
|
[[ $l == */logpipe.* ]] && continue
|
||||||
chown "$src_owner" "$l"
|
chown "$src_owner" "$l"
|
||||||
|
@ -319,17 +371,27 @@ load_vars /etc/makepkg.conf
|
||||||
[[ -d $SRCPKGDEST ]] || SRCPKGDEST=$PWD
|
[[ -d $SRCPKGDEST ]] || SRCPKGDEST=$PWD
|
||||||
[[ -d $LOGDEST ]] || LOGDEST=$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" \
|
$update_first && arch-nspawn "$copydir" \
|
||||||
"${bindmounts_ro[@]}" "${bindmounts_rw[@]}" \
|
"${bindmounts_ro[@]}" "${bindmounts_rw[@]}" \
|
||||||
pacman -Syu --noconfirm
|
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" \
|
if arch-nspawn "$copydir" \
|
||||||
--bind="$PWD:/startdir" \
|
--bind="$PWD:/startdir" \
|
||||||
|
@ -337,12 +399,12 @@ if arch-nspawn "$copydir" \
|
||||||
"${bindmounts_ro[@]}" "${bindmounts_rw[@]}" \
|
"${bindmounts_ro[@]}" "${bindmounts_rw[@]}" \
|
||||||
/chrootbuild "${makepkg_args[@]}"
|
/chrootbuild "${makepkg_args[@]}"
|
||||||
then
|
then
|
||||||
move_products
|
move_products "$copydir" "$src_owner"
|
||||||
else
|
else
|
||||||
(( ret += 1 ))
|
(( ret += 1 ))
|
||||||
fi
|
fi
|
||||||
|
|
||||||
$temp_chroot && clean_temporary
|
$temp_chroot && delete_chroot "$copydir" "$copy"
|
||||||
|
|
||||||
if (( ret != 0 )); then
|
if (( ret != 0 )); then
|
||||||
if $temp_chroot; then
|
if $temp_chroot; then
|
||||||
|
|
Loading…
Reference in New Issue