To enable the creation of multiple packages with one command move the
assembly process into its own function.
Handle SIGHUP, SIGINT, SIGTERM and remove working directories
accordingly.
Add some comments.

Signed-off-by: Gordian Edenhofer <gordian.edenho...@gmail.com>
---
Display the done message only once at the end.

 contrib/bacman.sh.in | 440 +++++++++++++++++++++++++--------------------------
 1 file changed, 219 insertions(+), 221 deletions(-)

diff --git a/contrib/bacman.sh.in b/contrib/bacman.sh.in
index a611c1a..512973a 100644
--- a/contrib/bacman.sh.in
+++ b/contrib/bacman.sh.in
@@ -33,9 +33,18 @@ ARGS=("$@")
 
 m4_include(../scripts/library/output_format.sh)
 
-#
-# User Friendliness
-#
+# Lazy recursive clean up of temporary dirs
+work_dir_root="${TMPDIR:-/tmp}/bacman"
+clean_up() {
+       rm -rf "$work_dir_root".*
+       echo
+       exit
+}
+
+# Trap termination signals
+trap clean_up SIGHUP SIGINT SIGTERM
+
+# Print usage information
 usage() {
        echo "${myname} (pacman) v${myver}"
        echo
@@ -46,12 +55,14 @@ usage() {
        echo "Example: ${myname} linux-headers"
 }
 
+# Print version information
 version() {
        printf "%s %s\n" "$myname" "$myver"
        echo 'Copyright (C) 2008 locci <carlocci_at_gmail_dot_com>'
        echo 'Copyright (C) 2008-2016 Pacman Development Team 
<pacman-dev@archlinux.org>'
 }
 
+# Check for specified arguments
 while [[ ! -z $1 ]]; do
        if [[ $1 == "--nocolor" ]]; then
                USE_COLOR='n'
@@ -64,13 +75,16 @@ while [[ ! -z $1 ]]; do
        fi
 done
 
+# Configure colored output
 m4_include(../scripts/library/term_colors.sh)
 
-if (( $# != 1 )); then
+# Break if no argument was given
+if (( $# < 1 )); then
        usage
        exit 1
 fi
 
+# Print usage or version if requested
 if [[ $1 = -@(h|-help) ]]; then
        usage
        exit 0
@@ -79,9 +93,7 @@ elif [[ $1 = -@(V|-version) ]]; then
        exit 0
 fi
 
-#
-# Fakeroot support
-#
+# Run with fake root privileges if EUID is not root
 if (( EUID )); then
        if [[ -f /usr/bin/fakeroot ]]; then
                msg "Entering fakeroot environment"
@@ -94,263 +106,249 @@ if (( EUID )); then
        fi
 fi
 
-#
-# Setting environmental variables
-#
+# Source environmental variables and specify fallbacks
 if [[ ! -r @sysconfdir@/pacman.conf ]]; then
        error "unable to read @sysconfdir@/pacman.conf"
        exit 1
 fi
-
 eval $(awk '/DBPath/ {print $1$2$3}' @sysconfdir@/pacman.conf)
 pac_db="${DBPath:-@localstatedir@/lib/pacman/}/local"
-
 if [[ ! -r @sysconfdir@/makepkg.conf ]]; then
        error "unable to read @sysconfdir@/makepkg.conf"
        exit 1
 fi
-
 source "@sysconfdir@/makepkg.conf"
 if [[ -r ~/.makepkg.conf ]]; then
        source ~/.makepkg.conf
 fi
-
 pkg_dest="${PKGDEST:-$PWD}"
 pkg_pkger=${PACKAGER:-'Unknown Packager'}
 
-pkg_name="$1"
-pkg_dir=("$pac_db/$pkg_name"-+([^-])-+([^-]))
-pkg_namver=("${pkg_dir[@]##*/}")
-
-#
-# Checks everything is in place
-#
+# Check for an existing database
 if [[ ! -d $pac_db ]]; then
        error "pacman database directory ${pac_db} not found"
        exit 1
 fi
 
-if (( ${#pkg_dir[@]} != 1 )); then
-       error "%d entries for package %s found in pacman database" \
-               ${#pkg_dir[@]} "${pkg_name}"
-       msg2 "%s" "${pkg_dir[@]}"
-       exit 1
-fi
-
-if [[ ! -d $pkg_dir ]]; then
-       error "package %s is found in pacman database," "${pkg_name}"
-       plain "       but '%s' is not a directory" "${pkg_dir}"
-       exit 1
-fi
-
-#
-# Begin
-#
-msg "Package: ${pkg_namver}"
-work_dir=$(mktemp -d "${TMPDIR:-/tmp}/bacman.XXXXXXXXXX")
-cd "$work_dir" || exit 1
-
-#
-# File copying
-#
-msg2 "Copying package files..."
-
-while read i; do
-       if [[ -z $i ]]; then
-               continue
+# Assemble a single package: $1 = pkgname
+fakebuild() {
+       pkg_name="$1"
+       pkg_dir=("$pac_db/$pkg_name"-+([^-])-+([^-]))
+       pkg_namver=("${pkg_dir[@]##*/}")
+
+       # Checks database for specified package
+       if (( ${#pkg_dir[@]} != 1 )); then
+               error "%d entries for package %s found in pacman database" \
+                       ${#pkg_dir[@]} "${pkg_name}"
+               msg2 "%s" "${pkg_dir[@]}"
+               exit 1
        fi
-
-       if [[ $i == %+([A-Z])% ]]; then
-               current=$i
-               continue
+       if [[ ! -d $pkg_dir ]]; then
+               error "package %s is found in pacman database," "${pkg_name}"
+               plain "       but '%s' is not a directory" "${pkg_dir}"
+               exit 1
        fi
 
-       case "$current" in
-               %FILES%)
-                       local_file="/$i"
-                       package_file="$work_dir/$i"
+       # Create working directory
+       msg "Package: ${pkg_namver}"
+       work_dir=$(mktemp -d "${work_dir_root}.XXXXXXXXXX")
+       cd "$work_dir" || exit 1
 
-                       if [[ ! -e $local_file ]]; then
-                               warning "package file $local_file is missing"
-                               continue
-                       fi
-                       ;;
-
-               %BACKUP%)
-                       # Get the MD5 checksum.
-                       original_md5="${i##*$'\t'}"
-                       # Strip the md5sum after the tab.
-                       i="${i%$'\t'*}"
-                       local_file="/$i.pacnew"
-                       package_file="$work_dir/$i"
-
-                       # Include unmodified .pacnew files.
-                       local_md5="$(md5sum "$local_file" | cut -d' ' -f1)"
-                       if [[ $INCLUDE_PACNEW == 'n' ]] \
-                       || [[ ! -e $local_file ]] \
-                       || [[ $local_md5 != $original_md5 ]]; then
-                               # Warn about modified files.
-                               local_md5="$(md5sum "/$i" | cut -d' ' -f1)"
-                               if [[ $local_md5 != $original_md5 ]]; then
-                                       warning "package file /$i has been 
modified"
-                               fi
-                               # Let the normal file be included in the 
%FILES% list.
-                               continue
-                       fi
-                       ;;
+       # Assemble list of files which belong to the package and tar them
+       msg2 "Copying package files..."
+       while read i; do
+               if [[ -z $i ]]; then
+                       continue
+               fi
 
-               *)
+               if [[ $i == %+([A-Z])% ]]; then
+                       current=$i
                        continue
-                       ;;
-       esac
+               fi
 
-       ret=0
-       bsdtar -cnf - -s'/.pacnew$//' "$local_file" 2> /dev/null | bsdtar -xpf 
- 2> /dev/null
+               case "$current" in
+                       %FILES%)
+                               local_file="/$i"
+                               package_file="$work_dir/$i"
 
-       # Workaround to bsdtar not reporting a missing file as an error
-       if ! [[ -e $package_file || -L $package_file ]]; then
-               error "unable to add $local_file to the package"
-               plain "       If your user does not have permission to read 
this file, then"
-               plain "       you will need to run $myname as root."
+                               if [[ ! -e $local_file ]]; then
+                                       warning "package file $local_file is 
missing"
+                                       continue
+                               fi
+                               ;;
+
+                       %BACKUP%)
+                               # Get the MD5 checksum.
+                               original_md5="${i##*$'\t'}"
+                               # Strip the md5sum after the tab.
+                               i="${i%$'\t'*}"
+                               local_file="/$i.pacnew"
+                               package_file="$work_dir/$i"
+
+                               # Include unmodified .pacnew files.
+                               local_md5="$(md5sum "$local_file" | cut -d' ' 
-f1)"
+                               if [[ $INCLUDE_PACNEW == 'n' ]] \
+                               || [[ ! -e $local_file ]] \
+                               || [[ $local_md5 != $original_md5 ]]; then
+                                       # Warn about modified files.
+                                       local_md5="$(md5sum "/$i" | cut -d' ' 
-f1)"
+                                       if [[ $local_md5 != $original_md5 ]]; 
then
+                                               warning "package file /$i has 
been modified"
+                                       fi
+                                       # Let the normal file be included in 
the %FILES% list.
+                                       continue
+                               fi
+                               ;;
+
+                       *)
+                               continue
+                               ;;
+               esac
+
+               # Tar files
+               ret=0
+               bsdtar -cnf - -s'/.pacnew$//' "$local_file" 2> /dev/null | 
bsdtar -xpf - 2> /dev/null
+               # Workaround to bsdtar not reporting a missing file as an error
+               if ! [[ -e $package_file || -L $package_file ]]; then
+                       error "unable to add $local_file to the package"
+                       plain "       If your user does not have permission to 
read this file, then"
+                       plain "       you will need to run $myname as root."
+                       rm -rf "$work_dir"
+                       exit 1
+               fi
+       done < "$pkg_dir"/files
+
+       ret=$?
+       if (( ret )); then
                rm -rf "$work_dir"
                exit 1
        fi
-done < "$pkg_dir"/files
 
-ret=$?
-if (( ret )); then
-       rm -rf "$work_dir"
-       exit 1
-fi
-
-pkg_size=$(du -sk | awk '{print $1 * 1024}')
-
-#
-# .PKGINFO stuff
-# TODO adopt makepkg's write_pkginfo() into this or scripts/library
-#
-msg2 "Generating .PKGINFO metadata..."
-echo "# Generated by $myname $myver"    > .PKGINFO
-if [[ $INFAKEROOT == "1" ]]; then
-       echo "# Using $(fakeroot -v)"    >> .PKGINFO
-fi
-echo "# $(LC_ALL=C date)"            >> .PKGINFO
-echo "#"                    >> .PKGINFO
+       # Calculate package size
+       pkg_size=$(du -sk | awk '{print $1 * 1024}')
 
-while read i; do
-       if [[ -z $i ]]; then
-               continue;
+       # Reconstruct .PKGINFO from database
+       # TODO adopt makepkg's write_pkginfo() into this or scripts/library
+       msg2 "Generating .PKGINFO metadata..."
+       echo "# Generated by $myname $myver"    > .PKGINFO
+       if [[ $INFAKEROOT == "1" ]]; then
+               echo "# Using $(fakeroot -v)"    >> .PKGINFO
        fi
-
-       if [[ $i == %+([A-Z])% ]]; then
-               current=$i
-               continue
+       echo "# $(LC_ALL=C date)"    >> .PKGINFO
+       echo "#"    >> .PKGINFO
+       while read i; do
+               if [[ -z $i ]]; then
+                       continue;
+               fi
+               if [[ $i == %+([A-Z])% ]]; then
+                       current=$i
+                       continue
+               fi
+
+               case "$current" in
+                       # desc
+                       %NAME%)
+                               echo "pkgname = $i"    >> .PKGINFO
+                               ;;
+                       %VERSION%)
+                               echo "pkgver = $i"    >> .PKGINFO
+                               ;;
+                       %DESC%)
+                               echo "pkgdesc = $i"    >> .PKGINFO
+                               ;;
+                       %URL%)
+                               echo "url = $i"    >> .PKGINFO
+                               ;;
+                       %LICENSE%)
+                               echo "license = $i"    >> .PKGINFO
+                               ;;
+                       %ARCH%)
+                               echo "arch = $i"    >> .PKGINFO
+                               pkg_arch="$i"
+                               ;;
+                       %BUILDDATE%)
+                               echo "builddate = $(date -u "+%s")"    >> 
.PKGINFO
+                               ;;
+                       %PACKAGER%)
+                               echo "packager = $pkg_pkger"        >> .PKGINFO
+                               ;;
+                       %SIZE%)
+                               echo "size = $pkg_size"        >> .PKGINFO
+                               ;;
+                       %GROUPS%)
+                               echo "group = $i"    >> .PKGINFO
+                               ;;
+                       %REPLACES%)
+                               echo "replaces = $i"    >> .PKGINFO
+                               ;;
+                       %DEPENDS%)
+                               echo "depend = $i"   >> .PKGINFO
+                               ;;
+                       %OPTDEPENDS%)
+                               echo "optdepend = $i" >> .PKGINFO
+                               ;;
+                       %CONFLICTS%)
+                               echo "conflict = $i" >> .PKGINFO
+                               ;;
+                       %PROVIDES%)
+                               echo "provides = $i"  >> .PKGINFO
+                               ;;
+                       %BACKUP%)
+                               # Strip the md5sum after the tab
+                               echo "backup = ${i%%$'\t'*}"   >> .PKGINFO
+                               ;;
+               esac
+       done < <(cat "$pkg_dir"/{desc,files})
+
+       comp_files=".PKGINFO"
+
+       # Add instal file if present
+       if [[ -f $pkg_dir/install ]]; then
+               cp "$pkg_dir/install" "$work_dir/.INSTALL"
+               comp_files+=" .INSTALL"
+       fi
+       if [[ -f $pkg_dir/changelog ]]; then
+               cp "$pkg_dir/changelog" "$work_dir/.CHANGELOG"
+               comp_files+=" .CHANGELOG"
        fi
 
-       case "$current" in
-               # desc
-               %NAME%)
-                       echo "pkgname = $i"    >> .PKGINFO
-                       ;;
-               %VERSION%)
-                       echo "pkgver = $i"    >> .PKGINFO
-                       ;;
-               %DESC%)
-                       echo "pkgdesc = $i"    >> .PKGINFO
-                       ;;
-               %URL%)
-                       echo "url = $i"    >> .PKGINFO
-                       ;;
-               %LICENSE%)
-                       echo "license = $i"    >> .PKGINFO
-                       ;;
-               %ARCH%)
-                       echo "arch = $i"    >> .PKGINFO
-                       pkg_arch="$i"
-                       ;;
-               %BUILDDATE%)
-                       echo "builddate = $(date -u "+%s")"    >> .PKGINFO
-                       ;;
-               %PACKAGER%)
-                       echo "packager = $pkg_pkger"        >> .PKGINFO
-                       ;;
-               %SIZE%)
-                       echo "size = $pkg_size"        >> .PKGINFO
-                       ;;
-               %GROUPS%)
-                       echo "group = $i"    >> .PKGINFO
-                       ;;
-               %REPLACES%)
-                       echo "replaces = $i"    >> .PKGINFO
-                       ;;
-               %DEPENDS%)
-                       echo "depend = $i"   >> .PKGINFO
-                       ;;
-               %OPTDEPENDS%)
-                       echo "optdepend = $i" >> .PKGINFO
-                       ;;
-               %CONFLICTS%)
-                       echo "conflict = $i" >> .PKGINFO
-                       ;;
-               %PROVIDES%)
-                       echo "provides = $i"  >> .PKGINFO
-                       ;;
-
-               # files
-               %BACKUP%)
-                       # Strip the md5sum after the tab
-                       echo "backup = ${i%%$'\t'*}"   >> .PKGINFO
-                       ;;
-       esac
-done < <(cat "$pkg_dir"/{desc,files})
-
-comp_files=".PKGINFO"
-
-if [[ -f $pkg_dir/install ]]; then
-       cp "$pkg_dir/install" "$work_dir/.INSTALL"
-       comp_files+=" .INSTALL"
-fi
-if [[ -f $pkg_dir/changelog ]]; then
-       cp "$pkg_dir/changelog" "$work_dir/.CHANGELOG"
-       comp_files+=" .CHANGELOG"
-fi
+       # Fixes owner:group and permissions for .PKGINFO, .CHANGELOG, .INSTALL
+       chown root:root "$work_dir"/{.PKGINFO,.CHANGELOG,.INSTALL} 2> /dev/null
+       chmod 644 "$work_dir"/{.PKGINFO,.CHANGELOG,.INSTALL} 2> /dev/null
 
-#
-# Fixes owner:group and permissions for .PKGINFO, .CHANGELOG, .INSTALL
-#
-chown root:root "$work_dir"/{.PKGINFO,.CHANGELOG,.INSTALL} 2> /dev/null
-chmod 644 "$work_dir"/{.PKGINFO,.CHANGELOG,.INSTALL} 2> /dev/null
+       # Generate the package
+       msg2 "Generating the package..."
 
-#
-# Generate the package
-#
-msg2 "Generating the package..."
-
-pkg_file="$pkg_dest/$pkg_namver-$pkg_arch${PKGEXT}"
-ret=0
-
-# TODO: Maybe this can be set globally for robustness
-shopt -s -o pipefail
-bsdtar -cf - $comp_files * |
-case "$PKGEXT" in
-       *tar.gz)  gzip -c -f -n ;;
-       *tar.bz2) bzip2 -c -f ;;
-       *tar.xz)  xz -c -z - ;;
-       *tar.Z)   compress -c -f ;;
-       *tar)     cat ;;
-       *) warning "'%s' is not a valid archive extension." \
-       "$PKGEXT"; cat ;;
-esac > "${pkg_file}"; ret=$?
-
-if (( ret )); then
-       error "Unable to write package to $pkg_dest"
-       plain "       Maybe the disk is full or you do not have write access"
+       pkg_file="$pkg_dest/$pkg_namver-$pkg_arch${PKGEXT}"
+       ret=0
+
+       # TODO: Maybe this can be set globally for robustness
+       shopt -s -o pipefail
+       bsdtar -cf - $comp_files * |
+       case "$PKGEXT" in
+               *tar.gz)  gzip -c -f -n ;;
+               *tar.bz2) bzip2 -c -f ;;
+               *tar.xz)  xz -c -z - ;;
+               *tar.Z)   compress -c -f ;;
+               *tar)     cat ;;
+               *) warning "'%s' is not a valid archive extension." \
+               "$PKGEXT"; cat ;;
+       esac > "${pkg_file}"; ret=$?
+
+       # Move compressed package to destination
+       if (( ret )); then
+               error "Unable to write package to $pkg_dest"
+               plain "       Maybe the disk is full or you do not have write 
access"
+               rm -rf "$work_dir"
+               exit 1
+       fi
+
+       # Clean up working directory
        rm -rf "$work_dir"
-       exit 1
-fi
+}
 
-rm -rf "$work_dir"
 
+for PKG in $@; do fakebuild $PKG; done
 msg "Done."
 
 exit 0
-- 
2.9.3

Reply via email to