#!/usr/bin/bash
#
# State-changing operations, needs to be run as pkg-build user.
#

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

readonly rpm_srcdir=$( rpm --eval %_sourcedir )
readonly rpm_rpmdir=$( rpm --eval %_rpmdir )


function set_state()
# Given package and state, set new state. Possibly create notification
# or remove it depending on new state.
{
    [ -e $LPF_VAR/packages/$1 ] || mkdir -p  $LPF_VAR/packages/$1
    local statefile=$(  _get_statefile $1 )
    echo "$2" >$statefile
    case "$2" in
       'OK'|'removing'|'untriaged')
            $scriptdir/lpf-notify remove "$1"
            ;;
        *)  $scriptdir/lpf-notify create "$1" "$2"
            ;;
    esac
}


function copy_results()
# Copy built rpms to resultdir.
{
    local pkg="$1"
    local resultdir="$( get_resultdir $pkg )"
    [ -d "$resultdir" ] || mkdir $resultdir
    find $rpm_rpmdir -name \*.rpm -exec cp {} $resultdir \;
}


function build_pkg()
# Given pkg, build it.
{
    local pkg="$1"
    local spec=$( get_spec $pkg )
    local buildlog=$( get_logfile $pkg )
    local pkgdir=$( get_pkg_datadir $pkg )
    rm -rf $rpm_rpmdir/* &> /dev/null
    rm -rf $rpm_srcdir/* &> /dev/null
    [ -w "$rpm_srcdir" ] || rpmdev-setuptree

    exec 5<&1 6<&2  # Preserve  stdout/stderr.
    exec &>> $buildlog
    source $scriptdir/../CONFIG
    [ -f $pkgdir/CONFIG ] && source $pkgdir/CONFIG
    cd $rpm_srcdir
    cp $( get_pkg_srcdir $pkg )/* $PWD &>/dev/null || :
    echo "$pkg: downloading sources" >&5 && spectool -g $spec &&
       echo "$pkg: building" >&5 &&
           rpmbuild ${rpmbuild_opts:-'-bb'} $spec && \
           echo "$pkg: storing results" >&5 &&
       copy_results $pkg && state='install-wait' || state='failed'
       if [ $state = 'install-wait' ]; then
           echo "$pkg: build completed" >&5
       else
           echo "$pkg: build failed" >&5
       fi
       set_state $pkg $state
}


function build()
# Build all packages in $@
{
    for pkg in "$@"; do build_pkg $pkg; done
}


function create_approve_file()
# Create the approve file, marks package as approved.
{
    local approve_file=$( get_approve_file $1 )
    touch $approve_file
}


function reset()
# Reset state to pristine, installed package.
{
    local pkg="$1"
    local resultdir=$( get_resultdir $pkg )
    rm -rf $resultdir &>/dev/null || :
    local notifydir=$( get_notifydir $pkg )
    rm -rf $notifydir &>/dev/null || :
    local appprove_file=$( get_approve_file $pkg )
    rm -f $approve_file
    local logfile=$( get_logfile $pkg )
    rm -f $logfile
    set_state $pkg 'untriaged' >/dev/null
}


function clear_results()
# Remove all built rpms for package.
{
    local pkg="$1"
    local resultdir=$( get_resultdir $pkg )
    rm -rf $resultdir &>/dev/null || :
}


if [[ ! $( id -un ) = "$LPF_USER" && "$UID" -ne '0' ]]; then
    exec $SUDO -u pkg-build $scriptdir/lpf-pkgbuild "$@"
fi

umask 002

cmd="$1"; shift
case "$cmd" in
    'build')
         build "$@"
         ;;
    'set-state')
         set_state "$@"
         ;;
    'clear-results')
         clear_results "$@"
         ;;
    'reset')
         reset "$@"
         ;;
    'create-approve-file')
         create_approve_file "$@"
         ;;
    'scan')
         $scriptdir/lpf-scan "$@"
         ;;
    *)   echo 'What!?' >&2
         exit 1
         ;;
esac


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