#!/bin/bash
#
# lpf Local Package Building Service wrapper script
#

scriptdir=$( dirname $(readlink -fn $0))
source $scriptdir/lpf-defs.bash


function usage()
{
    cat << EOF
Usage: lpf <command> [args]

commands:
    list 	List all packages.
    update [package]
                Interactive approve, build and install of given package or
                all packages.
    state [package]
                List package state or state of all packages.
    scan [package]
                Triage a given package or all packages  and
                update their status.
    approve <package>
                Approve a package in state approve-wait.
    build [package]
                Build given package or all packages in state
                build-wait
    rebuild <package>
                Force re-install of a package where previous installation
                failed.
    install [package]
                Install rpms for given package or all packages in state
                install-wait
    log [package]
                Display logs from last build for package, or just
                last build.
    scan-removal <package>
                Triage package with the assumption that existing
                target package is removed (use in spec scriptlets).
EOF
}


function check_pkg_arg()
# check_pkg_arg <pkg>: Check a mandatory package arg, exit on errors.
{
    if [ -z "$1" ]; then
        usage
        exit 1
    fi
    if [ ! -e "$PKG_DATA_DIR/$1" ]; then
        echo "No such package: \"$1\""
        exit 2
    fi
}


function list_packages()
{
    if [ -n "$1" ]; then
       usage
       exit 1
    else
       for pkgdir in $(get_pkgdirs); do
           echo ${pkgdir##*/}
       done
    fi
}


function list_states_cmd()
{
    [ -z "$1" ] || { usage; exit 1; }
    list_states "$@"
}


function build_packages_cmd()
{
    [ -n "$1" ] && check_pkg_arg "$@"
    build_packages "$@"
}


function rebuild_package()
{
    check_pkg_arg "$@"
    local pkg=$1

    case $( get_state $pkg ) in
        'failed')  set_state $pkg 'build-wait'
                   build_packages $pkg
                   ;;
        'not-approved')
                  set_state $pkg 'approve-wait'
                  lpf-approve $pkg && build_packages $pkg
                  ;;
        *)        error "Rebuild error" "Illegal state (aborting)" >&2
                  ;;
    esac
}


function scan_packages_cmd()
{
    [ -n "$1" ] && check_pkg_arg "$@"
    scan_packages "$@"
}


function scan_removal_cmd()
{
    check_pkg_arg "$@"
    set_state $1 'removing'
    scan_packages_cmd "$1"
}


function approve_package_cmd()
{
    check_pkg_arg "$@"
    approve_package "$@"
}


function install_rpms_cmd()
{
    check_pkg_arg "$@"
    install_rpms "$@"
}


function update_packages()
{
    [ -n "$1" ] && check_pkg_arg "$@"
    export LPF_UPDATE=1
    if [ -n "$DISPLAY" ]; then
        $scriptdir/lpf-update "$@" | "$scriptdir/update.py"
    else
        $scriptdir/lpf-update "$@"
    fi
}


if [ -z "$1" -o "$1" = '-h' ]; then
    usage
    exit 1
fi

id -Gn | grep -q $LPF_GROUP  || {
    if [ "$EUID" != "0" ]; then
        error "Missing group" \
           "You must be member of $LPF_GROUP group to run lpf"
        exit 2
    fi
}

[ -z "$LPF_CONSOLE" ] && export LPF_CONSOLE=/dev/$( ps -p$$ -o tty="" )

if [ "$( id -gn )" !=  "$LPF_GROUP" ]; then
    echo "$0 $*" | newgrp "$LPF_GROUP"
    exit $?
fi

[ -n "$DISPLAY" ] && xhost local:$LPF_USER >/dev/null

trap "do_trap 81" SIGINT ERR

# http://forums.gentoo.org/viewtopic-t-947211-start-0.html
export NO_AT_BRIDGE=0

export SUDO_ASKPASS=$scriptdir/sudo_askpass

command=$1
shift
case $command in
    set-state)
            set_state $1 $2
            ;;
    list)   list_packages "$@"
            ;;
    state)  list_states_cmd "$@"
            ;;
    build)  build_packages_cmd "$@"
            do_trap 0
            ;;
    rebuild)
            rebuild_package "$@"
            do_trap 0
            ;;
    scan)   scan_packages_cmd "$@"
            ;;
    approve)
            approve_package_cmd "$@"
            do_trap 0
            ;;
    update) update_packages "$@"
            ;;
    install)
            install_rpms_cmd "$@"
            do_trap 0
            ;;
    log)
            show_buildlog "$@"
            do_trap 0
            ;;
    scan-removal)
            scan_removal_cmd "$@"
            ;;
    *)      usage
            exit 1
esac
