makechrootpkg: Avoid having code floating around outside of a function.
This means wrapping variable initialization in init_variables(), and the main program routine in main(). I did NOT put `shopt -s nullglob` in to a function. It make make sense to move init_variables() down into the main() function, instead of having it as a separate function up top (if this done, then the `-g` flag passed to `declare` in init_variables() can be dropped). However, in interest of keeping the `diff -w` small, and merges/rebases simpler, this isn't done here.
This commit is contained in:
parent
a1f8ac9c70
commit
49088b0860
242
makechrootpkg.in
242
makechrootpkg.in
|
@ -15,26 +15,28 @@ m4_include(lib/archroot.sh)
|
||||||
|
|
||||||
shopt -s nullglob
|
shopt -s nullglob
|
||||||
|
|
||||||
default_makepkg_args=(-s --noconfirm -L --holdver)
|
init_variables() {
|
||||||
makepkg_args=("${default_makepkg_args[@]}")
|
default_makepkg_args=(-s --noconfirm -L --holdver)
|
||||||
repack=false
|
makepkg_args=("${default_makepkg_args[@]}")
|
||||||
update_first=false
|
repack=false
|
||||||
clean_first=false
|
update_first=false
|
||||||
run_namcap=false
|
clean_first=false
|
||||||
temp_chroot=false
|
run_namcap=false
|
||||||
chrootdir=
|
temp_chroot=false
|
||||||
passeddir=
|
chrootdir=
|
||||||
makepkg_user=
|
passeddir=
|
||||||
declare -a install_pkgs
|
makepkg_user=
|
||||||
declare -i ret=0
|
declare -ga install_pkgs
|
||||||
|
declare -gi ret=0
|
||||||
|
|
||||||
bindmounts_ro=()
|
bindmounts_ro=()
|
||||||
bindmounts_rw=()
|
bindmounts_rw=()
|
||||||
|
|
||||||
copy=$USER
|
copy=$USER
|
||||||
[[ -n ${SUDO_USER:-} ]] && copy=$SUDO_USER
|
[[ -n ${SUDO_USER:-} ]] && copy=$SUDO_USER
|
||||||
[[ -z "$copy" || $copy = root ]] && copy=copy
|
[[ -z "$copy" || $copy = root ]] && copy=copy
|
||||||
src_owner=${SUDO_USER:-$USER}
|
src_owner=${SUDO_USER:-$USER}
|
||||||
|
}
|
||||||
|
|
||||||
usage() {
|
usage() {
|
||||||
echo "Usage: ${0##*/} [options] -r <chrootdir> [--] [makepkg args]"
|
echo "Usage: ${0##*/} [options] -r <chrootdir> [--] [makepkg args]"
|
||||||
|
@ -308,109 +310,115 @@ move_products() {
|
||||||
}
|
}
|
||||||
# }}}
|
# }}}
|
||||||
|
|
||||||
while getopts 'hcur:I:l:nTD:d:U:' arg; do
|
main() {
|
||||||
case "$arg" in
|
init_variables
|
||||||
c) clean_first=true ;;
|
|
||||||
D) bindmounts_ro+=(--bind-ro="$OPTARG") ;;
|
|
||||||
d) bindmounts_rw+=(--bind="$OPTARG") ;;
|
|
||||||
u) update_first=true ;;
|
|
||||||
r) passeddir="$OPTARG" ;;
|
|
||||||
I) install_pkgs+=("$OPTARG") ;;
|
|
||||||
l) copy="$OPTARG" ;;
|
|
||||||
n) run_namcap=true; makepkg_args+=(-i) ;;
|
|
||||||
T) temp_chroot=true; copy+="-$$" ;;
|
|
||||||
U) makepkg_user="$OPTARG" ;;
|
|
||||||
h|*) usage ;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
|
|
||||||
[[ ! -f PKGBUILD && -z "${install_pkgs[*]}" ]] && die 'This must be run in a directory containing a PKGBUILD.'
|
while getopts 'hcur:I:l:nTD:d:U:' arg; do
|
||||||
[[ -n $makepkg_user && -z $(id -u "$makepkg_user") ]] && die 'Invalid makepkg user.'
|
case "$arg" in
|
||||||
|
c) clean_first=true ;;
|
||||||
|
D) bindmounts_ro+=(--bind-ro="$OPTARG") ;;
|
||||||
|
d) bindmounts_rw+=(--bind="$OPTARG") ;;
|
||||||
|
u) update_first=true ;;
|
||||||
|
r) passeddir="$OPTARG" ;;
|
||||||
|
I) install_pkgs+=("$OPTARG") ;;
|
||||||
|
l) copy="$OPTARG" ;;
|
||||||
|
n) run_namcap=true; makepkg_args+=(-i) ;;
|
||||||
|
T) temp_chroot=true; copy+="-$$" ;;
|
||||||
|
U) makepkg_user="$OPTARG" ;;
|
||||||
|
h|*) usage ;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
check_root
|
[[ ! -f PKGBUILD && -z "${install_pkgs[*]}" ]] && die 'This must be run in a directory containing a PKGBUILD.'
|
||||||
|
[[ -n $makepkg_user && -z $(id -u "$makepkg_user") ]] && die 'Invalid makepkg user.'
|
||||||
|
|
||||||
# Canonicalize chrootdir, getting rid of trailing /
|
check_root
|
||||||
chrootdir=$(readlink -e "$passeddir")
|
|
||||||
[[ ! -d $chrootdir ]] && die "No chroot dir defined, or invalid path '%s'" "$passeddir"
|
|
||||||
[[ ! -d $chrootdir/root ]] && die "Missing chroot dir root directory. Try using: mkarchroot %s/root base-devel" "$chrootdir"
|
|
||||||
|
|
||||||
if [[ ${copy:0:1} = / ]]; then
|
# Canonicalize chrootdir, getting rid of trailing /
|
||||||
copydir=$copy
|
chrootdir=$(readlink -e "$passeddir")
|
||||||
else
|
[[ ! -d $chrootdir ]] && die "No chroot dir defined, or invalid path '%s'" "$passeddir"
|
||||||
copydir="$chrootdir/$copy"
|
[[ ! -d $chrootdir/root ]] && die "Missing chroot dir root directory. Try using: mkarchroot %s/root base-devel" "$chrootdir"
|
||||||
fi
|
|
||||||
|
|
||||||
# Pass all arguments after -- right to makepkg
|
if [[ ${copy:0:1} = / ]]; then
|
||||||
makepkg_args+=("${@:$OPTIND}")
|
copydir=$copy
|
||||||
|
|
||||||
# See if -R was passed to makepkg
|
|
||||||
for arg in "${@:OPTIND}"; do
|
|
||||||
case ${arg%%=*} in
|
|
||||||
-*R*|--repackage)
|
|
||||||
repack=true
|
|
||||||
break 2
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
|
|
||||||
if [[ -n $SUDO_USER ]]; then
|
|
||||||
eval "USER_HOME=~$SUDO_USER"
|
|
||||||
else
|
|
||||||
USER_HOME=$HOME
|
|
||||||
fi
|
|
||||||
|
|
||||||
umask 0022
|
|
||||||
|
|
||||||
load_vars "${XDG_CONFIG_HOME:-$USER_HOME/.config}/pacman/makepkg.conf" || load_vars "$USER_HOME/.makepkg.conf"
|
|
||||||
load_vars /etc/makepkg.conf
|
|
||||||
|
|
||||||
# Use PKGBUILD directory if these don't exist
|
|
||||||
[[ -d $PKGDEST ]] || PKGDEST=$PWD
|
|
||||||
[[ -d $SRCDEST ]] || SRCDEST=$PWD
|
|
||||||
[[ -d $SRCPKGDEST ]] || SRCPKGDEST=$PWD
|
|
||||||
[[ -d $LOGDEST ]] || LOGDEST=$PWD
|
|
||||||
|
|
||||||
# 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
|
|
||||||
|
|
||||||
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 "$copydir" "$src_owner"
|
|
||||||
|
|
||||||
prepare_chroot "$copydir" "$USER_HOME" "$repack"
|
|
||||||
|
|
||||||
if arch-nspawn "$copydir" \
|
|
||||||
--bind="$PWD:/startdir" \
|
|
||||||
--bind="$SRCDEST:/srcdest" \
|
|
||||||
"${bindmounts_ro[@]}" "${bindmounts_rw[@]}" \
|
|
||||||
/chrootbuild "${makepkg_args[@]}"
|
|
||||||
then
|
|
||||||
move_products "$copydir" "$src_owner"
|
|
||||||
else
|
|
||||||
(( ret += 1 ))
|
|
||||||
fi
|
|
||||||
|
|
||||||
$temp_chroot && delete_chroot "$copydir" "$copy"
|
|
||||||
|
|
||||||
if (( ret != 0 )); then
|
|
||||||
if $temp_chroot; then
|
|
||||||
die "Build failed"
|
|
||||||
else
|
else
|
||||||
die "Build failed, check %s/build" "$copydir"
|
copydir="$chrootdir/$copy"
|
||||||
fi
|
fi
|
||||||
else
|
|
||||||
true
|
# Pass all arguments after -- right to makepkg
|
||||||
fi
|
makepkg_args+=("${@:$OPTIND}")
|
||||||
|
|
||||||
|
# See if -R was passed to makepkg
|
||||||
|
for arg in "${@:OPTIND}"; do
|
||||||
|
case ${arg%%=*} in
|
||||||
|
-*R*|--repackage)
|
||||||
|
repack=true
|
||||||
|
break 2
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
if [[ -n $SUDO_USER ]]; then
|
||||||
|
eval "USER_HOME=~$SUDO_USER"
|
||||||
|
else
|
||||||
|
USER_HOME=$HOME
|
||||||
|
fi
|
||||||
|
|
||||||
|
umask 0022
|
||||||
|
|
||||||
|
load_vars "${XDG_CONFIG_HOME:-$USER_HOME/.config}/pacman/makepkg.conf" || load_vars "$USER_HOME/.makepkg.conf"
|
||||||
|
load_vars /etc/makepkg.conf
|
||||||
|
|
||||||
|
# Use PKGBUILD directory if these don't exist
|
||||||
|
[[ -d $PKGDEST ]] || PKGDEST=$PWD
|
||||||
|
[[ -d $SRCDEST ]] || SRCDEST=$PWD
|
||||||
|
[[ -d $SRCPKGDEST ]] || SRCPKGDEST=$PWD
|
||||||
|
[[ -d $LOGDEST ]] || LOGDEST=$PWD
|
||||||
|
|
||||||
|
# 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
|
||||||
|
|
||||||
|
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 "$copydir" "$src_owner"
|
||||||
|
|
||||||
|
prepare_chroot "$copydir" "$USER_HOME" "$repack"
|
||||||
|
|
||||||
|
if arch-nspawn "$copydir" \
|
||||||
|
--bind="$PWD:/startdir" \
|
||||||
|
--bind="$SRCDEST:/srcdest" \
|
||||||
|
"${bindmounts_ro[@]}" "${bindmounts_rw[@]}" \
|
||||||
|
/chrootbuild "${makepkg_args[@]}"
|
||||||
|
then
|
||||||
|
move_products "$copydir" "$src_owner"
|
||||||
|
else
|
||||||
|
(( ret += 1 ))
|
||||||
|
fi
|
||||||
|
|
||||||
|
$temp_chroot && delete_chroot "$copydir" "$copy"
|
||||||
|
|
||||||
|
if (( ret != 0 )); then
|
||||||
|
if $temp_chroot; then
|
||||||
|
die "Build failed"
|
||||||
|
else
|
||||||
|
die "Build failed, check %s/build" "$copydir"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
true
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
main "$@"
|
||||||
|
|
Loading…
Reference in New Issue