#!/bin/bash
# aur-srcver - update and print package revisions
[[ -v AUR_DEBUG ]] && set -o xtrace
argv0=srcver
PS4='+(${BASH_SOURCE}:${LINENO}): ${FUNCNAME[0]:+${FUNCNAME[0]}(): }'

srcver_pkgbuild_info() {
    # shellcheck disable=SC2016
    env -C "$1" -i bash -c '
        PATH= source PKGBUILD

        if [[ -v epoch ]]; then
            fullver=$epoch:$pkgver-$pkgrel
        else
            fullver=$pkgver-$pkgrel
        fi

        printf %s\\t%s\\n "${pkgbase:-$pkgname}" "$fullver"
    '
}

trap_exit() {
    if [[ ! -v AUR_DEBUG ]]; then
        rm -rf -- "$tmp"
    else
        printf >&2 'AUR_DEBUG: %s: temporary files at %s\n' "$argv0" "$tmp"
    fi
}

usage() {
    printf >&2 'usage: %s [--noprepare] <pkgbase> [<pkgbase> ...]\n' "$argv0"
    exit 1
}

source /usr/share/makepkg/util/parseopts.sh

opt_short=j:
opt_long=('no-prepare' 'jobs:')
opt_hidden=('dump-options' 'noprepare')

if ! parseopts "$opt_short" "${opt_long[@]}" "${opt_hidden[@]}" -- "$@"; then
    usage
fi
set -- "${OPTRET[@]}"

makepkg_args=('--nobuild' '--nodeps' '--skipinteg')
num_procs=$(( "$(nproc)" + 2 ))

while true; do
    case "$1" in
        --noprepare|--no-prepare)
            makepkg_args+=(--noprepare) ;;
        -j|--jobs)
            shift; num_procs=$1 ;;
        --dump-options)
            printf -- '--%s\n' "${opt_long[@]}" ${AUR_DEBUG+"${opt_hidden[@]}"}
            printf -- '%s' "${opt_short}" | sed 's/.:\?/-&\n/g'
            exit ;;
        --)
            shift; break ;;
    esac
    shift
done

if ! (( $# )); then
    usage
fi

# shellcheck disable=SC2174
mkdir -pm 0700 "${TMPDIR:-/tmp}/aurutils-$UID"
tmp=$(mktemp -d --tmpdir "aurutils-$UID/$argv0.XXXXXXXX") || exit
trap 'trap_exit' EXIT

i=0
for n in "$@"; do
    if (( i++ >= num_procs )); then
        wait -n
    fi

    { mkdir -p "$tmp/$n"

      if ! env -C "$n" nice -n 20 makepkg "${makepkg_args[@]}" >"$tmp/$n"/log 2>&1; then
          echo $? >"$tmp/$n"/failed
      fi
    } &
done
wait

failed=()
for n in "$@"; do
    if [[ -e $tmp/$n/failed ]]; then
        failed+=("$n")
    else
        srcver_pkgbuild_info "$n"
    fi
done

for f in "${failed[@]}"; do
    printf >&2 '%s: makepkg %s failed for package %s\n' "$argv0" "${makepkg_args[*]}" "$f"

    cat "$tmp/$f"/log >&2
    printf >&2 '8<----\n'
done

# vim: set et sw=4 sts=4 ft=sh:
