[arch-projects] [devtools] [PATCH] makechrootpkg: Avoid having code floating around outside of a function.
Dave Reisner
d at falconindy.com
Wed Apr 5 22:42:51 UTC 2017
On Wed, Apr 05, 2017 at 06:39:35PM -0400, lukeshu at lukeshu.com wrote:
> From: Luke Shumaker <lukeshu at parabola.nu>
>
> 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.
> ---
> makechrootpkg.in | 252 ++++++++++++++++++++++++++++---------------------------
> 1 file changed, 130 insertions(+), 122 deletions(-)
>
> diff --git a/makechrootpkg.in b/makechrootpkg.in
> index f6764cb..93cdc10 100644
> --- a/makechrootpkg.in
> +++ b/makechrootpkg.in
> @@ -15,26 +15,28 @@ m4_include(lib/archroot.sh)
>
> shopt -s nullglob
>
> -default_makepkg_args=(-s --noconfirm -L --holdver)
> -makepkg_args=("${default_makepkg_args[@]}")
> -repack=false
> -update_first=false
> -clean_first=false
> -run_namcap=false
> -temp_chroot=false
> -chrootdir=
> -passeddir=
> -makepkg_user=
> -declare -a install_pkgs
> -declare -i ret=0
> -
> -bindmounts_ro=()
> -bindmounts_rw=()
> -
> -copy=$USER
> -[[ -n ${SUDO_USER:-} ]] && copy=$SUDO_USER
> -[[ -z "$copy" || $copy = root ]] && copy=copy
> -src_owner=${SUDO_USER:-$USER}
> +init_variables() {
> + default_makepkg_args=(-s --noconfirm -L --holdver)
> + makepkg_args=("${default_makepkg_args[@]}")
> + repack=false
> + update_first=false
> + clean_first=false
> + run_namcap=false
> + temp_chroot=false
> + chrootdir=
> + passeddir=
> + makepkg_user=
> + declare -a install_pkgs
> + declare -i ret=0
By using declare here, you're scoping the variables to the function.
> +
> + bindmounts_ro=()
> + bindmounts_rw=()
> +
> + copy=$USER
> + [[ -n ${SUDO_USER:-} ]] && copy=$SUDO_USER
> + [[ -z "$copy" || $copy = root ]] && copy=copy
> + src_owner=${SUDO_USER:-$USER}
> +}
>
> usage() {
> echo "Usage: ${0##*/} [options] -r <chrootdir> [--] [makepkg args]"
> @@ -308,109 +310,115 @@ move_products() {
> }
> # }}}
>
> -while getopts 'hcur:I:l:nTD:d:U:' arg; do
> - 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
> -
> -[[ ! -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.'
> -
> -check_root
> -
> -# Canonicalize chrootdir, getting rid of trailing /
> -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
> - copydir=$copy
> -else
> - copydir="$chrootdir/$copy"
> -fi
> -
> -# Pass all arguments after -- right to makepkg
> -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" \
> +main() {
> + init_variables
> +
> + while getopts 'hcur:I:l:nTD:d:U:' arg; do
> + 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
> +
> + [[ ! -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.'
> +
> + check_root
> +
> + # Canonicalize chrootdir, getting rid of trailing /
> + 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
> + copydir=$copy
> + else
> + copydir="$chrootdir/$copy"
> + fi
> +
> + # Pass all arguments after -- right to makepkg
> + 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[@]}" \
> - pacman -Syu --noconfirm
> + /chrootbuild "${makepkg_args[@]}"
> + then
> + move_products "$copydir" "$src_owner"
> + else
> + (( ret += 1 ))
> + fi
>
> -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"
> + $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
> - die "Build failed, check %s/build" "$copydir"
> + true
> fi
> -else
> - true
> -fi
> +}
> +
> +main "$@"
> --
> 2.12.1
More information about the arch-projects
mailing list