#!/usr/bin/bash
#
#  Update package state file
#

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


function triage()
# triage <pkg>: Determine state for given pckage.
{
    local pkg=$1
    local pkgdir="$PKG_DATA_DIR/$pkg"
    local spec=$pkgdir/$pkg.spec
    local name version curr_version
    while read name version; do
        curr_version=$( rpm -q --qf "%{VERSION}-%{RELEASE}\n" $name ) \
            || curr_version='undef'
        [ "$(get_state $pkg)" = 'removing' ] && curr_version='undef'
        if [ "$curr_version" != "$version" ]; then
           if [ -n "$( find $(get_eula_dir $pkg) -type f)" ]; then
               $scriptdir/lpf-pkgbuild 'set-state' $pkg 'approve-wait'
           else
               $scriptdir/lpf-pkgbuild 'set-state' $pkg 'build-wait'
           fi
           return
        else
           $scriptdir/lpf-pkgbuild 'set-state' $pkg 'OK'
        fi
    done < <(rpm --specfile $spec -q --qf "%{NAME} %{VERSION}-%{RELEASE}\n")
}


function check_OK
# check_OK <pkg>: Re-evaluate if given package still is in state 'OK'.
{
    local pkg=$1
    local lpf_vers=$( get_pkg_version $pkg )
    local current_vers
    current_vers=$(rpm -q --qf "%{VERSION}-%{RELEASE}\n" $pkg) \
        || current_vers='undef'
    if [ $current_vers != "$lpf_vers" ]; then
       if [ -n "$( find $(get_eula_dir $pkg) -type f)" ]; then
           $scriptdir/lpf-pkgbuild 'set-state' $pkg 'approve-wait'
       else
           $scriptdir/lpf-pkgbuild 'set-state' $pkg 'build-wait'
       fi
    fi
}


function check_install
# check_install <pkg>: re-evaluate if package still is in state 'install'.
{
    local pkg=$1
    local resultdir=$( get_resultdir $pkg )
    [[ -d $resultdir && "$(ls $resultdir | wc -l)" != "0" ]] || {
        $scriptdir/lpf-pkgbuild 'set-state' $pkg 'untriaged'
        triage $pkg
    }
    local lpf_vers=$( get_pkg_version $pkg )
    local current_vers
    current_vers=$(rpm -q --qf "%{VERSION}-%{RELEASE}\n" $pkg) \
        || current_vers='undef'
    [ "$current_vers" = "$lpf_vers" ] && \
        $scriptdir/lpf-pkgbuild 'set-state' $pkg 'OK'
}


function update_state()
# update_state <pkg>: Re-evaluate state for given package.
{
    local pkg="$1"
    local approve_file=$( get_approve_file $pkg )
    state=$( get_state $pkg )
    case $state in
        OK) check_OK $pkg
            ;;
        install-wait)
            check_install $pkg
            ;;
        failed|build-wait)
            ;;
        approve-wait)
            if [ -e $approve_file ]; then
                $scriptdir/lpf-pkgbuild 'set-state' $pkg 'build-wait'
                rm $approve_file
            fi
            ;;
        untriaged|removing)
            triage $pkg
            ;;
    esac
}


cd /tmp
pkgdirs=( $(get_arg_pkgdirs) )
for pkgdir in ${pkgdirs[@]}; do
    update_state ${pkgdir##*/}
done


# vim: set expandtab ts=4 sw=4:
