#!/bin/bash
# TODO
# * Do version checking
# * Detect circular builds
# * Detect pkgnames by provides, replaces, etc. instead of dir tree


tmp_dir=$(mktemp -d)
queue_file=$(mktemp)
[[ ! -w $queue_file ]] && exit 1

source /etc/makepkg.conf
source /etc/abs.conf
source /etc/libretools.conf

[[ -r ~/.config/libretools/libretools.conf ]] && \
    source ~/.config/libretools/libretools.conf

# Queue Management
# * Always get the queue list from the server
# * Add/Remove from queue
# * Check if a package is listed

# TODO
# * Check for concurrence

# Get the queue list from the server
get_queue() {
    rsync -e ssh -aq $PARABOLAHOST:mips64el/queue $queue_file >/dev/null 2>&1 || {
        echo ":: Failed to retrieve queue list"
        return 1
    }
}

# Put the queue list on the server
put_queue() {
    rsync -e ssh -aq $queue_file $PARABOLAHOST:mips64el/queue >/dev/null 2>&1 || {
        echo ":: Failed to put queue list"
        return 1
    }
}

# Add packages to the queue
update_queue() {
    get_queue || return $?

    basename $PWD | sed "s/$/:$PACKAGER/" >> $queue_file || return 2

    put_queue || return $?
}

# Remove a package from the queue
remove_queue() {
    get_queue || return $?

    grep -vw "^$(basename $PWD)" $queue_file > $queue_file.2
    cat $queue_file.2 > $queue_file

    put_queue || return $?
}

# Checks if a package is listed
check_queue() {
    get_queue || return $?

    packager=$(grep -w "$(basename $PWD)" ${queue_file} | cut -d ':' -f2)

    [[ ! -z $packager ]] && [[ "$packager" != "$PACKAGER" ]] && {
        echo ":: $(basename $PWD) is being packaged by $packager. Please wait."
        return 1
    }

    return 0
}


# TODO keep track of spawned fullpkgs
quit() {
    remove_queue

    exit 1
}

source PKGBUILD
echo ":: Building ${pkgbase} ${pkgname[@]}"

trap "quit" SIGTERM SIGKILL

check_queue || exit 1

failed=()
missing=()

# Gets the dependency list from the package_* functions
#pkgdeps=($(cat PKGBUILD | \
#  tr -d "\n" | \
#  sed -n "s/depends=(\([^)]\+\))/\n::\1\n/pg" | \
#  grep --color=never "^::" | \
#  tr -d [:\'\"] | \
#  tr " " "\n" | \
#  sort -u))

# Clean version checking
deps=$(echo "${depends[@]} ${makedepends[@]} ${pkgdeps[@]}" | \
    sed "s/[=<>]\+[^ ]\+//g" | \
    tr ' ' "\n" | \
    sort -u)

echo $_deps

sudo pacman -Sy

for _dep in ${deps[@]}; do
    is_built $_dep && continue

    for _repo in ${REPOS[@]}; do
        # TODO find split packages
        [[ -e "$ABSROOT/${_repo}/$_dep/PKGBUILD" ]] && {
            cp -r "$ABSROOT/$_repo/$_dep" $tmp_dir/ || {
                echo "Can't copy $_dep to the work dir."
                exit 1
            }

            # Enter the work dir and run this command in it
            pushd $tmp_dir/$_dep >/dev/null
            $0

            [[ $? -ne 0 ]] && {
                failed=(${failed[@]} $_dep)
            }

            popd >/dev/null

            break
#        } || {
# The package can't be found
# This can happen if:
# * The package is built inside a split package
# * The package is provided by some other package (ie by *-libre packages)
#              echo "==> Missing package $_dep"
#              missing=(${missing[@]} $_dep)
        }
    done
done

# TODO probably not elegant enough
#[[ ${#failed[@]} -gt 0 ]] || [[ ${#missing[@]} -gt 0 ]] && {
  [[ ${#failed[@]} -gt 0 ]] && {
      echo ":: This packages failed to build: ${failed[@]}"
      exit 1
  }

# [[ ${#missing[@]} -gt 0 ]] && {
#     echo ":: This packages are missing: ${missing[@]}"
# }

# exit 1
#}

# Let everybody know we're building this
update_queue || {
    echo ":: Couldn't update the queue, let your partners know about this."
}

cp -r ../$(basename $PWD) $tmp_dir/
pushd $tmp_dir/$(basename $PWD) >/dev/null

sudo pacman -Sy
makepkg --noconfirm -sLcr ; r=$?
case $r in
    0)
        echo "==> The build was succesful."
        mipsrelease *.pkg.tar.*
        ;;
    1)
        echo "==> The build failed."
        ;;
    2)
        echo "==> The build failed."
        ;;
esac

# Remove from queue
remove_queue

exit $r