On Wed, Apr 05, 2017 at 06:39:35PM -0400, luke...@lukeshu.com wrote: > From: Luke Shumaker <luke...@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