#!/bin/bash

# Download AUR packages from the experimental AUR github repo
# and store them under the current folder.

echo2() { echo -e "$@" >&2 ; }
DIE()   { echo2 "$progname: error: $1"; Usage; exit 1; }
WARN()  { echo2 "    -> $progname: warning: $1"; }
Usage() { echo2 "Usage: $progname names-of-AUR-packages"; }
Verbose() { [ $verbose = yes ] && echo2 "$@" ; }

FromRepo() { local -r url="$1"; grep "url = $url" "$pkg_name/.git/config" &> /dev/null; }

Default() {
    local -r var="$1"
    local -r val="$2"
    [ "$var" = "$val" ] && echo " (default)"
}

Main() {
    local -r progname=${0##*/}
    local -r verbose_def=no
    local verbose=$verbose_def
    local pkg_names=()

    [ -w "$PWD" ] || DIE "cannot write to $PWD"

    # Handle options and save package names
    while true ; do
        case "$1" in
            # handle options
            -h | --help)
                cat <<EOF >&2
Usage:   $progname [options] <aur-package-names>
Options: -h, --help         This help.
         -v, --verbose      Provide some progress output$(Default $verbose_def yes).
         -q, --quiet        No progress output$(          Default $verbose_def no).
EOF
                exit 0
                ;;
            -v | --verbose) verbose=yes ;;
            -q | --quiet)   verbose=no ;;
            -*) ;;                            # ignore unknown options

            "") break ;;                      # stop loop
            *) pkg_names+=("$1") ;;           # save pkg names
        esac
        shift
    done

    if [ "$pkg_names" ] ; then
        local -r REPOURL=https://github.com/archlinux/aur.git
        local -r AURURL=https://aur.archlinux.org
        local pkg_name
        for pkg_name in "${pkg_names[@]}" ; do
            echo -n "    $pkg_name:|"
            if [ -e "$pkg_name" ] ; then
                if FromRepo "$REPOURL" ; then
                    echo -n "(git pull)|"
                    pushd "./$pkg_name" >/dev/null
                    git pull
                    popd >/dev/null
                    continue
                elif FromRepo "$AURURL/$pkg_name\.git" ; then
                    rm -rf "$pkg_name"           # $pkg_name was fetched by yay/paru, replace it
                else
                    WARN "$pkg_name file exists, skipping $pkg_name"
                    continue
                fi
            fi
            echo "(git clone)|"
            timeout 20 git clone --branch "$pkg_name" --single-branch $REPOURL "$pkg_name" &>/dev/null \
                || { WARN "fetching $pkg_name failed"; sleep 1; }
        done | column -t -s'|'
    else
        DIE "no AUR package name given"
    fi
}

Main "$@"
