#!/bin/bash

debug=0

servers="localhost"
quenchdir="geartask.d"
connect=
fileconf="/etc/git-task.conf"
lines="$(sed -n "$=" "$fileconf")"
for((line=1;line<=lines;line++)); do
    str="$(sed "$line"'!d;s/^#.*//;s/[[:space:]]#.*//;s/^[[:space:]]\+//;s/[[:space:]]\+$//;' "$fileconf")"
    [ -z "$str" ] && continue
    case "$str" in
        servers=*) eval "${str}" ;;
        quenchdir=*) eval "${str}" ;;
        name=*) ;;
        mainbranch=*) ;;
        cacherepos=*) ;;
        branch=*) eval ;;
        connect=*) eval "${str}" ;;
        specbranchforce=*) ;;
        \[Suffixes\]*) break ;;
        \[Skiprepo\]*) break ;;
        *) echo "${0##*/}: $fileconf:$line: syntax error or unknown option"; exit 1 ;;
    esac
done

((debug)) && connect=echo

taskrun () {
            task=
            task="$(su -c "eval $connect $command 2>&1" "$USER" | sed '/new[[:space:]]\+task/!d;s/.*#[[:space:]]*//;s/[[:space:]]*:.*//')";
            [ -z "$task" ] && exit 0;
            subst '/task:/d' "$file";
            echo "task: $task" >> "$file";
            echo "$name" >>"$alreadyrunned";
}

tasks="$(mktemp /tmp/git-task-server.XXXXXX)"
alreadyrunned="$(mktemp /tmp/git-task-server.XXXXXX)"
tasksnotreaded=1
find "/home/"*"/$quenchdir" -name "*~" -mtime +7 -delete 2>/dev/null
find "/home/"*"/$quenchdir" 2>/dev/null | sort | sed '/~$/d' | while read file; do
    [ -z "$file" ] && continue
    [ -f "$file" ] || continue
    USER="$(echo "$file" | sed "s|^/home/||;s|/.*||;")"
    [ -z "$USER" ] && USER="root"
    USER="$(getent passwd | grep "/home/$USER" | while read str; do
        if [ "/home/$USER" == "$(echo "$str" | cut -d: -f6)" ]; then echo "$str"; break; fi
    done | cut -d: -f1)"
    export USER
    export HOME=$(getent passwd $USER | cut -d: -f6)
    task="$(sed '/task:/!d;s/.*://;s/^[[:space:]]*//;' "$file")"
    name="$(sed '/name:/!d;s/.*://;s/^[[:space:]]*//;' "$file")"
    time="$(sed '/time:/!d;s/.*://;s/^[[:space:]]*//;' "$file")"
    command="$(sed '/cmd:/!d;s/.*://;s/^[[:space:]]*//;' "$file")"
    if [ -z "$command" ]; then mv -f "$file"{,~}; continue; fi
    if [ -z "$task" ]; then
        if grep -q "$name" "$alreadyrunned"; then
            continue;
        else #if grep -q "$name"
            taskrun
        fi
    else #if [ -z "$task" ]
        if ((tasksnotreaded)); then
            tasksnotreaded=0
            su -c "eval $connect ssh -n git.alt task ls" "$USER" >"$tasks"
            su -c "eval $connect ssh -n git.alt task ls --done" "$USER" >>"$tasks"
            sed -i '/^#[[:digit:]]\+/!d' "$tasks"
            ((debug)) && cat /home/user/work/gitalt-tasker/tasks >"$tasks"
            (( 0 == $(wc -c "$tasks" | sed "s/[[:space:]].*//") )) && exit
        fi
        status="$(sed "/#$task[[:space:]]/"'!d;s/^[[:space:]]*//' "$tasks")"
        status="${status#*[[:space:]]}"
        status="${status%%[[:space:]]*}"
#11119 FAILED sisyphus/kharpost lightsquid-admin.git=1.8.0.1-alt1.17
#11111 NEW sisyphus/ktirf
#11109 DONE sisyphus/ktirf srpm=wop-0.4.3-alt4.src.rpm srpm=wop-data-20051221-alt2.src.rpm
        if [ "FAILED" == "$status" ] || [ "DONE" == "$status" ] || [ "" == "$status" ]; then
            mv -f "$file"{,~};
            if [ "FAILED" == "$status" ]; then
#004-lightsquid-admin-1.8.0.1-alt2.0.M40.1.2009-09-28-09-09-18-287577000
                find "${file%/*}" -name "*-$name-*" | sed '/~$/d' | while read str; do
                    [ -f "$str" ] || continue
                    mv -f "$str"{,~}
                done
            fi
        else
            echo "$name" >>"$alreadyrunned";
        fi
    fi
done
rm -f "$tasks" "$alreadyrunned"
