Patch makepkg to use more [[ and (( bash syntax

View: New views
13 Messages — Rating Filter:   Alert me  

Patch makepkg to use more [[ and (( bash syntax

by Isaac Good-4 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

See http://bugs.archlinux.org/task/16623 too

>From d71c1f120351c0ab7396f5aabbe9cf0497621782 Mon Sep 17 00:00:00 2001
From: Isaac Good <arch@...>
Date: Sun, 25 Oct 2009 19:19:18 -0400
Subject: [PATCH] Signed-off-by: Isaac Good <arch@...>

Modified makepkg to use more of [[ ]] and (( )) bash constructs
Added quotes to variables in a few places that were missing them or
had {} instead
---
 scripts/makepkg.sh.in |  594 ++++++++++++++++++++++++-------------------------
 1 files changed, 296 insertions(+), 298 deletions(-)

diff --git a/scripts/makepkg.sh.in b/scripts/makepkg.sh.in
index 9cd7f2e..16a4f76 100644
--- a/scripts/makepkg.sh.in
+++ b/scripts/makepkg.sh.in
@@ -82,22 +82,25 @@ PACMAN_OPTS=
 ### SUBROUTINES ###

 plain() {
- local mesg=$1; shift
+ local mesg="$1"; shift
  printf "${BOLD}    ${mesg}${ALL_OFF}\n" "$@" >&2
 }

 msg() {
- local mesg=$1; shift
+}
+
+msg() {
+ local mesg="$1"; shift
  printf "${GREEN}==>${ALL_OFF}${BOLD} ${mesg}${ALL_OFF}\n" "$@" >&2
 }

 msg2() {
- local mesg=$1; shift
+ local mesg="$1"; shift
  printf "${BLUE}  ->${ALL_OFF}${BOLD} ${mesg}${ALL_OFF}\n" "$@" >&2
 }

 warning() {
- local mesg=$1; shift
+ local mesg="$1"; shift
  printf "${YELLOW}==> $(gettext "WARNING:")${ALL_OFF}${BOLD}
${mesg}${ALL_OFF}\n" "$@" >&2
 }

@@ -112,7 +115,7 @@ error() {
 # the fakeroot call, the error message will be printed by the main call.
 ##
 trap_exit() {
- if [ "$INFAKEROOT" -eq 0 ]; then
+ if (( ! INFAKEROOT )); then
  echo
  error "$@"
  fi
@@ -126,22 +129,22 @@ trap_exit() {
 clean_up() {
  local EXIT_CODE=$?

- if [ "$INFAKEROOT" -eq 1 ]; then
+ if (( INFAKEROOT )); then
  # Don't clean up when leaving fakeroot, we're not done yet.
  return
  fi

- if [ $EXIT_CODE -eq 0 -a "$CLEANUP" -eq 1 ]; then
+ if (( ! EXIT_CODE && CLEANUP )); then
  # If it's a clean exit and -c/--clean has been passed...
  msg "$(gettext "Cleaning up...")"
  rm -rf "$pkgdir" "$srcdir"
- if [ -n "$pkgbase" ]; then
+ if [[ -n $pkgbase ]]; then
  # Can't do this unless the BUILDSCRIPT has been sourced.
  rm -f "${pkgbase}-${pkgver}-${pkgrel}-${CARCH}-build.log"*
- if [ "$PKGFUNC" -eq 1 ]; then
+ if (( PKGFUNC )); then
  rm -f "${pkgbase}-${pkgver}-${pkgrel}-${CARCH}-package.log"*
- elif [ "$SPLITPKG" -eq 1 ]; then
- for pkg in ${pkgname[@]}; do
+ elif (( SPLITPKG )); then
+ for pkg in "${pkgname[@]}"; do
  rm -f "${pkg}-${pkgver}-${pkgrel}-${CARCH}-package.log"*
  done
  fi
@@ -189,15 +192,15 @@ get_url() {
 #          ? - not found
 ##
 check_option() {
- local ret=$(in_opt_array "$1" ${options[@]})
- if [ "$ret" != '?' ]; then
+ local ret=$(in_opt_array "$1" "${options[@]}")
+ if [[ $ret != '?' ]]; then
  echo $ret
  return
  fi

  # fall back to makepkg.conf options
- ret=$(in_opt_array "$1" ${OPTIONS[@]})
- if [ "$ret" != '?' ]; then
+ ret=$(in_opt_array "$1" "${OPTIONS[@]}")
+ if [[ $ret != '?' ]]; then
  echo $ret
  return
  fi
@@ -215,7 +218,7 @@ check_option() {
 #          ? - not found
 ##
 check_buildenv() {
- echo $(in_opt_array "$1" ${BUILDENV[@]})
+ echo $(in_opt_array "$1" "${BUILDENV[@]}")
 }


@@ -234,7 +237,7 @@ in_opt_array() {
  if [ "$opt" = "$needle" ]; then
  echo 'y' # Enabled
  return
- elif [ "$opt" = "!$needle" ]; then
+ elif [[ $opt = "!$needle" ]]; then
  echo 'n' # Disabled
  return
  fi
@@ -250,11 +253,11 @@ in_opt_array() {
 #          1 - not found
 ##
 in_array() {
- local needle=$1; shift
- [ -z "$1" ] && return 1 # Not Found
+ local needle="$1"; shift
+ [[ ! $1 ]] && return 1 # Not Found
  local item
  for item in "$@"; do
- [ "$item" = "$needle" ] && return 0 # Found
+ [[ $item = $needle ]] && return 0 # Found
  done
  return 1 # Not Found
 }
@@ -268,14 +271,14 @@ get_downloadclient() {
  local i
  for i in "${DLAGENTS[@]}"; do
  local handler="${i%%::*}"
- if [ "$proto" = "$handler" ]; then
+ if [[ $proto = $handler ]]; then
  agent="${i##*::}"
  break
  fi
  done

  # if we didn't find an agent, return an error
- if [ -z "$agent" ]; then
+ if [[ ! $agent ]]; then
  error "$(gettext "There is no agent set up to handle %s URLs. Check
%s.")" "$proto" "$MAKEPKG_CONF"
  plain "$(gettext "Aborting...")"
  exit 1 # $E_CONFIG_ERROR
@@ -283,7 +286,7 @@ get_downloadclient() {

  # ensure specified program is installed
  local program="${agent%% *}"
- if [ ! -x "$program" ]; then
+ if [[ ! -x $program ]]; then
  local baseprog=$(basename $program)
  error "$(gettext "The download program %s is not installed.")" "$baseprog"
  plain "$(gettext "Aborting...")"
@@ -317,25 +320,25 @@ download_file() {

  local ret=0
  eval "$dlcmd || ret=\$?"
- if [ $ret -gt 0 ]; then
+ if (( ret )); then
  [ ! -s "$dlfile" ] && rm -f -- "$dlfile"
  return $ret
  fi

  # rename the temporary download file to the final destination
- if [ "$dlfile" != "$file" ]; then
+ if [[ $dlfile != $file ]]; then
  mv -f "$SRCDEST/$dlfile" "$SRCDEST/$file"
  fi
 }

 check_deps() {
- [ $# -gt 0 ] || return
+ (( $# )) || return

  pmout=$(pacman $PACMAN_OPTS -T "$@")
  ret=$?
- if [ $ret -eq 127 ]; then #unresolved deps
+ if (( ret == 127 )); then #unresolved deps
  echo "$pmout"
- elif [ $ret -ne 0 ]; then
+ elif (( $ret )); then
  error "$(gettext "Pacman returned a fatal error (%i): %s")" "$ret" "$pmout"
  exit 1
  fi
@@ -345,26 +348,26 @@ handle_deps() {
  local R_DEPS_SATISFIED=0
  local R_DEPS_MISSING=1

- [ $# -eq 0 ] && return $R_DEPS_SATISFIED
+ (( $# )) || return $R_DEPS_SATISFIED

  local deplist="$*"

- if [ "$DEP_BIN" -eq 0 ]; then
+ if (( ! DEP_BIN )); then
  return $R_DEPS_MISSING
  fi

- if [ "$DEP_BIN" -eq 1 ]; then
+ if (( DEP_BIN )); then
  # install missing deps from binary packages (using pacman -S)
  msg "$(gettext "Installing missing dependencies...")"
  local ret=0

- if [ "$ASROOT" -eq 0 ]; then
+ if (( ! ASROOT )); then
  sudo pacman $PACMAN_OPTS -S --asdeps $deplist || ret=$?
  else
  pacman $PACMAN_OPTS -S --asdeps $deplist || ret=$?
  fi

- if [ $ret -ne 0 ]; then
+ if (( ret )); then
  error "$(gettext "Pacman failed to install missing dependencies.")"
  exit 1 # TODO: error code
  fi
@@ -385,7 +388,7 @@ resolve_deps() {
  local R_DEPS_MISSING=1

  local deplist="$(check_deps $*)"
- if [ -z "$deplist" ]; then
+ if [[ ! $deplist ]]; then
  return $R_DEPS_SATISFIED
  fi

@@ -393,8 +396,8 @@ resolve_deps() {
  pkgdeps="$pkgdeps $deplist"
  # check deps again to make sure they were resolved
  deplist="$(check_deps $*)"
- [ -z "$deplist" ] && return $R_DEPS_SATISFIED
- elif [ "$DEP_BIN" -eq 1 ]; then
+ [[ ! $deplist ]] && return $R_DEPS_SATISFIED
+ elif (( DEP_BIN )); then
  error "$(gettext "Failed to install all missing dependencies.")"
  fi

@@ -410,8 +413,8 @@ resolve_deps() {
 # fix flyspray bug #5923
 remove_deps() {
  # $pkgdeps is a GLOBAL variable, set by resolve_deps()
- [ "$RMDEPS" -eq 0 ] && return
- [ -z "$pkgdeps" ] && return
+ (( ! RMDEPS )) && return
+ [[ ! $pkgdeps ]] && return

  local dep depstrip deplist
  deplist=""
@@ -422,14 +425,14 @@ remove_deps() {

  msg "Removing installed dependencies..."
  local ret=0
- if [ "$ASROOT" -eq 0 ]; then
+ if (( ! ASROOT )); then
  sudo pacman $PACMAN_OPTS -Rns $deplist || ret=$?
  else
  pacman $PACMAN_OPTS -Rns $deplist || ret=$?
  fi

  # Fixes FS#10039 - exit cleanly as package has built successfully
- if [ $ret -ne 0 ]; then
+ if (( ret )); then
  warning "$(gettext "Failed to remove installed dependencies.")"
  return 0
  fi
@@ -438,7 +441,7 @@ remove_deps() {
 download_sources() {
  msg "$(gettext "Retrieving Sources...")"

- if [ ! -w "$SRCDEST" ] ; then
+ if [[ ! -w $SRCDEST ]] ; then
  error "$(gettext "You do not have write permission to store
downloads in %s.")" "$SRCDEST"
  plain "$(gettext "Aborting...")"
  exit 1
@@ -450,12 +453,12 @@ download_sources() {
  for netfile in "${source[@]}"; do
  local file=$(get_filename "$netfile")
  local url=$(get_url "$netfile")
- if [ -f "$startdir/$file" ]; then
+ if [[ -f $startdir/$file ]]; then
  msg2 "$(gettext "Found %s in build dir")" "$file"
  rm -f "$srcdir/$file"
  ln -s "$startdir/$file" "$srcdir/"
  continue
- elif [ -f "$SRCDEST/$file" ]; then
+ elif [[ -f $SRCDEST/$file ]]; then
  msg2 "$(gettext "Using cached copy of %s")" "$file"
  rm -f "$srcdir/$file"
  ln -s "$SRCDEST/$file" "$srcdir/"
@@ -463,7 +466,7 @@ download_sources() {
  fi

  # if we get here, check to make sure it was a URL, else fail
- if [ "$file" = "$url" ]; then
+ if [[ $file = $url ]]; then
  error "$(gettext "%s was not found in the build directory and is
not a URL.")" "$file"
  exit 1 # $E_MISSING_FILE
  fi
@@ -475,7 +478,7 @@ download_sources() {
  # fix flyspray bug #3289
  local ret=0
  download_file "$dlclient" "$url" "$file" || ret=$?
- if [ $ret -gt 0 ]; then
+ if (( ret )); then
  error "$(gettext "Failure while downloading %s")" "$file"
  plain "$(gettext "Aborting...")"
  exit 1
@@ -491,13 +494,13 @@ generate_checksums() {
  msg "$(gettext "Generating checksums for source files...")"
  plain ""

- if [ ! $(type -p openssl) ]; then
+ if ! type -p openssl >/dev/null ; then
  error "$(gettext "Cannot find openssl.")"
  exit 1 # $E_MISSING_PROGRAM
  fi

  local integ
- for integ in ${INTEGRITY_CHECK[@]}; do
+ for integ in "${INTEGRITY_CHECK[@]}"; do
  integ="${integ,,}"
  case "$integ" in
  md5|sha1|sha256|sha384|sha512) : ;;
@@ -512,17 +515,16 @@ generate_checksums() {

  local i=0;
  local indent=''
- while [ $i -lt $((${#integ}+6)) ]; do
+ for ((i=0; i < ${#integ} + 6; i++ )); do
  indent="$indent "
- i=$(($i+1))
  done

  local netfile
  for netfile in "${source[@]}"; do
  local file="$(get_filename "$netfile")"

- if [ ! -f "$file" ] ; then
- if [ ! -f "$SRCDEST/$file" ] ; then
+ if [[ ! -f $file ]] ; then
+ if [[ ! -f $SRCDEST/$file ]] ; then
  error "$(gettext "Unable to find source file %s to generate
checksum.")" "$file"
  plain "$(gettext "Aborting...")"
  exit 1
@@ -531,12 +533,12 @@ generate_checksums() {
  fi
  fi

- local sum="$(openssl dgst -${integ} "$file")"
- sum=${sum##* }
- [ $ct -gt 0 ] && echo -n "$indent"
+ local sum="$(openssl dgst -"$integ" "$file")"
+ sum="${sum##* }"
+ (( ct )) && echo -n "$indent"
  echo -n "'$sum'"
- ct=$(($ct+1))
- [ $ct -lt $numsrc ] && echo
+ ct=$((ct+1))
+ (( ct < numsrc )) && echo
  done

  echo ")"
@@ -544,9 +546,9 @@ generate_checksums() {
 }

 check_checksums() {
- [ ${#source[@]} -eq 0 ] && return 0
+ (( ! ${#source[@]} )) && return 0

- if [ ! $(type -p openssl) ]; then
+ if ! type -p openssl >/dev/null; then
  error "$(gettext "Cannot find openssl.")"
  exit 1 # $E_MISSING_PROGRAM
  fi
@@ -555,7 +557,7 @@ check_checksums() {
  local integ required
  for integ in md5 sha1 sha256 sha384 sha512; do
  local integrity_sums=($(eval echo "\${${integ}sums[@]}"))
- if [ ${#integrity_sums[@]} -eq ${#source[@]} ]; then
+ if (( ${#integrity_sums[@]} == ${#source[@]} )); then
  msg "$(gettext "Validating source files with %s...")" "${integ}sums"
  correlation=1
  local errors=0
@@ -566,8 +568,8 @@ check_checksums() {
  file="$(get_filename "$file")"
  echo -n "    $file ... " >&2

- if [ ! -f "$file" ] ; then
- if [ ! -f "$SRCDEST/$file" ] ; then
+ if [[ ! -f $file ]] ; then
+ if [[ ! -f $SRCDEST/$file ]] ; then
  echo "$(gettext "NOT FOUND")" >&2
  errors=1
  found=0
@@ -576,11 +578,11 @@ check_checksums() {
  fi
  fi

- if [ $found -gt 0 ] ; then
+ if (( found )) ; then
  local expectedsum="${integrity_sums[$idx],,}"
- local realsum="$(openssl dgst -${integ} "$file")"
+ local realsum="$(openssl dgst -"$integ" "$file")"
  realsum="${realsum##* }"
- if [ "$expectedsum" = "$realsum" ]; then
+ if [[ $expectedsum = $realsum ]]; then
  echo "$(gettext "Passed")" >&2
  else
  echo "$(gettext "FAILED")" >&2
@@ -591,18 +593,18 @@ check_checksums() {
  idx=$((idx + 1))
  done

- if [ $errors -gt 0 ]; then
+ if (( errors )); then
  error "$(gettext "One or more files did not pass the validity check!")"
  exit 1 # TODO: error code
  fi
- elif [ ${#integrity_sums[@]} -gt 0 ]; then
+ elif (( ${#integrity_sums[@]} )); then
  error "$(gettext "Integrity checks (%s) differ in size from the
source array.")" "$integ"
  exit 1 # TODO: error code
  fi
  done

- if [ $correlation -eq 0 ]; then
- if [ $SKIPINTEG -eq 1 ]; then
+ if (( ! correlation )); then
+ if (( SKIPINTEG )); then
  warning "$(gettext "Integrity checks are missing.")"
  else
  error "$(gettext "Integrity checks are missing.")"
@@ -616,14 +618,14 @@ extract_sources() {
  local netfile
  for netfile in "${source[@]}"; do
  file=$(get_filename "$netfile")
- if in_array "$file" ${noextract[@]}; then
+ if in_array "$file" "${noextract[@]}"; then
  #skip source files in the noextract=() array
  #  these are marked explicitly to NOT be extracted
  continue
  fi

- if [ ! -f "$file" ] ; then
- if [ ! -f "$SRCDEST/$file" ] ; then
+ if [[ ! -f $file ]] ; then
+ if [[ ! -f $SRCDEST/$file ]] ; then
  error "$(gettext "Unable to find source file %s for extraction.")" "$file"
  plain "$(gettext "Aborting...")"
  exit 1
@@ -634,7 +636,7 @@ extract_sources() {

  # fix flyspray #6246
  local file_type=$(file -bizL "$file")
- local ext=${file##*.}
+ local ext="${file##*.}"
  local cmd=''
  case "$file_type" in
  *application/x-tar*|*application/zip*|*application/x-zip*|*application/x-cpio*)
@@ -662,31 +664,31 @@ extract_sources() {

  local ret=0
  msg2 "$(gettext "Extracting %s with %s")" "$file" "$cmd"
- if [ "$cmd" = "bsdtar" ]; then
+ if [[ $cmd = "bsdtar" ]]; then
  $cmd -xf "$file" || ret=?
  else
  rm -f "${file%.*}"
  $cmd -dcf "$file" > "${file%.*}" || ret=?
  fi
- if [ $ret -ne 0 ]; then
+ if (( ret )); then
  error "$(gettext "Failed to extract %s")" "$file"
  plain "$(gettext "Aborting...")"
  exit 1
  fi
  done

- if [ $EUID -eq 0 ]; then
+ if (( EUID == 0 )); then
  # change perms of all source files to root user & root group
  chown -R 0:0 "$srcdir"
  fi
 }

 error_function() {
- if [ -p "$logpipe" ]; then
+ if [[ -p $logpipe ]]; then
  rm "$logpipe"
  fi
  # first exit all subshells, then print the error
- if [ $BASH_SUBSHELL -eq 0 ]; then
+ if (( ! BASH_SUBSHELL )); then
  plain "$(gettext "Aborting...")"
  remove_deps
  fi
@@ -694,13 +696,13 @@ error_function() {
 }

 run_function() {
- if [ -z "$1" ]; then
+ if [[ ! $1 ]]; then
  return 1
  fi
  pkgfunc="$1"

  # clear user-specified makeflags if requested
- if [ "$(check_option makeflags)" = "n" ]; then
+ if [[ $(check_option makeflags) = n ]]; then
  MAKEFLAGS=""
  fi

@@ -710,15 +712,15 @@ run_function() {
  # ensure all necessary build variables are exported
  export CFLAGS CXXFLAGS LDFLAGS MAKEFLAGS CHOST
  # save our shell options so pkgfunc() can't override what we need
- local shellopts=$(shopt -p)
+ local shellopts="$(shopt -p)"

  local ret=0
- if [ "$LOGGING" -eq 1 ]; then
+ if (( LOGGING )); then
  BUILDLOG="${startdir}/${pkgname}-${pkgver}-${pkgrel}-${CARCH}-$pkgfunc.log"
- if [ -f "$BUILDLOG" ]; then
+ if [[ -f $BUILDLOG ]]; then
  local i=1
  while true; do
- if [ -f "$BUILDLOG.$i" ]; then
+ if [[ -f $BUILDLOG.$i ]]; then
  i=$(($i +1))
  else
  break
@@ -735,16 +737,16 @@ run_function() {
  exec 1>"$logpipe" 2>"$logpipe"
  restoretrap=$(trap -p ERR)
  trap 'error_function' ERR
- $pkgfunc 2>&1
- eval $restoretrap
+ "$pkgfunc" 2>&1
+ eval "$restoretrap"
  sync
  exec 1>&3 2>&3 3>&-
  rm "$logpipe"
  else
- restoretrap=$(trap -p ERR)
+ restoretrap="$(trap -p ERR)"
  trap 'error_function' ERR
- $pkgfunc 2>&1
- eval $restoretrap
+ "$pkgfunc" 2>&1
+ eval "$restoretrap"
  fi
  # reset our shell options
  eval "$shellopts"
@@ -752,24 +754,24 @@ run_function() {

 run_build() {
  # use distcc if it is requested (check buildenv and PKGBUILD opts)
- if [ "$(check_buildenv distcc)" = "y" -a "$(check_option distcc)" !=
"n" ]; then
- [ -d /usr/lib/distcc/bin ] && export PATH="/usr/lib/distcc/bin:$PATH"
+ if [[ $(check_buildenv distcc) = "y" && $(check_option distcc) != n ]]; then
+ [[ -d /usr/lib/distcc/bin ]] && export PATH="/usr/lib/distcc/bin:$PATH"
  export DISTCC_HOSTS
- elif [ "$(check_option distcc)" = "n" ]; then
+ elif [[ $(check_option distcc) = "n" ]]; then
  # if it is not wanted, clear the makeflags too
  MAKEFLAGS=""
  fi

  # use ccache if it is requested (check buildenv and PKGBUILD opts)
- if [ "$(check_buildenv ccache)" = "y" -a "$(check_option ccache)" !=
"n" ]; then
- [ -d /usr/lib/ccache/bin ] && export PATH="/usr/lib/ccache/bin:$PATH"
+ if [[ $(check_buildenv ccache) = "y" && $(check_option ccache) != "n" ]]; then
+ [[ -d /usr/lib/ccache/bin ]] && export PATH="/usr/lib/ccache/bin:$PATH"
  fi

  run_function "build"
 }

 run_package() {
- if [ -z "$1" ]; then
+ if [[ ! $1 ]]; then
  pkgfunc="package"
  else
  pkgfunc="package_$1"
@@ -782,35 +784,35 @@ tidy_install() {
  cd "$pkgdir"
  msg "$(gettext "Tidying install...")"

- if [ "$(check_option docs)" = "n" -a -n "${DOC_DIRS[*]}" ]; then
+ if [[ $(check_option docs) = "n" && -n "${DOC_DIRS[@]}" ]; then
  msg2 "$(gettext "Removing doc files...")"
- rm -rf ${DOC_DIRS[@]}
+ rm -rf "${DOC_DIRS[@]}"
  fi

- if [ "$(check_option purge)" = "y" -a -n "${PURGE_TARGETS[*]}" ]; then
+ if [[ $(check_option purge) = "y" && -n ${PURGE_TARGETS[@]} ]]; then
  msg2 "$(gettext "Purging other files...")"
  local pt
  for pt in "${PURGE_TARGETS[@]}"; do
- if [ "${pt}" = "${pt//\/}" ]; then
+ if [[ ${pt} = ${pt//\/} ]]; then
  find . -type f -name "${pt}" -exec rm -f -- '{}' \;
  else
- rm -f ${pt}
+ rm -f "$pt"
  fi
  done
  fi

- if [ "$(check_option zipman)" = "y" -a -n "${MAN_DIRS[*]}" ]; then
+ if [[ $(check_option zipman) = y && -n ${MAN_DIRS[@]} ]]; then
  msg2 "$(gettext "Compressing man and info pages...")"
  local manpage ext file link hardlinks hl
- find ${MAN_DIRS[@]} -type f 2>/dev/null |
+ find "${MAN_DIRS[@]}" -type f 2>/dev/null |
  while read manpage ; do
  # check file still exists (potentially compressed with hard link)
- if [ -f ${manpage} ]; then
+ if [[ -f $manpage ]]; then
  ext="${manpage##*.}"
  file="${manpage##*/}"
- if [ "$ext" != "gz" -a "$ext" != "bz2" ]; then
+ if [[ $ext != gz && $ext != bz2 ]]; then
  # update symlinks to this manpage
- find ${MAN_DIRS[@]} -lname "$file" 2>/dev/null |
+ find "${MAN_DIRS[@]}" -lname "$file" 2>/dev/null |
  while read link ; do
  rm -f "$link"
  ln -sf "${file}.gz" "${link}.gz"
@@ -819,25 +821,25 @@ tidy_install() {
  #   the '|| true' part keeps the script from bailing if find returned an
  #   error, such as when one of the man directories doesn't exist
  hardlinks="$(find ${MAN_DIRS[@]} \! -name "$file" -samefile
"$manpage" 2>/dev/null)" || true
- for hl in ${hardlinks}; do
- rm -f "${hl}";
+ for hl in "$hardlinks"; do
+ rm -f "$hl";
  done
  # compress the original
  gzip -9 "$manpage"
  # recreate hard links removed earlier
- for hl in ${hardlinks}; do
+ for hl in "$hardlinks"; do
  ln "${manpage}.gz" "${hl}.gz"
- chmod 644 ${hl}.gz
+ chmod 644 "${hl}.gz"
  done
  fi
  fi
  done
  fi

- if [ "$(check_option strip)" = "y" -a -n "${STRIP_DIRS[*]}" ]; then
+ if [[ $(check_option strip) = y && -n $STRIP_DIRS ]]; then
  msg2 "$(gettext "Stripping debugging symbols from binaries and
libraries...")"
  local binary
- find ${STRIP_DIRS[@]} -type f 2>/dev/null | while read binary ; do
+ find "${STRIP_DIRS[@]}" -type f 2>/dev/null | while read binary ; do
  case "$(file -biz "$binary")" in
  *compressed-encoding*)      # Skip compressed binaries
  ;;
@@ -851,12 +853,12 @@ tidy_install() {
  done
  fi

- if [ "$(check_option libtool)" = "n" ]; then
+ if [[ $(check_option libtool) = n ]]; then
  msg2 "$(gettext "Removing libtool .la files...")"
  find . ! -type d -name "*.la" -exec rm -f -- '{}' \;
  fi

- if [ "$(check_option emptydirs)" = "n" ]; then
+ if [[ $(check_option emptydirs) = n ]]; then
  msg2 "$(gettext "Removing empty directories...")"
  find . -depth -type d -empty -delete
  fi
@@ -864,7 +866,7 @@ tidy_install() {

 write_pkginfo() {
  local builddate=$(date -u "+%s")
- if [ -n "$PACKAGER" ]; then
+ if [[ -n $PACKAGER ]]; then
  local packager="$PACKAGER"
  else
  local packager="Unknown Packager"
@@ -874,12 +876,12 @@ write_pkginfo() {

  msg2 "$(gettext "Generating .PKGINFO file...")"
  echo "# Generated by makepkg $myver" >.PKGINFO
- if [ "$INFAKEROOT" -eq 1 ]; then
+ if (( INFAKEROOT )); then
  echo "# using $(fakeroot -v)" >>.PKGINFO
  fi
  echo "# $(LC_ALL=C date -u)" >>.PKGINFO
  echo "pkgname = $1" >>.PKGINFO
- [ "$SPLITPKG" -eq 1 ] && echo "pkgbase = $pkgbase" >>.PKGINFO
+ (( SPLITPKG )) && echo pkgbase = $pkgbase >>.PKGINFO
  echo "pkgver = $pkgver-$pkgrel" >>.PKGINFO
  echo "pkgdesc = $pkgdesc" >>.PKGINFO
  echo "url = $url" >>.PKGINFO
@@ -887,7 +889,7 @@ write_pkginfo() {
  echo "packager = $packager" >>.PKGINFO
  echo "size = $size" >>.PKGINFO
  echo "arch = $PKGARCH" >>.PKGINFO
- if [ "$(check_option force)" = "y" ]; then
+ if [[ $(check_option force) = y ]]; then
  echo "force = true" >> .PKGINFO
  fi

@@ -918,8 +920,8 @@ write_pkginfo() {
  done
  for it in "${packaging_options[@]}"; do
  local ret="$(check_option $it)"
- if [ "$ret" != "?" ]; then
- if [ "$ret" = "y" ]; then
+ if [[ $ret != ? ]]; then
+ if [[ $ret = y ]]; then
  echo "makepkgopt = $it" >>.PKGINFO
  else
  echo "makepkgopt = !$it" >>.PKGINFO
@@ -929,7 +931,7 @@ write_pkginfo() {

  # TODO maybe remove this at some point
  # warn if license array is not present or empty
- if [ -z "$license" ]; then
+ if [[ -z $license ]]; then
  warning "$(gettext "Please add a license line to your %s!")" "$BUILDSCRIPT"
  plain "$(gettext "Example for GPL\'ed software: license=('GPL').")"
  fi
@@ -941,14 +943,14 @@ check_package() {
  # check existence of backup files
  local file
  for file in "${backup[@]}"; do
- if [ ! -f "$file" ]; then
+ if [[ ! -f $file ]]; then
  warning "$(gettext "Invalid backup entry : %s")" "$file"
  fi
  done
 }

 create_package() {
- if [ ! -d "$pkgdir" ]; then
+ if [[ ! -d $pkgdir ]]; then
  error "$(gettext "Missing pkg/ directory.")"
  plain "$(gettext "Aborting...")"
  exit 1 # $E_MISSING_PKGDIR
@@ -959,16 +961,16 @@ create_package() {
  cd "$pkgdir"
  msg "$(gettext "Creating package...")"

- if [ -z "$1" ]; then
+ if [[ -z $1 ]]; then
  nameofpkg="$pkgname"
  else
  nameofpkg="$1"
  fi

- if [ "$arch" = "any" ]; then
+ if [[ $arch = "any" ]]; then
  PKGARCH="any"
  else
- PKGARCH=$CARCH
+ PKGARCH="$CARCH"
  fi

  write_pkginfo $nameofpkg
@@ -976,14 +978,14 @@ create_package() {
  local comp_files=".PKGINFO"

  # check for an install script
- if [ -n "$install" ]; then
+ if [[ -n $install ]]; then
  msg2 "$(gettext "Adding install script...")"
  cp "$startdir/$install" .INSTALL
  comp_files="$comp_files .INSTALL"
  fi

  # do we have a changelog?
- if [ -n "$changelog" ]; then
+ if [[ -n $changelog ]]; then
  msg2 "$(gettext "Adding package changelog...")"
  cp "$startdir/$changelog" .CHANGELOG
  comp_files="$comp_files .CHANGELOG"
@@ -1009,7 +1011,7 @@ create_package() {
  bsdtar -cf - $comp_files * > "$pkg_file" || ret=$?
  shopt -u nullglob

- if [ $ret -eq 0 ]; then
+ if (( ! ret )); then
  case "$PKGEXT" in
  *tar.gz)  gzip -f -n "$pkg_file" ;;
  *tar.bz2) bzip2 -f "$pkg_file" ;;
@@ -1018,7 +1020,7 @@ create_package() {
  ret=$?
  fi

- if [ $ret -ne 0 ]; then
+ if (( ret )); then
  error "$(gettext "Failed to create package file.")"
  exit 1 # TODO: error code
  fi
@@ -1042,8 +1044,8 @@ create_srcpackage() {
  msg2 "$(gettext "Adding %s...")" "$BUILDSCRIPT"
  ln -s "${BUILDFILE}" "${srclinks}/${pkgbase}/${BUILDSCRIPT}"

- if [ -n "$install" ]; then
- if [ -f $install ]; then
+ if [[ -n $install ]]; then
+ if [[ -f $install ]]; then
  msg2 "$(gettext "Adding install script...")"
  ln -s "${startdir}/$install" "${srclinks}/${pkgbase}/"
  else
@@ -1051,8 +1053,8 @@ create_srcpackage() {
  fi
  fi

- if [ -n "$changelog" ]; then
- if [ -f "$changelog" ]; then
+ if [[ -n $changelog ]]; then
+ if [[ -f $changelog ]]; then
  msg2 "$(gettext "Adding package changelog...")"
  ln -s "${startdir}/$changelog" "${srclinks}/${pkgbase}/"
  else
@@ -1086,7 +1088,7 @@ create_srcpackage() {
  # tar it up
  msg2 "$(gettext "Compressing source package...")"
  cd "${srclinks}"
- if ! bsdtar -c${TAR_OPT}Lf "$pkg_file" ${pkgbase}; then
+ if ! bsdtar -c${TAR_OPT}Lf "$pkg_file" "${pkgbase}"; then
  error "$(gettext "Failed to create source package file.")"
  exit 1 # TODO: error code
  fi
@@ -1095,17 +1097,17 @@ create_srcpackage() {
 }

 install_package() {
- [ "$INSTALL" -eq 0 ] && return
+ (( ! INSTALL )) && return

- if [ "$SPLITPKG" -eq 0 ]; then
+ if (( ! SPLITPKG )); then
  msg "$(gettext "Installing package ${pkgname} with pacman -U...")"
  else
  msg "$(gettext "Installing ${pkgbase} package group with pacman -U...")"
  fi

  local pkglist
- for pkg in ${pkgname[@]}; do
- if [ -f $PKGDEST/${pkg}-${pkgver}-${pkgrel}-${CARCH}${PKGEXT} ]; then
+ for pkg in "${pkgname[@]}"; do
+ if [[ -f $PKGDEST/${pkg}-${pkgver}-${pkgrel}-${CARCH}${PKGEXT} ]]; then
  pkglist="${pkglist} $PKGDEST/${pkg}-${pkgver}-${pkgrel}-${CARCH}${PKGEXT}"
  else
  pkglist="${pkglist} $PKGDEST/${pkg}-${pkgver}-${pkgrel}-any${PKGEXT}"
@@ -1113,13 +1115,13 @@ install_package() {
  done

  local ret=0
- if [ "$ASROOT" -eq 0 ]; then
+ if (( ! ASROOT )); then
  sudo pacman $PACMAN_OPTS -U ${pkglist} || ret=$?
  else
- pacman $PACMAN_OPTS -U ${pkglist} || ret=$?
+ pacman "$PACMAN_OPTS" -U "$pkglist" || ret=$?
  fi

- if [ $ret -ne 0 ]; then
+ if (( ret )); then
  warning "$(gettext "Failed to install built package(s).")"
  return 0
  fi
@@ -1127,45 +1129,44 @@ install_package() {

 check_sanity() {
  # check for no-no's in the build script
- if [ -z "$pkgname" ]; then
+ if [[ -z $pkgname ]]; then
  error "$(gettext "%s is not allowed to be empty.")" "pkgname"
  return 1
  fi
- if [ -z "$pkgver" ]; then
+ if [[ -z $pkgver ]]; then
  error "$(gettext "%s is not allowed to be empty.")" "pkgver"
  return 1
  fi
- if [ -z "$pkgrel" ]; then
+ if [[ -z $pkgrel ]]; then
  error "$(gettext "%s is not allowed to be empty.")" "pkgrel"
  return 1
  fi
- if [ "${pkgname:0:1}" == "-" ]; then
+ if [[ ${pkgname:0:1} = "-" ]]; then
  error "$(gettext "%s is not allowed to start with a hyphen.")" "pkgname"
  return 1
  fi
- if [ "$pkgver" != "${pkgver//-/}" ]; then
+ if [[ $pkgver != ${pkgver//-/} ]]; then
  error "$(gettext "%s is not allowed to contain hyphens.")" "pkgver"
  return 1
  fi
- if [ "$pkgrel" != "${pkgrel//-/}" ]; then
+ if [[ $pkgrel != ${pkgrel//-/} ]]; then
  error "$(gettext "%s is not allowed to contain hyphens.")" "pkgrel"
  return 1
  fi

- if [ "$arch" != 'any' ]; then
- if ! in_array $CARCH ${arch[@]}; then
- if [ "$IGNOREARCH" -eq 0 ]; then
- error "$(gettext "%s is not available for the '%s'
architecture.")" "$pkgbase" "$CARCH"
- plain "$(gettext "Note that many packages may need a line added
to their %s")" "$BUILDSCRIPT"
- plain "$(gettext "such as arch=('%s').")" "$CARCH"
- return 1
- fi
+ if [[ $arch != 'any' ]]; then
+ if ! in_array "$CARCH" "${arch[@]}"; then
+ if (( ! IGNOREARCH )); then
+ error "$(gettext "%s is not available for the '%s'
architecture.")" "$pkgbase" "$CARCH"
+ plain "$(gettext "Note that many packages may need a line added to
their %s")" "$BUILDSCRIPT"
+ plain "$(gettext "such as arch=('%s').")" "$CARCH"
+ return 1
  fi
  fi

  local provide
- for provide in ${provides[@]}; do
- if [ $provide != ${provide//</} -o $provide != ${provide//>/} ]; then
+ for provide in "${provides[@]}"; do
+ if [[ $provide != ${provide//</} || $provide != ${provide//>/} ]]; then
  error "$(gettext "Provides array cannot contain comparison (< or
>) operators.")"
  return 1
  fi
@@ -1173,7 +1174,7 @@ check_sanity() {

  local file
  for file in "${backup[@]}"; do
- if [ "${file:0:1}" = "/" ]; then
+ if [[ ${file:0:1} = "/" ]]; then
  error "$(gettext "Invalid backup entry : %s")" "$file"
  return 1
  fi
@@ -1181,44 +1182,44 @@ check_sanity() {

  local optdepend
  for optdepend in "${optdepends[@]}"; do
- pkg=${optdepend%%:*}
+ pkg="${optdepend%%:*}"
  if [[ ! $pkg =~ ^[[:alnum:]\>\<\=\.\+\_\-]*$ ]]; then
  error "$(gettext "Invalid syntax for optdepend : '%s'")" "$optdepend"
  fi
  done

- if [ "$install" -a ! -f "$install" ]; then
+ if [[ -n $install && ! -f $install ]]; then
  error "$(gettext "Install scriptlet (%s) does not exist.")" "$install"
  return 1
  fi

- if [ -n "$changelog" -a ! -f "$changelog" ]; then
+ if [[ -n $changelog && ! -f $changelog ]]; then
  error "$(gettext "Changelog file (%s) does not exist.")" "$changelog"
  return 1
  fi

  local valid_options=1
  local opt known kopt
- for opt in ${options[@]}; do
+ for opt in "${options[@]}"; do
  known=0
  # check if option matches a known option or its inverse
- for kopt in ${packaging_options[@]} ${other_options[@]}; do
- if [ "${opt}" = "${kopt}" -o "${opt}" = "!${kopt}" ]; then
+ for kopt in "${packaging_options[@]}" "${other_options[@]}"; do
+ if [[ ${opt} = ${kopt} || ${opt} = !${kopt} ]]; then
  known=1
  fi
  done
- if [ $known -eq 0 ]; then
+ if (( ! known )); then
  error "$(gettext "options array contains unknown option '%s'")" "$opt"
  valid_options=0
  fi
  done
- if [ $valid_options -eq 0 ]; then
+ if (( ! valid_options )); then
  return 1
  fi

- if [ "${#pkgname[@]}" -gt "1" ]; then
- for pkg in ${pkgname[@]}; do
- if [ "$(type -t package_${pkg})" != "function" ]; then
+ if (( ${#pkgname[@]} > 1 )); then
+ for pkg in "${pkgname[@]}"; do
+ if [[ $(type -t package_${pkg}) != function ]]; then
  error "$(gettext "missing package function for split package '%s'")" "$pkg"
  return 1
  fi
@@ -1233,42 +1234,42 @@ devel_check() {

  # Do not update pkgver if --holdver is set, when building a source package,
  # when reading PKGBUILD from pipe (-f), or if we cannot write to the file (-w)
- if [ "$HOLDVER" -eq 1 -o "$SOURCEONLY" -ne 0 -o ! -f "$BUILDFILE" \
-                      -o ! -w "$BUILDFILE" ]; then
+ if (( HOLDVER || SOURCEONLY )) || \
+ [[ ! -f $BUILDFILE || ! -w $BUILDFILE ]]; then
  return
  fi

- if [ -z "$FORCE_VER" ]; then
+ if [[ -z $FORCE_VER ]]; then
  # Check if this is a svn/cvs/etc PKGBUILD; set $newpkgver if so.
  # This will only be used on the first call to makepkg; subsequent
  # calls to makepkg via fakeroot will explicitly pass the version
  # number to avoid having to determine the version number twice.
  # Also do a brief check to make sure we have the VCS tool available.
  oldpkgver=$pkgver
- if [ -n "${_darcstrunk}" -a -n "${_darcsmod}" ] ; then
- [ $(type -p darcs) ] || return 0
+ if [[ -n ${_darcstrunk} && -n ${_darcsmod} ]] ; then
+ type -p darcs >/dev/null || return 0
  msg "$(gettext "Determining latest darcs revision...")"
  newpkgver=$(date +%Y%m%d)
- elif [ -n "${_cvsroot}" -a -n "${_cvsmod}" ] ; then
- [ $(type -p cvs) ] || return 0
+ elif [[ -n ${_cvsroot} && -n ${_cvsmod} ]] ; then
+ type -p cvs >/dev/null || return 0
  msg "$(gettext "Determining latest cvs revision...")"
  newpkgver=$(date +%Y%m%d)
- elif [ -n "${_gitroot}" -a -n "${_gitname}" ] ; then
- [ $(type -p git) ] || return 0
+ elif [[ -n ${_gitroot} && -n ${_gitname} ]] ; then
+ type -p git >/dev/null || return 0
  msg "$(gettext "Determining latest git revision...")"
  newpkgver=$(date +%Y%m%d)
- elif [ -n "${_svntrunk}" -a -n "${_svnmod}" ] ; then
- [ $(type -p svn) ] || return 0
+ elif [[ -n ${_svntrunk} && -n ${_svnmod} ]] ; then
+ type -p svn >/dev/null || return 0
  msg "$(gettext "Determining latest svn revision...")"
  newpkgver=$(LC_ALL=C svn info $_svntrunk | sed -n 's/^Last Changed
Rev: \([0-9]*\)$/\1/p')
- elif [ -n "${_bzrtrunk}" -a -n "${_bzrmod}" ] ; then
- [ $(type -p bzr) ] || return 0
+ elif [[ -n ${_bzrtrunk} && -n ${_bzrmod} ]] ; then
+ type -p bzr >/dev/null || return 0
  msg "$(gettext "Determining latest bzr revision...")"
- newpkgver=$(bzr revno ${_bzrtrunk})
- elif [ -n "${_hgroot}" -a -n "${_hgrepo}" ] ; then
- [ $(type -p hg) ] || return 0
+ newpkgver=$(bzr revno "${_bzrtrunk}")
+ elif [[ -n ${_hgroot} && -n ${_hgrepo} ]] ; then
+ type -p hg >/dev/null || return 0
  msg "$(gettext "Determining latest hg revision...")"
- if [ -d ./src/$_hgrepo ] ; then
+ if [[ -d ./src/$_hgrepo ]] ; then
  cd ./src/$_hgrepo
  hg pull
  hg update
@@ -1281,13 +1282,13 @@ devel_check() {
  cd ../../
  fi

- if [ -n "$newpkgver" ]; then
+ if [[ -n $newpkgver ]]; then
  msg2 "$(gettext "Version found: %s")" "$newpkgver"
  fi

  else
  # Version number retrieved from fakeroot->makepkg argument
- newpkgver=$FORCE_VER
+ newpkgver="$FORCE_VER"
  fi
 }

@@ -1301,9 +1302,9 @@ devel_update() {
  #  ...
  #  _foo=pkgver
  #
- if [ -n "$newpkgver" ]; then
- if [ "$newpkgver" != "$pkgver" ]; then
- if [ -f "$BUILDFILE" -a -w "$BUILDFILE" ]; then
+ if [[ -n $newpkgver ]]; then
+ if [[ $newpkgver != $pkgver ]]; then
+ if [[ -f $BUILDFILE && -w $BUILDFILE ]]; then
  @SEDINPLACE@ "s/^pkgver=[^ ]*/pkgver=$newpkgver/" "$BUILDFILE"
  @SEDINPLACE@ "s/^pkgrel=[^ ]*/pkgrel=1/" "$BUILDFILE"
  source "$BUILDFILE"
@@ -1313,16 +1314,16 @@ devel_update() {
 }

 backup_package_variables() {
- for var in ${splitpkg_overrides[@]}; do
+ for var in "${splitpkg_overrides[@]}"; do
  indirect="${var}_backup"
- eval "${indirect}=(\${$var[@]})"
+ eval "${indirect}=(\"\${$var[@]}\")"
  done
 }

 restore_package_variables() {
- for var in ${splitpkg_overrides[@]}; do
+ for var in "${splitpkg_overrides[@]}"; do
  indirect="${var}_backup"
- if [ -n "${!indirect}" ]; then
+ if [[ -n ${!indirect} ]]; then
  eval "${var}=(\${$indirect[@]})"
  else
  unset ${var}
@@ -1332,31 +1333,31 @@ restore_package_variables() {
  # pkgdesc gets restored as an array - convert back to a string
  local pkgdesc_backup="${pkgdesc[@]}"
  unset pkgdesc
- pkgdesc=${pkgdesc_backup}
+ pkgdesc="${pkgdesc_backup}"
 }

 # getopt like parser
 parse_options() {
- local short_options=$1; shift;
- local long_options=$1; shift;
+ local short_options="$1"; shift;
+ local long_options="$1"; shift;
  local ret=0;
- local unused_options=""
+ local unused_options=()

- while [ -n "$1" ]; do
- if [ ${1:0:2} = '--' ]; then
- if [ -n "${1:2}" ]; then
+ while [[ -n $1 ]]; do
+ if [[ ${1:0:2} = '--' ]]; then
+ if [[ -n ${1:2} ]]; then
  local match=""
- for i in ${long_options//,/ }; do
- if [ ${1:2} = ${i//:} ]; then
+ for i in "${long_options//,/ }"; do
+ if [[ ${1:2} = ${i//:} ]]; then
  match=$i
  break
  fi
  done
- if [ -n "$match" ]; then
- if [ ${1:2} = $match ]; then
+ if [[ -n $match ]]; then
+ if [[ ${1:2} = $match ]]; then
  printf ' %s' "$1"
  else
- if [ -n "$2" ]; then
+ if [[ -n $2 ]]; then
  printf ' %s' "$1"
  shift
  printf " '%s'" "$1"
@@ -1373,15 +1374,15 @@ parse_options() {
  shift
  break
  fi
- elif [ ${1:0:1} = '-' ]; then
+ elif [[ ${1:0:1} = '-' ]]; then
  for ((i=1; i<${#1}; i++)); do
  if [[ "$short_options" =~ "${1:i:1}" ]]; then
  if [[ "$short_options" =~ "${1:i:1}:" ]]; then
- if [ -n "${1:$i+1}" ]; then
+ if [[ -n ${1:$i+1} ]]; then
  printf ' -%s' "${1:i:1}"
  printf " '%s'" "${1:$i+1}"
  else
- if [ -n "$2" ]; then
+ if [[ -n $2 ]]; then
  printf ' -%s' "${1:i:1}"
  shift
  printf " '%s'" "${1}"
@@ -1400,20 +1401,18 @@ parse_options() {
  fi
  done
  else
- unused_options="${unused_options} '$1'"
+ unused_options+=("$1")
  fi
  shift
  done

  printf " --"
- if [ -n "$unused_options" ]; then
- for i in ${unused_options[@]}; do
- printf ' %s' "$i"
- done
- fi
- if [ -n "$1" ]; then
- while [ -n "$1" ]; do
- printf " '%s'" "${1}"
+ for i in "${unused_options[@]}"; do
+ printf ' %s' "$i"
+ done
+ if [[ -n $1 ]]; then
+ while [[ -n $1 ]]; do
+ printf " '%s'" "$1"
  shift
  done
  fi
@@ -1472,13 +1471,13 @@ There is NO WARRANTY, to the extent permitted
by law.\n")"
 # PROGRAM START

 # determine whether we have gettext; make it a no-op if we do not
-if [ ! $(type -t gettext) ]; then
+if ! type -t gettext >/dev/null; then
  gettext() {
  echo "$@"
  }
 fi

-ARGLIST=$@
+ARGLIST=("$@")

 # Parse Command Line Options.
 OPT_SHORT="AcCdefFghiLmop:rRsV"
@@ -1538,14 +1537,14 @@ while true; do
 done

 #preserve environment variables
-_PKGDEST=${PKGDEST}
-_SRCDEST=${SRCDEST}
+_PKGDEST="$PKGDEST"
+_SRCDEST="$SRCDEST"

 # default config is makepkg.conf
-MAKEPKG_CONF=${MAKEPKG_CONF:-$confdir/makepkg.conf}
+MAKEPKG_CONF="${MAKEPKG_CONF:-$confdir/makepkg.conf}"

 # Source the config file; fail if it is not found
-if [ -r "$MAKEPKG_CONF" ]; then
+if [[ -r $MAKEPKG_CONF ]]; then
  source "$MAKEPKG_CONF"
 else
  error "$(gettext "%s not found.")" "$MAKEPKG_CONF"
@@ -1554,13 +1553,13 @@ else
 fi

 # Source user-specific makepkg.conf overrides
-if [ -r ~/.makepkg.conf ]; then
+if [[ -r ~/.makepkg.conf ]]; then
  source ~/.makepkg.conf
 fi

 # check if messages are to be printed using color
 unset ALL_OFF BOLD BLUE GREEN RED YELLOW
-if [ -t 2 -a ! "$USE_COLOR" = "n" -a "$(check_buildenv color)" = "y" ]; then
+if [[ -t 2 && ! $USE_COLOR = "n" && $(check_buildenv color) = "y" ]]; then
  ALL_OFF="$(tput sgr0)"
  BOLD="$(tput bold)"
  BLUE="${BOLD}$(tput setaf 4)"
@@ -1577,23 +1576,23 @@ SRCDEST=${_SRCDEST:-$SRCDEST}
 SRCDEST=${SRCDEST:-$startdir} #default to $startdir if undefined


-if [ "$HOLDVER" -eq 1 -a -n "$FORCE_VER" ]; then
+if (( HOLDVER )) && [[ $FORCE_VER ]]; then
  # The '\\0' is here to prevent gettext from thinking --holdver is an option
  error "$(gettext "\\0--holdver and --forcever cannot both be specified" )"
  exit 1
 fi

-if [ "$CLEANCACHE" -eq 1 ]; then
+if (( CLEANCACHE )); then
  #fix flyspray feature request #5223
- if [ -n "$SRCDEST" -a "$SRCDEST" != "$startdir" ]; then
+ if [[ -n $SRCDEST && $SRCDEST != $startdir ]]; then
  msg "$(gettext "Cleaning up ALL files from %s.")" "$SRCDEST"
  echo -n "$(gettext "    Are you sure you wish to do this? ")"
  echo -n "$(gettext "[y/N]")"
  read answer
  answer="${answer^^}"
- if [ "$answer" = "$(gettext "YES")" -o "$answer" = "$(gettext "Y")" ]; then
+ if [[ $answer = $(gettext "YES") || $answer = $(gettext "Y") ]]; then
  rm "$SRCDEST"/*
- if [ $? -ne 0 ]; then
+ if (( $? )); then
  error "$(gettext "Problem removing files; you may not have
correct permissions in %s")" "$SRCDEST"
  exit 1
  else
@@ -1614,41 +1613,40 @@ if [ "$CLEANCACHE" -eq 1 ]; then
  fi
 fi

-if [ "$INFAKEROOT" -eq 0 ]; then
- if [ $EUID -eq 0 -a "$ASROOT" -eq 0 ]; then
+if (( ! INFAKEROOT )); then
+ if (( EUID == 0 && ! ASROOT )); then
  # Warn those who like to live dangerously.
  error "$(gettext "Running makepkg as root is a BAD idea and can cause")"
  plain "$(gettext "permanent, catastrophic damage to your system. If you")"
  plain "$(gettext "wish to run as root, please use the --asroot option.")"
  exit 1 # $E_USER_ABORT
- elif [ $EUID -gt 0 -a "$ASROOT" -eq 1 ]; then
+ elif (( EUID > 0 && ASROOT )); then
  # Warn those who try to use the --asroot option when they are not root
  error "$(gettext "The --asroot option is meant for the root user only.")"
  plain "$(gettext "Please rerun makepkg without the --asroot flag.")"
  exit 1 # $E_USER_ABORT
- elif [ "$(check_buildenv fakeroot)" = "y" -a $EUID -gt 0 ]; then
- if [ ! $(type -p fakeroot) ]; then
+ elif [[ $(check_buildenv fakeroot) = "y" ]] && (( EUID > 0 )); then
+ if ! type -p fakeroot >/dev/null; then
  error "$(gettext "Fakeroot must be installed if using the
'fakeroot' option")"
  plain "$(gettext "in the BUILDENV array in %s.")" "$MAKEPKG_CONF"
  exit 1
  fi
- elif [ $EUID -gt 0 ]; then
+ elif (( EUID > 0 )); then
  warning "$(gettext "Running makepkg as an unprivileged user will
result in non-root")"
  plain "$(gettext "ownership of the packaged files. Try using the
fakeroot environment by")"
  plain "$(gettext "placing 'fakeroot' in the BUILDENV array in
%s.")" "$MAKEPKG_CONF"
  sleep 1
  fi
 else
- if [ -z "$FAKEROOTKEY" ]; then
+ if [[ -z $FAKEROOTKEY ]]; then
  error "$(gettext "Do not use the '-F' option. This option is only
for use by makepkg.")"
  exit 1 # TODO: error code
  fi
 fi

 # check for sudo if we will need it during makepkg execution
-if [ "$ASROOT" -eq 0 \
-     -a \( "$DEP_BIN" -eq 1 -o "$RMDEPS" -eq 1 -o "$INSTALL" -eq 1 \) ]; then
- if [ ! "$(type -p sudo)" ]; then
+if (( ! ASROOT )) && (( DEP_BIN || RMDEPS || INSTALL )); then
+ if ! type -p sudo >/dev/null; then
  error "$(gettext "Cannot find the sudo binary! Is sudo installed?")"
  plain "$(gettext "Missing dependencies cannot be installed or
removed as a normal user")"
  plain "$(gettext "without sudo; install and configure sudo to
auto-resolve dependencies.")"
@@ -1660,9 +1658,9 @@ unset pkgname pkgbase pkgver pkgrel pkgdesc url
license groups provides
 unset md5sums replaces depends conflicts backup source install changelog build
 unset makedepends optdepends options noextract

-BUILDFILE=${BUILDFILE:-$BUILDSCRIPT}
-if [ ! -f "$BUILDFILE" ]; then
- if [ -t 0 ]; then
+BUILDFILE="${BUILDFILE:-$BUILDSCRIPT}"
+if [[ ! -f $BUILDFILE ]]; then
+ if [[ -t 0 ]]; then
  error "$(gettext "%s does not exist.")" "$BUILDFILE"
  exit 1
  else
@@ -1672,18 +1670,18 @@ if [ ! -f "$BUILDFILE" ]; then
  fi
 else
  crlftest=$(file "$BUILDFILE" | grep -F 'CRLF' || true)
- if [ -n "$crlftest" ]; then
+ if [[ -n $crlftest ]]; then
  error "$(gettext "%s contains CRLF characters and cannot be
sourced.")" "$BUILDFILE"
  exit 1
  fi

- if [ "${BUILDFILE:0:1}" != "/" ]; then
+ if [[ ${BUILDFILE:0:1} != "/" ]]; then
  BUILDFILE="$startdir/$BUILDFILE"
  fi
  source "$BUILDFILE"
 fi

-if [ "$GENINTEG" -eq 1 ]; then
+if (( GENINTEG )); then
  mkdir -p "$srcdir"
  cd "$srcdir"
  download_sources
@@ -1691,7 +1689,7 @@ if [ "$GENINTEG" -eq 1 ]; then
  exit 0 # $E_OK
 fi

-if [ "$(type -t package)" = "function" ]; then
+if [[ $(type -t package) = function ]]; then
  PKGFUNC=1
 fi

@@ -1705,17 +1703,17 @@ check_sanity || exit 1
 devel_check
 devel_update

-if [ "${#pkgname[@]}" -gt "1" ]; then
+if (( ${#pkgname[@]} > 1 )); then
  SPLITPKG=1
 fi

-pkgbase=${pkgbase:-${pkgname[0]}}
+pkgbase="${pkgbase:-${pkgname[0]}}"

-if [ "$SPLITPKG" -eq 0 ]; then
- if [ \( -f "$PKGDEST/${pkgname}-${pkgver}-${pkgrel}-${CARCH}${PKGEXT}" \
-     -o -f "$PKGDEST/${pkgname}-${pkgver}-${pkgrel}-any${PKGEXT}" \) \
- -a "$FORCE" -eq 0 -a "$SOURCEONLY" -eq 0 -a "$NOBUILD" -eq 0 ]; then
- if [ "$INSTALL" -eq 1 ]; then
+if (( ! $SPLITPKG )); then
+ if [[ -f "$PKGDEST/${pkgname}-${pkgver}-${pkgrel}-${CARCH}${PKGEXT}" \
+     || -f "$PKGDEST/${pkgname}-${pkgver}-${pkgrel}-any${PKGEXT}" ]] \
+ && (( ! FORCE && ! SOURCEONLY && ! NOBUILD )); then
+ if (( INSTALL )); then
  warning "$(gettext "A package has already been built, installing
existing package...")"
  install_package
  exit $?
@@ -1727,17 +1725,17 @@ if [ "$SPLITPKG" -eq 0 ]; then
 else
  allpkgbuilt=1
  somepkgbuilt=0
- for pkg in ${pkgname[@]}; do
- if [ \( -f "$PKGDEST/${pkg}-${pkgver}-${pkgrel}-${CARCH}${PKGEXT}" \
-     -o -f "$PKGDEST/${pkg}-${pkgver}-${pkgrel}-any${PKGEXT}" \) ]; then
+ for pkg in "${pkgname[@]}"; do
+ if [[ -f "$PKGDEST/${pkg}-${pkgver}-${pkgrel}-${CARCH}${PKGEXT}" \
+     || -f "$PKGDEST/${pkg}-${pkgver}-${pkgrel}-any${PKGEXT}"  ]]; then
  somepkgbuilt=1
  else
  allpkgbuilt=0
  fi
  done
- if [ "$FORCE" -eq 0 -a "$SOURCEONLY" -eq 0 -a "$NOBUILD" -eq 0 ]; then
- if [ "$allpkgbuilt" -eq 1 ]; then
- if [ "$INSTALL" -eq 1 ]; then
+ if (( FORCE == 0 && ! SOURCEONLY && ! NOBUILD )); then
+ if (( allpkgbuilt )); then
+ if (( INSTALL )); then
  warning "$(gettext "The package group has already been built,
installing existing packages...")"
  install_package
  exit $?
@@ -1746,7 +1744,7 @@ else
  exit 1
  fi
  fi
- if [ "$somepkgbuilt" -eq 1 ]; then
+ if (( somepkgbuilt )); then
  error "$(gettext "Part of the package group has already been
built. (use -f to overwrite)")"
  exit 1
  fi
@@ -1755,10 +1753,10 @@ else
 fi

 # Run the bare minimum in fakeroot
-if [ "$INFAKEROOT" -eq 1 ]; then
- if [ "$SPLITPKG" -eq 0 ]; then
- if [ "$PKGFUNC" -eq 0 ]; then
- if [ "$REPKG" -eq 0 ]; then
+if (( INFAKEROOT )); then
+ if (( ! SPLITPKG )); then
+ if (( ! PKGFUNC )); then
+ if (( ! REPKG )); then
  run_build
  tidy_install
  fi
@@ -1768,13 +1766,13 @@ if [ "$INFAKEROOT" -eq 1 ]; then
  fi
  create_package
  else
- for pkg in ${pkgname[@]}; do
+ for pkg in "${pkgname[@]}"; do
  pkgdir="$pkgdir/$pkg"
  mkdir -p "$pkgdir"
  backup_package_variables
- run_package $pkg
+ run_package "$pkg"
  tidy_install
- create_package $pkg
+ create_package "$pkg"
  restore_package_variables
  pkgdir="${pkgdir%/*}"
  done
@@ -1787,9 +1785,9 @@ fi
 msg "$(gettext "Making package: %s")" "$pkgbase $pkgver-$pkgrel ($(date))"

 # if we are creating a source-only package, go no further
-if [ "$SOURCEONLY" -ne 0 ]; then
- if [ -f "$PKGDEST/${pkgbase}-${pkgver}-${pkgrel}${SRCEXT}" \
-     -a "$FORCE" -eq 0 ]; then
+if (( SOURCEONLY )); then
+ if [[ -f "$PKGDEST/${pkgbase}-${pkgver}-${pkgrel}${SRCEXT}" ]] \
+     && (( ! FORCE )); then
  error "$(gettext "A package has already been built. (use -f to overwrite)")"
  exit 1
  fi
@@ -1799,22 +1797,22 @@ if [ "$SOURCEONLY" -ne 0 ]; then
 fi

 # fix flyspray bug #5973
-if [ "$NODEPS" -eq 1 -o "$NOBUILD" -eq 1 -o "$REPKG" -eq 1 ]; then
+if (( NODEPS || NOBUILD || REPKG )); then
  # no warning message needed for nobuild, repkg
- if [ "$NODEPS" -eq 1 ]; then
+ if (( NODEPS )); then
  warning "$(gettext "Skipping dependency checks.")"
  fi
-elif [ $(type -p pacman) ]; then
+elif type -p pacman >/dev/null ; then
  unset pkgdeps # Set by resolve_deps() and used by remove_deps()
  deperr=0

  msg "$(gettext "Checking Runtime Dependencies...")"
- resolve_deps ${depends[@]} || deperr=1
+ resolve_deps "${depends[@]}" || deperr=1

  msg "$(gettext "Checking Buildtime Dependencies...")"
- resolve_deps ${makedepends[@]} || deperr=1
+ resolve_deps "${makedepends[@]}" || deperr=1

- if [ $deperr -eq 1 ]; then
+ if (( deperr )); then
  error "$(gettext "Could not resolve all dependencies.")"
  exit 1
  fi
@@ -1829,19 +1827,19 @@ umask 0022
 mkdir -p "$srcdir"
 cd "$srcdir"

-if [ "$NOEXTRACT" -eq 1 ]; then
+if (( NOEXTRACT )); then
  warning "$(gettext "Skipping source retrieval        -- using
existing src/ tree")"
  warning "$(gettext "Skipping source integrity checks -- using
existing src/ tree")"
  warning "$(gettext "Skipping source extraction       -- using
existing src/ tree")"

- if [ "$NOEXTRACT" -eq 1 -a -z "$(ls "$srcdir" 2>/dev/null)" ]; then
+ if (( NOEXTRACT )) && [[ -z $(ls $srcdir 2>/dev/null) ]]; then
  error "$(gettext "The source directory is empty, there is nothing
to build!")"
  plain "$(gettext "Aborting...")"
  exit 1
  fi
-elif [ "$REPKG" -eq 1 ]; then
- if [ "$PKGFUNC" -eq 0 -a "$SPLITPKG" -eq 0 \
-     -a \( ! -d "$pkgdir" -o -z "$(ls "$pkgdir" 2>/dev/null)" \) ]; then
+elif (( REPKG )); then
+ if (( ! PKGFUNC && ! SPLITPKG )) \
+     && [[ ! -d $pkgdir || -z $(ls "$pkgdir" 2>/dev/null) ]]; then
  error "$(gettext "The package directory is empty, there is nothing
to repackage!")"
  plain "$(gettext "Aborting...")"
  exit 1
@@ -1852,13 +1850,13 @@ else
  extract_sources
 fi

-if [ "$NOBUILD" -eq 1 ]; then
+if (( NOBUILD )); then
  msg "$(gettext "Sources are ready.")"
  exit 0 #E_OK
 else
  # check for existing pkg directory; don't remove if we are repackaging
- if [ -d "$pkgdir" \
-     -a \( "$REPKG" -eq 0 -o "$PKGFUNC" -eq 1 -o "$SPLITPKG" -eq 1 \) ]; then
+ if [[ -d $pkgdir ]] \
+     && (( ! REPKG || PKGFUNC || SPLITPKG )); then
  msg "$(gettext "Removing existing pkg/ directory...")"
  rm -rf "$pkgdir"
  fi
@@ -1866,33 +1864,33 @@ else
  cd "$startdir"

  # if we are root or if fakeroot is not enabled, then we don't use it
- if [ "$(check_buildenv fakeroot)" != "y" -o $EUID -eq 0 ]; then
- if [ "$REPKG" -eq 0 ]; then
+ if [[ $(check_buildenv fakeroot) != "y" ]] || (( EUID == 0 )); then
+ if (( ! REPKG )); then
  devel_update
  run_build
  fi
- if [ "$SPLITPKG" -eq 0 ]; then
- if [ "$PKGFUNC" -eq 1 ]; then
+ if (( ! SPLITPKG )); then
+ if (( PKGFUNC )); then
  run_package
  tidy_install
- elif [ "$REPKG" -eq 0 ]; then
+ elif (( ! REPKG )); then
  tidy_install
  fi
  create_package
  else
- for pkg in ${pkgname[@]}; do
+ for pkg in "${pkgname[@]}"; do
  pkgdir="$pkgdir/$pkg"
  mkdir -p "$pkgdir"
  backup_package_variables
- run_package $pkg
+ run_package "$pkg"
  tidy_install
- create_package $pkg
+ create_package "$pkg"
  restore_package_variables
  pkgdir="${pkgdir%/*}"
  done
  fi
  else
- if [ "$REPKG" -eq 0 -a \( "$PKGFUNC" -eq 1 -o "$SPLITPKG" -eq 1 \) ]; then
+ if (( ! REPKG && ( PKGFUNC || SPLITPKG ) )); then
  devel_update
  run_build
  cd "$startdir"
@@ -1900,10 +1898,10 @@ else

  msg "$(gettext "Entering fakeroot environment...")"

- if [ -n "$newpkgver" ]; then
- fakeroot -- $0 --forcever $newpkgver -F $ARGLIST || exit $?
+ if [[ -n $newpkgver ]]; then
+ fakeroot -- "$0" --forcever "$newpkgver" -F "${ARGLIST[@]}" || exit $?
  else
- fakeroot -- $0 -F $ARGLIST || exit $?
+ fakeroot -- "$0" -F "${ARGLIST[@]}" || exit $?
  fi
  fi
 fi
--
1.6.5.1


Re: Patch makepkg to use more [[ and (( bash syntax

by Allan McRae-3 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Isaac Good wrote:
> See http://bugs.archlinux.org/task/16623 too
>
> >From d71c1f120351c0ab7396f5aabbe9cf0497621782 Mon Sep 17 00:00:00 2001
> From: Isaac Good <arch@...>
> Date: Sun, 25 Oct 2009 19:19:18 -0400
> Subject: [PATCH] Signed-off-by: Isaac Good <arch@...>
>
> Modified makepkg to use more of [[ ]] and (( )) bash constructs
>  

This part should be a separate patch as it appears unrelated to the main
patch:
> Added quotes to variables in a few places that were missing them or
> had {} instead
>  

I have had a brief look through the patch.   It sure is long...    This
bit highlights a concern:

> @@ -1900,10 +1898,10 @@ else
>
>   msg "$(gettext "Entering fakeroot environment...")"
>
> - if [ -n "$newpkgver" ]; then
> - fakeroot -- $0 --forcever $newpkgver -F $ARGLIST || exit $?
> + if [[ -n $newpkgver ]]; then
> + fakeroot -- "$0" --forcever "$newpkgver" -F "${ARGLIST[@]}" || exit $?
>   else
> - fakeroot -- $0 -F $ARGLIST || exit $?
> + fakeroot -- "$0" -F "${ARGLIST[@]}" || exit $?
>   fi
>   fi
>  fi
>  

Part of that is obviously due to a not fully rebased git repo
("${ARGLIST[@]}" changes).   As an aside, $newpkgver can never contain a
space so quotes are unneeded.

Anyway, given this patch touches all parts of the makepkg code base,
this problem is only going to get worse as applying any other patch will
probably require adjusting this patch.  

How about we put a freeze on makepkg patches at some point in the near
future in order to get this finalized and committed?  Given most/all
patches for makepkg waiting to be pushed are mine, I would not be too
put out if this freeze was called now, but if Dan was going to pull them
soon we could wait and save me some work.  :P    When that happens, I
will go through the (updated) patch line-by-line and check everything is OK.

Allan



Re: Patch makepkg to use more [[ and (( bash syntax

by Cedric Staniewski :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Isaac Good wrote:

> See http://bugs.archlinux.org/task/16623 too
>
>> >From d71c1f120351c0ab7396f5aabbe9cf0497621782 Mon Sep 17 00:00:00 2001
> From: Isaac Good <arch@...>
> Date: Sun, 25 Oct 2009 19:19:18 -0400
> Subject: [PATCH] Signed-off-by: Isaac Good <arch@...>
>
> Modified makepkg to use more of [[ ]] and (( )) bash constructs
> Added quotes to variables in a few places that were missing them or
> had {} instead
> ---
>  scripts/makepkg.sh.in |  594 ++++++++++++++++++++++++-------------------------
>  1 files changed, 296 insertions(+), 298 deletions(-)
>
> diff --git a/scripts/makepkg.sh.in b/scripts/makepkg.sh.in
> index 9cd7f2e..16a4f76 100644
> --- a/scripts/makepkg.sh.in
> +++ b/scripts/makepkg.sh.in
> @@ -82,22 +82,25 @@ PACMAN_OPTS=
>  ### SUBROUTINES ###
>
>  plain() {
> - local mesg=$1; shift
> + local mesg="$1"; shift
>   printf "${BOLD}    ${mesg}${ALL_OFF}\n" "$@" >&2
>  }
>
>  msg() {
> - local mesg=$1; shift
> +}
> +
> +msg() {
> + local mesg="$1"; shift
>   printf "${GREEN}==>${ALL_OFF}${BOLD} ${mesg}${ALL_OFF}\n" "$@" >&2
>  }
>
>  msg2() {
> - local mesg=$1; shift
> + local mesg="$1"; shift
>   printf "${BLUE}  ->${ALL_OFF}${BOLD} ${mesg}${ALL_OFF}\n" "$@" >&2
>  }
>
>  warning() {
> - local mesg=$1; shift
> + local mesg="$1"; shift
>   printf "${YELLOW}==> $(gettext "WARNING:")${ALL_OFF}${BOLD}
> ${mesg}${ALL_OFF}\n" "$@" >&2
>  }
>  <snip>

Before you split this patch, just a small note. You do not have to use quotes for assignment like

mesg=$1

and given that you remove quotes everywhere else, I do not think we want to add new ones here.

> $ a="asdf gfd gfd "
> $ b="jggd dsf ds"
> $ c=$a
> $ echo $c
> asdf gfd gfd
> $ c=$a$b
> $ echo $c
> asdf gfd gfd jggd dsf ds
> $ c=$a/$b
> $ echo $c
> asdf gfd gfd /jggd dsf ds



Re: Patch makepkg to use more [[ and (( bash syntax

by Dan McGee :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

On Mon, Oct 26, 2009 at 1:52 AM, Allan McRae <allan@...> wrote:

> Isaac Good wrote:
>>
>> See http://bugs.archlinux.org/task/16623 too
>>
>> >From d71c1f120351c0ab7396f5aabbe9cf0497621782 Mon Sep 17 00:00:00 2001
>> From: Isaac Good <arch@...>
>> Date: Sun, 25 Oct 2009 19:19:18 -0400
>> Subject: [PATCH] Signed-off-by: Isaac Good <arch@...>
>>
>> Modified makepkg to use more of [[ ]] and (( )) bash constructs
>>
>
> This part should be a separate patch as it appears unrelated to the main
> patch:
>>
>> Added quotes to variables in a few places that were missing them or
>> had {} instead
>>
>
> I have had a brief look through the patch.   It sure is long...    This bit
> highlights a concern:
>
>> @@ -1900,10 +1898,10 @@ else
>>
>>                msg "$(gettext "Entering fakeroot environment...")"
>>
>> -               if [ -n "$newpkgver" ]; then
>> -                       fakeroot -- $0 --forcever $newpkgver -F $ARGLIST
>> || exit $?
>> +               if [[ -n $newpkgver ]]; then
>> +                       fakeroot -- "$0" --forcever "$newpkgver" -F
>> "${ARGLIST[@]}" || exit $?
>>                else
>> -                       fakeroot -- $0 -F $ARGLIST || exit $?
>> +                       fakeroot -- "$0" -F "${ARGLIST[@]}" || exit $?
>>                fi
>>        fi
>>  fi
>>
>
> Part of that is obviously due to a not fully rebased git repo
> ("${ARGLIST[@]}" changes).   As an aside, $newpkgver can never contain a
> space so quotes are unneeded.
>
> Anyway, given this patch touches all parts of the makepkg code base, this
> problem is only going to get worse as applying any other patch will probably
> require adjusting this patch.
> How about we put a freeze on makepkg patches at some point in the near
> future in order to get this finalized and committed?  Given most/all patches
> for makepkg waiting to be pushed are mine, I would not be too put out if
> this freeze was called now, but if Dan was going to pull them soon we could
> wait and save me some work.  :P    When that happens, I will go through the
> (updated) patch line-by-line and check everything is OK.

I can hold off on doing anything to makepkg for the time being. I
wouldn't mind this going in as a patch series either if that makes it
easier (e.g. fix up a few functions at a time).

However, and I should get back to some discussion on these, I'm still
not fond of the following patches:
* makepkg: allow skipping intergrity checks when making source package
* makepkg: rework --skip-integ

But just a warning in case they clash with the patch from this thread.

-Dan


Re: [isaac.otherinbox.com] Re: Patch makepkg to use more [[ and (( bash syntax

by Isaac Good-4 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

On Mon, Oct 26, 2009 at 2:52 AM, Allan McRae <allan@...> wrote:
> This part should be a separate patch as it appears unrelated to the main patch:
>> Added quotes to variables in a few places that were missing them or
>> had {} instead

My apologizes for lumping these together. I got another patch in the
pipeline to fix an ugly `find` usage...

> I have had a brief look through the patch.   It sure is long...    This bit
> highlights a concern:
>
>> @@ -1900,10 +1898,10 @@ else
>>
>>                msg "$(gettext "Entering fakeroot environment...")"
>>
>> -               if [ -n "$newpkgver" ]; then
>> -                       fakeroot -- $0 --forcever $newpkgver -F $ARGLIST
>> || exit $?
>> +               if [[ -n $newpkgver ]]; then
>> +                       fakeroot -- "$0" --forcever "$newpkgver" -F
>> "${ARGLIST[@]}" || exit $?
>>                else
>> -                       fakeroot -- $0 -F $ARGLIST || exit $?
>> +                       fakeroot -- "$0" -F "${ARGLIST[@]}" || exit $?
>>                fi
>>        fi
>>  fi
>>
>
> Part of that is obviously due to a not fully rebased git repo
> ("${ARGLIST[@]}" changes).   As an aside, $newpkgver can never contain a
> space so quotes are unneeded.

If you are referring specifically to ARGLIST, the ARGLIST variable
only appears 3 times in the file. Bases on those 3 occurrences, this
change should have no affect other than preserving spaces in arguments
(and preserving the $@ as the array it is).


Re: [isaac.otherinbox.com] Re: Patch makepkg to use more [[ and (( bash syntax

by Dan McGee :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

On Mon, Oct 26, 2009 at 9:17 PM, Isaac Good <pacman@...> wrote:
> On Mon, Oct 26, 2009 at 2:52 AM, Allan McRae <allan@...> wrote:
>> Part of that is obviously due to a not fully rebased git repo
>> ("${ARGLIST[@]}" changes).   As an aside, $newpkgver can never contain a
>> space so quotes are unneeded.
>
> If you are referring specifically to ARGLIST, the ARGLIST variable
> only appears 3 times in the file. Bases on those 3 occurrences, this
> change should have no affect other than preserving spaces in arguments
> (and preserving the $@ as the array it is).

See the change I had pushed to maint but just merged into master; we
had this taken care of already.

Separate patches for separate changes are always appreciated around
here, even if the patch series depends on a previous one. It makes for
much easier reviewing and subsequent approval.

-Dan


Re: [isaac.otherinbox.com] Re: Patch makepkg to use more [[ and (( bash syntax

by Allan McRae-3 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Isaac Good wrote:

> On Mon, Oct 26, 2009 at 2:52 AM, Allan McRae <allan@...> wrote:
>  
>> This part should be a separate patch as it appears unrelated to the main patch:
>>    
>>> Added quotes to variables in a few places that were missing them or
>>> had {} instead
>>>      
>
> My apologizes for lumping these together. I got another patch in the
> pipeline to fix an ugly `find` usage...
>
>  
>> I have had a brief look through the patch.   It sure is long...    This bit
>> highlights a concern:
>>
>>    
>>> @@ -1900,10 +1898,10 @@ else
>>>
>>>                msg "$(gettext "Entering fakeroot environment...")"
>>>
>>> -               if [ -n "$newpkgver" ]; then
>>> -                       fakeroot -- $0 --forcever $newpkgver -F $ARGLIST
>>> || exit $?
>>> +               if [[ -n $newpkgver ]]; then
>>> +                       fakeroot -- "$0" --forcever "$newpkgver" -F
>>> "${ARGLIST[@]}" || exit $?
>>>                else
>>> -                       fakeroot -- $0 -F $ARGLIST || exit $?
>>> +                       fakeroot -- "$0" -F "${ARGLIST[@]}" || exit $?
>>>                fi
>>>        fi
>>>  fi
>>>
>>>      
>> Part of that is obviously due to a not fully rebased git repo
>> ("${ARGLIST[@]}" changes).   As an aside, $newpkgver can never contain a
>> space so quotes are unneeded.
>>    
>
> If you are referring specifically to ARGLIST, the ARGLIST variable
> only appears 3 times in the file. Bases on those 3 occurrences, this
> change should have no affect other than preserving spaces in arguments
> (and preserving the $@ as the array it is).
>  

I think you missed my point here.  That was commited to the git repo[1]
and it appears the rebasing of your patch was not complete:
[1] http://projects.archlinux.org/pacman.git/commit/?h=maint&id=fff6d9dc

Allan




Re: Patch makepkg to use more [[ and (( bash syntax

by Isaac Good-4 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

On Mon, Oct 26, 2009 at 10:07 PM, Dan McGee <dpmcgee@...> wrote:
> However, and I should get back to some discussion on these, I'm still
> not fond of the following patches:
> * makepkg: allow skipping intergrity checks when making source package
> * makepkg: rework --skip-integ
>
> But just a warning in case they clash with the patch from this thread.

I tried being careful that none of the changes I made in any way would
modify the expected behavior of the script in any way so I would not
expect any clash. The biggest behavioral change is that a lot of
variables are now tested for true/false eg (( ASROOT )). So long as
these variables are only set to 0 or 1 this will work fine. Some
variables (well, just SOURCEONLY) can take on the values 0, 1 or 2 so
it needs some extra care.

Hrm. I just noticed I missed a few spots. Lines 237, 324,1068, 1071.


Re: Patch makepkg to use more [[ and (( bash syntax

by Allan McRae-3 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Isaac Good wrote:

> See http://bugs.archlinux.org/task/16623 too
>
> >From d71c1f120351c0ab7396f5aabbe9cf0497621782 Mon Sep 17 00:00:00 2001
> From: Isaac Good <arch@...>
> Date: Sun, 25 Oct 2009 19:19:18 -0400
> Subject: [PATCH] Signed-off-by: Isaac Good <arch@...>
>
> Modified makepkg to use more of [[ ]] and (( )) bash constructs
> Added quotes to variables in a few places that were missing them or
> had {} instead
> ---
>  
<snip>

It is possible to re-submit this patch based of the current master
branch and just covering the [[ ]] and (( )) tests (i.e. move the quotes
part to another patch).  Then I will do a full review and get this
applied a.s.a.p so we can get the other makepkg patches rebased and
making their way onto the git repo.

Thanks,
Allan



Re: [isaac.otherinbox.com] Re: Patch makepkg to use more [[ and (( bash syntax

by Isaac Good-4 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

On Tue, Oct 27, 2009 at 11:53 PM, Allan McRae <allan@...> wrote:
> It is possible to re-submit this patch based of the current master branch
> and just covering the [[ ]] and (( )) tests (i.e. move the quotes part to
> another patch).  Then I will do a full review and get this applied a.s.a.p
> so we can get the other makepkg patches rebased and making their way onto
> the git repo.
>
> Thanks,
> Allan
>

I can work on that.
 Isaac


Re: Patch makepkg to use more [[ and (( bash syntax

by Allan McRae-3 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Isaac Good wrote:
> On Tue, Oct 27, 2009 at 11:53 PM, Allan McRae <allan@...> wrote:
>  
>> It is possible to re-submit this patch based of the current master branch
>> and just covering the [[ ]] and (( )) tests (i.e. move the quotes part to
>> another patch).  Then I will do a full review and get this applied a.s.a.p
>> so we can get the other makepkg patches rebased and making their way onto
>> the git repo.
>
> I can work on that.

Not wanting to make you feel rushed or anything, but is the any progress
on this?

Thanks,
Allan



Re: [isaac.otherinbox.com] Re: Patch makepkg to use more [[ and (( bash syntax

by Isaac Good-4 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

On Wed, Nov 4, 2009 at 1:39 AM, Allan McRae <allan@...> wrote:

> Isaac Good wrote:
>>
>> On Tue, Oct 27, 2009 at 11:53 PM, Allan McRae <allan@...> wrote:
>>
>>>
>>> It is possible to re-submit this patch based of the current master branch
>>> and just covering the [[ ]] and (( )) tests (i.e. move the quotes part to
>>> another patch).  Then I will do a full review and get this applied
>>> a.s.a.p
>>> so we can get the other makepkg patches rebased and making their way onto
>>> the git repo.
>>
>> I can work on that.
>
> Not wanting to make you feel rushed or anything, but is the any progress on
> this?
>
> Thanks,
> Allan
>

Sorry. Nothing yet. I had a busy week.


Re: Patch makepkg to use more [[ and (( bash syntax

by Isaac Good-4 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

I'm having trouble figuring out the git format-patch at 3:00am so I just did a git diff...

I apologize for the delay. I didn't know that makepkg freeze was started yet. This patch covers the half of makepkg

Replaces [ with [[ and (( and updates the syntax inside the [[ or ((, mainly dropping quotes, dropping $ inside (( and replacing stuff like -a with &&, -o with || etc

[PATCH] Signed-off-by: Isaac Good <pacman@...>


diff --git a/scripts/makepkg.sh.in b/scripts/makepkg.sh.in
index 92b0454..eb0e4d7 100644
--- a/scripts/makepkg.sh.in
+++ b/scripts/makepkg.sh.in
@@ -112,7 +112,7 @@ error() {
 # the fakeroot call, the error message will be printed by the main call.
 ##
 trap_exit() {
- if [ "$INFAKEROOT" -eq 0 ]; then
+ if (( ! INFAKEROOT )); then
  echo
  error "$@"
  fi
@@ -126,21 +126,21 @@ trap_exit() {
 clean_up() {
  local EXIT_CODE=$?
 
- if [ "$INFAKEROOT" -eq 1 ]; then
+ if (( INFAKEROOT )); then
  # Don't clean up when leaving fakeroot, we're not done yet.
  return
  fi
 
- if [ $EXIT_CODE -eq 0 -a "$CLEANUP" -eq 1 ]; then
+ if (( ! EXIT_CODE && CLEANUP )); then
  # If it's a clean exit and -c/--clean has been passed...
  msg "$(gettext "Cleaning up...")"
  rm -rf "$pkgdir" "$srcdir"
- if [ -n "$pkgbase" ]; then
+ if [[ -n $pkgbase ]]; then
  # Can't do this unless the BUILDSCRIPT has been sourced.
  rm -f "${pkgbase}-${pkgver}-${pkgrel}-${CARCH}-build.log"*
- if [ "$PKGFUNC" -eq 1 ]; then
+ if (( PKGFUNC )); then
  rm -f "${pkgbase}-${pkgver}-${pkgrel}-${CARCH}-package.log"*
- elif [ "$SPLITPKG" -eq 1 ]; then
+ elif (( SPLITPKG )); then
  for pkg in ${pkgname[@]}; do
  rm -f "${pkg}-${pkgver}-${pkgrel}-${CARCH}-package.log"*
  done
@@ -190,14 +190,14 @@ get_url() {
 ##
 check_option() {
  local ret=$(in_opt_array "$1" ${options[@]})
- if [ "$ret" != '?' ]; then
+ if [[ $ret != '?' ]]; then
  echo $ret
  return
  fi
 
  # fall back to makepkg.conf options
  ret=$(in_opt_array "$1" ${OPTIONS[@]})
- if [ "$ret" != '?' ]; then
+ if [[ $ret != '?' ]]; then
  echo $ret
  return
  fi
@@ -231,10 +231,10 @@ in_opt_array() {
  local opt
  for opt in "$@"; do
  opt="${opt,,}"
- if [ "$opt" = "$needle" ]; then
+ if [[ $opt = $needle ]]; then
  echo 'y' # Enabled
  return
- elif [ "$opt" = "!$needle" ]; then
+ elif [[ $opt = "!$needle" ]]; then
  echo 'n' # Disabled
  return
  fi
@@ -251,10 +251,10 @@ in_opt_array() {
 ##
 in_array() {
  local needle=$1; shift
- [ -z "$1" ] && return 1 # Not Found
+ [[ -z $1 ]] && return 1 # Not Found
  local item
  for item in "$@"; do
- [ "$item" = "$needle" ] && return 0 # Found
+ [[ $item = $needle ]] && return 0 # Found
  done
  return 1 # Not Found
 }
@@ -268,14 +268,14 @@ get_downloadclient() {
  local i
  for i in "${DLAGENTS[@]}"; do
  local handler="${i%%::*}"
- if [ "$proto" = "$handler" ]; then
+ if [[ $proto = $handler ]]; then
  agent="${i##*::}"
  break
  fi
  done
 
  # if we didn't find an agent, return an error
- if [ -z "$agent" ]; then
+ if [[ -z $agent ]]; then
  error "$(gettext "There is no agent set up to handle %s URLs. Check %s.")" "$proto" "$MAKEPKG_CONF"
  plain "$(gettext "Aborting...")"
  exit 1 # $E_CONFIG_ERROR
@@ -283,7 +283,7 @@ get_downloadclient() {
 
  # ensure specified program is installed
  local program="${agent%% *}"
- if [ ! -x "$program" ]; then
+ if [[ ! -x $program ]]; then
  local baseprog=$(basename $program)
  error "$(gettext "The download program %s is not installed.")" "$baseprog"
  plain "$(gettext "Aborting...")"
@@ -317,25 +317,25 @@ download_file() {
 
  local ret=0
  eval "$dlcmd || ret=\$?"
- if [ $ret -gt 0 ]; then
- [ ! -s "$dlfile" ] && rm -f -- "$dlfile"
+ if (( ret )); then
+ [[ ! -s $dlfile ]] && rm -f -- "$dlfile"
  return $ret
  fi
 
  # rename the temporary download file to the final destination
- if [ "$dlfile" != "$file" ]; then
+ if [[ $dlfile != $file ]]; then
  mv -f "$SRCDEST/$dlfile" "$SRCDEST/$file"
  fi
 }
 
 check_deps() {
- [ $# -gt 0 ] || return
+ (( $# )) || return
 
  pmout=$(pacman $PACMAN_OPTS -T "$@")
  ret=$?
- if [ $ret -eq 127 ]; then #unresolved deps
+ if (( ret == 127 )); then #unresolved deps
  echo "$pmout"
- elif [ $ret -ne 0 ]; then
+ elif (( ret )); then
  error "$(gettext "Pacman returned a fatal error (%i): %s")" "$ret" "$pmout"
  exit 1
  fi
@@ -345,26 +345,26 @@ handle_deps() {
  local R_DEPS_SATISFIED=0
  local R_DEPS_MISSING=1
 
- [ $# -eq 0 ] && return $R_DEPS_SATISFIED
+ (( $# == 0 )) && return $R_DEPS_SATISFIED
 
  local deplist="$*"
 
- if [ "$DEP_BIN" -eq 0 ]; then
+ if (( ! DEP_BIN )); then
  return $R_DEPS_MISSING
  fi
 
- if [ "$DEP_BIN" -eq 1 ]; then
+ if (( DEP_BIN )); then
  # install missing deps from binary packages (using pacman -S)
  msg "$(gettext "Installing missing dependencies...")"
  local ret=0
 
- if [ "$ASROOT" -eq 0 ]; then
+ if (( ! ASROOT )); then
  sudo pacman $PACMAN_OPTS -S --asdeps $deplist || ret=$?
  else
  pacman $PACMAN_OPTS -S --asdeps $deplist || ret=$?
  fi
 
- if [ $ret -ne 0 ]; then
+ if (( ret )); then
  error "$(gettext "Pacman failed to install missing dependencies.")"
  exit 1 # TODO: error code
  fi
@@ -385,7 +385,7 @@ resolve_deps() {
  local R_DEPS_MISSING=1
 
  local deplist="$(check_deps $*)"
- if [ -z "$deplist" ]; then
+ if [[ -z $deplist ]]; then
  return $R_DEPS_SATISFIED
  fi
 
@@ -393,8 +393,8 @@ resolve_deps() {
  pkgdeps="$pkgdeps $deplist"
  # check deps again to make sure they were resolved
  deplist="$(check_deps $*)"
- [ -z "$deplist" ] && return $R_DEPS_SATISFIED
- elif [ "$DEP_BIN" -eq 1 ]; then
+ [[ -z $deplist ]] && return $R_DEPS_SATISFIED
+ elif (( DEP_BIN )); then
  error "$(gettext "Failed to install all missing dependencies.")"
  fi
 
@@ -410,8 +410,8 @@ resolve_deps() {
 # fix flyspray bug #5923
 remove_deps() {
  # $pkgdeps is a GLOBAL variable, set by resolve_deps()
- [ "$RMDEPS" -eq 0 ] && return
- [ -z "$pkgdeps" ] && return
+ (( ! RMDEPS )) && return
+ [[ -z $pkgdeps ]] && return
 
  local dep depstrip deplist
  deplist=""
@@ -422,14 +422,14 @@ remove_deps() {
 
  msg "Removing installed dependencies..."
  local ret=0
- if [ "$ASROOT" -eq 0 ]; then
+ if (( ! ASROOT )); then
  sudo pacman $PACMAN_OPTS -Rns $deplist || ret=$?
  else
  pacman $PACMAN_OPTS -Rns $deplist || ret=$?
  fi
 
  # Fixes FS#10039 - exit cleanly as package has built successfully
- if [ $ret -ne 0 ]; then
+ if (( ret )); then
  warning "$(gettext "Failed to remove installed dependencies.")"
  return 0
  fi
@@ -438,7 +438,7 @@ remove_deps() {
 download_sources() {
  msg "$(gettext "Retrieving Sources...")"
 
- if [ ! -w "$SRCDEST" ] ; then
+ if [[ ! -w $SRCDEST ]] ; then
  error "$(gettext "You do not have write permission to store downloads in %s.")" "$SRCDEST"
  plain "$(gettext "Aborting...")"
  exit 1
@@ -450,12 +450,12 @@ download_sources() {
  for netfile in "${source[@]}"; do
  local file=$(get_filename "$netfile")
  local url=$(get_url "$netfile")
- if [ -f "$startdir/$file" ]; then
+ if [[ -f "$startdir/$file" ]]; then
  msg2 "$(gettext "Found %s in build dir")" "$file"
  rm -f "$srcdir/$file"
  ln -s "$startdir/$file" "$srcdir/"
  continue
- elif [ -f "$SRCDEST/$file" ]; then
+ elif [[ -f "$SRCDEST/$file" ]]; then
  msg2 "$(gettext "Using cached copy of %s")" "$file"
  rm -f "$srcdir/$file"
  ln -s "$SRCDEST/$file" "$srcdir/"
@@ -463,7 +463,7 @@ download_sources() {
  fi
 
  # if we get here, check to make sure it was a URL, else fail
- if [ "$file" = "$url" ]; then
+ if [[ $file = $url ]]; then
  error "$(gettext "%s was not found in the build directory and is not a URL.")" "$file"
  exit 1 # $E_MISSING_FILE
  fi
@@ -475,7 +475,7 @@ download_sources() {
  # fix flyspray bug #3289
  local ret=0
  download_file "$dlclient" "$url" "$file" || ret=$?
- if [ $ret -gt 0 ]; then
+ if (( ret )); then
  error "$(gettext "Failure while downloading %s")" "$file"
  plain "$(gettext "Aborting...")"
  exit 1
@@ -512,7 +512,7 @@ generate_checksums() {
 
  local i=0;
  local indent=''
- while [ $i -lt $((${#integ}+6)) ]; do
+ while [[ $i -lt $((${#integ}+6)) ]]; do
  indent="$indent "
  i=$(($i+1))
  done
@@ -521,8 +521,8 @@ generate_checksums() {
  for netfile in "${source[@]}"; do
  local file="$(get_filename "$netfile")"
 
- if [ ! -f "$file" ] ; then
- if [ ! -f "$SRCDEST/$file" ] ; then
+ if [[ ! -f $file ]] ; then
+ if [[ ! -f "$SRCDEST/$file" ]] ; then
  error "$(gettext "Unable to find source file %s to generate checksum.")" "$file"
  plain "$(gettext "Aborting...")"
  exit 1
@@ -533,10 +533,10 @@ generate_checksums() {
 
  local sum="$(openssl dgst -${integ} "$file")"
  sum=${sum##* }
- [ $ct -gt 0 ] && echo -n "$indent"
+ (( ct )) && echo -n $indent
  echo -n "'$sum'"
  ct=$(($ct+1))
- [ $ct -lt $numsrc ] && echo
+ (( $ct < $numsrc )) && echo
  done
 
  echo ")"
@@ -544,7 +544,7 @@ generate_checksums() {
 }
 
 check_checksums() {
- [ ${#source[@]} -eq 0 ] && return 0
+ (( ! ${#source[@]} )) && return 0
 
  if [ ! $(type -p openssl) ]; then
  error "$(gettext "Cannot find openssl.")"
@@ -555,7 +555,7 @@ check_checksums() {
  local integ required
  for integ in md5 sha1 sha256 sha384 sha512; do
  local integrity_sums=($(eval echo "\${${integ}sums[@]}"))
- if [ ${#integrity_sums[@]} -eq ${#source[@]} ]; then
+ if (( ${#integrity_sums[@]} == ${#source[@]} )); then
  msg "$(gettext "Validating source files with %s...")" "${integ}sums"
  correlation=1
  local errors=0
@@ -566,8 +566,8 @@ check_checksums() {
  file="$(get_filename "$file")"
  echo -n "    $file ... " >&2
 
- if [ ! -f "$file" ] ; then
- if [ ! -f "$SRCDEST/$file" ] ; then
+ if [[ ! -f $file ]] ; then
+ if [[ ! -f "$SRCDEST/$file" ]] ; then
  echo "$(gettext "NOT FOUND")" >&2
  errors=1
  found=0
@@ -576,11 +576,11 @@ check_checksums() {
  fi
  fi
 
- if [ $found -gt 0 ] ; then
+ if (( $found )) ; then
  local expectedsum="${integrity_sums[$idx],,}"
  local realsum="$(openssl dgst -${integ} "$file")"
  realsum="${realsum##* }"
- if [ "$expectedsum" = "$realsum" ]; then
+ if [[ $expectedsum = $realsum ]]; then
  echo "$(gettext "Passed")" >&2
  else
  echo "$(gettext "FAILED")" >&2
@@ -591,18 +591,18 @@ check_checksums() {
  idx=$((idx + 1))
  done
 
- if [ $errors -gt 0 ]; then
+ if (( errors )); then
  error "$(gettext "One or more files did not pass the validity check!")"
  exit 1 # TODO: error code
  fi
- elif [ ${#integrity_sums[@]} -gt 0 ]; then
+ elif (( ${#integrity_sums[@]} )); then
  error "$(gettext "Integrity checks (%s) differ in size from the source array.")" "$integ"
  exit 1 # TODO: error code
  fi
  done
 
- if [ $correlation -eq 0 ]; then
- if [ $SKIPINTEG -eq 1 ]; then
+ if (( ! correlation )); then
+ if (( SKIPINTEG )); then
  warning "$(gettext "Integrity checks are missing.")"
  else
  error "$(gettext "Integrity checks are missing.")"
@@ -622,8 +622,8 @@ extract_sources() {
  continue
  fi
 
- if [ ! -f "$file" ] ; then
- if [ ! -f "$SRCDEST/$file" ] ; then
+ if [[ ! -f $file ]] ; then
+ if [[ ! -f "$SRCDEST/$file" ]] ; then
  error "$(gettext "Unable to find source file %s for extraction.")" "$file"
  plain "$(gettext "Aborting...")"
  exit 1
@@ -662,31 +662,31 @@ extract_sources() {
 
  local ret=0
  msg2 "$(gettext "Extracting %s with %s")" "$file" "$cmd"
- if [ "$cmd" = "bsdtar" ]; then
+ if [[ $cmd = bsdtar ]]; then
  $cmd -xf "$file" || ret=?
  else
  rm -f "${file%.*}"
  $cmd -dcf "$file" > "${file%.*}" || ret=?
  fi
- if [ $ret -ne 0 ]; then
+ if (( ret )); then
  error "$(gettext "Failed to extract %s")" "$file"
  plain "$(gettext "Aborting...")"
  exit 1
  fi
  done
 
- if [ $EUID -eq 0 ]; then
+ if (( EUID == 0 )); then
  # change perms of all source files to root user & root group
  chown -R 0:0 "$srcdir"
  fi
 }
 
 error_function() {
- if [ -p "$logpipe" ]; then
+ if [[ -p $logpipe ]]; then
  rm "$logpipe"
  fi
  # first exit all subshells, then print the error
- if [ $BASH_SUBSHELL -eq 0 ]; then
+ if (( ! BASH_SUBSHELL )); then
  plain "$(gettext "Aborting...")"
  remove_deps
  fi
@@ -694,13 +694,13 @@ error_function() {
 }
 
 run_function() {
- if [ -z "$1" ]; then
+ if [[ -z $1 ]]; then
  return 1
  fi
  pkgfunc="$1"
 
  # clear user-specified makeflags if requested
- if [ "$(check_option makeflags)" = "n" ]; then
+ if [[ "$(check_option makeflags)" = "n" ]]; then
  MAKEFLAGS=""
  fi
 
@@ -713,12 +713,12 @@ run_function() {
  local shellopts=$(shopt -p)
 
  local ret=0
- if [ "$LOGGING" -eq 1 ]; then
+ if (( LOGGING )); then
  BUILDLOG="${startdir}/${pkgname}-${pkgver}-${pkgrel}-${CARCH}-$pkgfunc.log"
- if [ -f "$BUILDLOG" ]; then
+ if [[ -f $BUILDLOG ]]; then
  local i=1
  while true; do
- if [ -f "$BUILDLOG.$i" ]; then
+ if [[ -f "$BUILDLOG.$i" ]]; then
  i=$(($i +1))
  else
  break
@@ -752,24 +752,24 @@ run_function() {
 
 run_build() {
  # use distcc if it is requested (check buildenv and PKGBUILD opts)
- if [ "$(check_buildenv distcc)" = "y" -a "$(check_option distcc)" != "n" ]; then
- [ -d /usr/lib/distcc/bin ] && export PATH="/usr/lib/distcc/bin:$PATH"
+ if [[ "$(check_buildenv distcc)" = "y" && "$(check_option distcc)" != "n" ]]; then
+ [[ -d /usr/lib/distcc/bin ]] && export PATH="/usr/lib/distcc/bin:$PATH"
  export DISTCC_HOSTS
- elif [ "$(check_option distcc)" = "n" ]; then
+ elif [[ "$(check_option distcc)" = "n" ]]; then
  # if it is not wanted, clear the makeflags too
  MAKEFLAGS=""
  fi
 
  # use ccache if it is requested (check buildenv and PKGBUILD opts)
- if [ "$(check_buildenv ccache)" = "y" -a "$(check_option ccache)" != "n" ]; then
- [ -d /usr/lib/ccache/bin ] && export PATH="/usr/lib/ccache/bin:$PATH"
+ if [[ "$(check_buildenv ccache)" = "y" && "$(check_option ccache)" != "n" ]]; then
+ [[ -d /usr/lib/ccache/bin ]] && export PATH="/usr/lib/ccache/bin:$PATH"
  fi
 
  run_function "build"
 }
 
 run_package() {
- if [ -z "$1" ]; then
+ if [[ -z $1 ]]; then
  pkgfunc="package"
  else
  pkgfunc="package_$1"
@@ -782,16 +782,16 @@ tidy_install() {
  cd "$pkgdir"
  msg "$(gettext "Tidying install...")"
 
- if [ "$(check_option docs)" = "n" -a -n "${DOC_DIRS[*]}" ]; then
+ if [[ "$(check_option docs)" = "n" && -n "${DOC_DIRS[*]}" ]]; then
  msg2 "$(gettext "Removing doc files...")"
  rm -rf ${DOC_DIRS[@]}
  fi
 
- if [ "$(check_option purge)" = "y" -a -n "${PURGE_TARGETS[*]}" ]; then
+ if [[ "$(check_option purge)" = "y" && -n "${PURGE_TARGETS[*]}" ]]; then
  msg2 "$(gettext "Purging other files...")"
  local pt
  for pt in "${PURGE_TARGETS[@]}"; do
- if [ "${pt}" = "${pt//\/}" ]; then
+ if [[ "${pt}" = "${pt//\/}" ]]; then
  find . -type f -name "${pt}" -exec rm -f -- '{}' \;
  else
  rm -f ${pt}
@@ -799,16 +799,16 @@ tidy_install() {
  done
  fi
 
- if [ "$(check_option zipman)" = "y" -a -n "${MAN_DIRS[*]}" ]; then
+ if [[ "$(check_option zipman)" = "y" && -n "${MAN_DIRS[*]}" ]]; then
  msg2 "$(gettext "Compressing man and info pages...")"
  local manpage ext file link hardlinks hl
  find ${MAN_DIRS[@]} -type f 2>/dev/null |
  while read manpage ; do
  # check file still exists (potentially compressed with hard link)
- if [ -f ${manpage} ]; then
+ if [[ -f ${manpage} ]]; then
  ext="${manpage##*.}"
  file="${manpage##*/}"
- if [ "$ext" != "gz" -a "$ext" != "bz2" ]; then
+ if [[ $ext != gz && $ext != bz2 ]]; then
  # update symlinks to this manpage
  find ${MAN_DIRS[@]} -lname "$file" 2>/dev/null |
  while read link ; do
@@ -834,7 +834,7 @@ tidy_install() {
  done
  fi
 
- if [ "$(check_option strip)" = "y" -a -n "${STRIP_DIRS[*]}" ]; then
+ if [[ $(check_option strip) = y && -n ${STRIP_DIRS[*]} ]]; then
  msg2 "$(gettext "Stripping debugging symbols from binaries and libraries...")"
  local binary
  find ${STRIP_DIRS[@]} -type f 2>/dev/null | while read binary ; do
@@ -851,12 +851,12 @@ tidy_install() {
  done
  fi
 
- if [ "$(check_option libtool)" = "n" ]; then
+ if [[ "$(check_option libtool)" = "n" ]]; then
  msg2 "$(gettext "Removing libtool .la files...")"
  find . ! -type d -name "*.la" -exec rm -f -- '{}' \;
  fi
 
- if [ "$(check_option emptydirs)" = "n" ]; then
+ if [[ "$(check_option emptydirs)" = "n" ]]; then
  msg2 "$(gettext "Removing empty directories...")"
  find . -depth -type d -empty -delete
  fi
@@ -864,7 +864,7 @@ tidy_install() {
 
 write_pkginfo() {
  local builddate=$(date -u "+%s")
- if [ -n "$PACKAGER" ]; then
+ if [[ -n $PACKAGER ]]; then
  local packager="$PACKAGER"
  else
  local packager="Unknown Packager"
@@ -874,12 +874,12 @@ write_pkginfo() {
 
  msg2 "$(gettext "Generating .PKGINFO file...")"
  echo "# Generated by makepkg $myver" >.PKGINFO
- if [ "$INFAKEROOT" -eq 1 ]; then
+ if (( INFAKEROOT )); then
  echo "# using $(fakeroot -v)" >>.PKGINFO
  fi
  echo "# $(LC_ALL=C date -u)" >>.PKGINFO
  echo "pkgname = $1" >>.PKGINFO
- [ "$SPLITPKG" -eq 1 ] && echo "pkgbase = $pkgbase" >>.PKGINFO
+ (( SPLITPKG )) && echo pkgbase = $pkgbase >>.PKGINFO
  echo "pkgver = $pkgver-$pkgrel" >>.PKGINFO
  echo "pkgdesc = $pkgdesc" >>.PKGINFO
  echo "url = $url" >>.PKGINFO
@@ -887,7 +887,7 @@ write_pkginfo() {
  echo "packager = $packager" >>.PKGINFO
  echo "size = $size" >>.PKGINFO
  echo "arch = $PKGARCH" >>.PKGINFO
- if [ "$(check_option force)" = "y" ]; then
+ if [[ "$(check_option force)" = "y" ]]; then
  echo "force = true" >> .PKGINFO
  fi
 
@@ -918,8 +918,8 @@ write_pkginfo() {
  done
  for it in "${packaging_options[@]}"; do
  local ret="$(check_option $it)"
- if [ "$ret" != "?" ]; then
- if [ "$ret" = "y" ]; then
+ if [[ $ret != "?" ]]; then
+ if [[ $ret = y ]]; then
  echo "makepkgopt = $it" >>.PKGINFO
  else
  echo "makepkgopt = !$it" >>.PKGINFO
@@ -929,7 +929,7 @@ write_pkginfo() {
 
  # TODO maybe remove this at some point
  # warn if license array is not present or empty
- if [ -z "$license" ]; then
+ if [[ -z $license ]]; then
  warning "$(gettext "Please add a license line to your %s!")" "$BUILDSCRIPT"
  plain "$(gettext "Example for GPL\'ed software: license=('GPL').")"
  fi
@@ -941,14 +941,14 @@ check_package() {
  # check existence of backup files
  local file
  for file in "${backup[@]}"; do
- if [ ! -f "$file" ]; then
+ if [[ ! -f $file ]]; then
  warning "$(gettext "Invalid backup entry : %s")" "$file"
  fi
  done
 }
 
 create_package() {
- if [ ! -d "$pkgdir" ]; then
+ if [[ ! -d $pkgdir ]]; then
  error "$(gettext "Missing pkg/ directory.")"
  plain "$(gettext "Aborting...")"
  exit 1 # $E_MISSING_PKGDIR
@@ -959,13 +959,13 @@ create_package() {
  cd "$pkgdir"
  msg "$(gettext "Creating package...")"
 
- if [ -z "$1" ]; then
+ if [[ -z $1 ]]; then
  nameofpkg="$pkgname"
  else
  nameofpkg="$1"
  fi
 
- if [ "$arch" = "any" ]; then
+ if [[ $arch = "any" ]]; then
  PKGARCH="any"
  else
  PKGARCH=$CARCH
@@ -976,14 +976,14 @@ create_package() {
  local comp_files=".PKGINFO"
 
  # check for an install script
- if [ -n "$install" ]; then
+ if [[ -n $install ]]; then
  msg2 "$(gettext "Adding install script...")"
  cp "$startdir/$install" .INSTALL
  comp_files="$comp_files .INSTALL"
  fi
 
  # do we have a changelog?
- if [ -n "$changelog" ]; then
+ if [[ -n $changelog ]]; then
  msg2 "$(gettext "Adding package changelog...")"
  cp "$startdir/$changelog" .CHANGELOG
  comp_files="$comp_files .CHANGELOG"
@@ -1009,7 +1009,7 @@ create_package() {
  bsdtar -cf - $comp_files * > "$pkg_file" || ret=$?
  shopt -u nullglob
 
- if [ $ret -eq 0 ]; then
+ if (( ! ret )); then
  case "$PKGEXT" in
  *tar.gz)  gzip -f -n "$pkg_file" ;;
  *tar.bz2) bzip2 -f "$pkg_file" ;;
@@ -1018,7 +1018,7 @@ create_package() {
  ret=$?
  fi
 
- if [ $ret -ne 0 ]; then
+ if (( ret )); then
  error "$(gettext "Failed to create package file.")"
  exit 1 # TODO: error code
  fi
@@ -1042,8 +1042,8 @@ create_srcpackage() {
  msg2 "$(gettext "Adding %s...")" "$BUILDSCRIPT"
  ln -s "${BUILDFILE}" "${srclinks}/${pkgbase}/${BUILDSCRIPT}"
 
- if [ -n "$install" ]; then
- if [ -f $install ]; then
+ if [[ -n $install ]]; then
+ if [[ -f $install ]]; then
  msg2 "$(gettext "Adding install script...")"
  ln -s "${startdir}/$install" "${srclinks}/${pkgbase}/"
  else
@@ -1051,8 +1051,8 @@ create_srcpackage() {
  fi
  fi
 
- if [ -n "$changelog" ]; then
- if [ -f "$changelog" ]; then
+ if [[ -n $changelog ]]; then
+ if [[ -f $changelog ]]; then
  msg2 "$(gettext "Adding package changelog...")"
  ln -s "${startdir}/$changelog" "${srclinks}/${pkgbase}/"
  else
@@ -1063,10 +1063,10 @@ create_srcpackage() {
  local netfile
  for netfile in "${source[@]}"; do
  local file=$(get_filename "$netfile")
- if [ -f "$netfile" ]; then
+ if [[ -f $netfile ]]; then
  msg2 "$(gettext "Adding %s...")" "$netfile"
  ln -s "${startdir}/$netfile" "${srclinks}/${pkgbase}"
- elif [ "$SOURCEONLY" -eq 2 -a -f "$SRCDEST/$file" ]; then
+ elif (( SOURCEONLY == 2 )) && [[ -f "$SRCDEST/$file" ]]; then
  msg2 "$(gettext "Adding %s...")" "$file"
  ln -s "$SRCDEST/$file" "${srclinks}/${pkgbase}/"
  fi