#!/bin/sh -e

# usage: $0 /path/to/task

# task:
# description=report/summary
# id=task/id (211123)
# repo=task/repo (p8)
# state=task/state (EPERM|AWAITING|BUILDING|..)
# task/try=22 
# task/iter=1 (22.1)
# task/test-only

# source names to remove: 1col from plan/rm-src

# src to test: 4col from plan/add-src (5col is subtask)
# pkg to test: 5col from plan/add-bin (6col is subtask)

# vars
export PATH=$HOME/bin:$PATH

BRANCH=sisyphus
TASKFS_MOUNT_POINT=/tasks
REPOCOP_WORKDIR=$HOME/.repocop
REPOCOP_ARCH=x86_64

! [ -e $HOME/.config/repocop-tasktest.conf ] || . $HOME/.config/repocop-tasktest.conf

REPOCOP_METADATADIR=$REPOCOP_WORKDIR/metadata
REPOCOP_TASKREPORT_DIR=${REPOCOP_TASKREPORT_DIR:-/var/ftp/pub/repocop/$BRANCH-tasktest/tasks}
if [ -z "$REPOCOP_REPO_DATA" ]; then
    REPOCOP_REPO_DATA=`echo /var/ftp/pub/repocop/$BRANCH-collect/data/repocop-data-current.tar.*`
fi

# in
TASKPATH=`readlink -e $1`
TASKID=`cat $TASKPATH/task/id`
TASKTRY=`cat $TASKPATH/task/try`
REPORTNAME=$TASKID/$TASKTRY

# checks
if [ -z "$REPOCOP_REPO_DATA" ] || ! [ -s $REPOCOP_REPO_DATA ]; then
    echo "Bad REPOCOP_REPO_DATA: $REPOCOP_REPO_DATA"
    exit 1
fi
if [ -z "$REPOCOP_TASKREPORT_DIR" ] || ! [ -d "$REPOCOP_TASKREPORT_DIR" ]; then
    echo "Fatal: REPOCOP_TASKREPORT_DIR not found at $REPOCOP_TASKREPORT_DIR"
    exit 1
fi

# task is asynchronous, can be removed any moment
check_task_still_exists()
{
    [ -e $TASKPATH/task/id ] || exit 0
}

# verbose
# set -x

# unpack repocop database
rm -rf "$REPOCOP_WORKDIR"
case $REPOCOP_REPO_DATA in
    *.gz)
	echo tar -I pigz -x -f $REPOCOP_REPO_DATA -C `dirname "$REPOCOP_WORKDIR"`
	tar -I pigz -x -f $REPOCOP_REPO_DATA -C `dirname "$REPOCOP_WORKDIR"` || exit 1
	;;
    *.xz)
	echo tar -I unxz -x -f $REPOCOP_REPO_DATA -C `dirname "$REPOCOP_WORKDIR"`
	tar -I unxz -x -f $REPOCOP_REPO_DATA -C `dirname "$REPOCOP_WORKDIR"` || exit 1
	;;
    *.zst)
	echo tar -I pzstd -x -f $REPOCOP_REPO_DATA -C `dirname "$REPOCOP_WORKDIR"`
	tar -I pzstd -x -f $REPOCOP_REPO_DATA -C `dirname "$REPOCOP_WORKDIR"` || exit 1
	;;
esac

# task is asynchronous, can be removed any moment
check_task_still_exists

# purge source names to remove
repocop-purge-given --novacuum --repocop-id-by-src-name `awk '{print $1}' "$TASKPATH/plan/rm-src"`

# calculate list of rpm <src to test + pkg to test>
mkdir -p $REPOCOP_METADATADIR/task
awk '{print "'"$TASKPATH/"'" $4}' "$TASKPATH/plan/add-src" > $REPOCOP_METADATADIR/task/srcrpm
awk '{if ($3 == "noarch" || $3 =="'$REPOCOP_ARCH'") print "'"$TASKPATH/"'" $5}' "$TASKPATH/plan/add-bin" > $REPOCOP_METADATADIR/task/binrpm

# task is asynchronous, can be removed any moment
check_task_still_exists

# collect and posttest <src to test + pkg to test>
repocop-run --collect --posttest --distrotest `cat $REPOCOP_METADATADIR/task/???rpm`

# task is asynchronous, can be removed any moment
check_task_still_exists

# create task report dir
rm -rf "$REPOCOP_TASKREPORT_DIR/$REPORTNAME"
mkdir -p $REPOCOP_TASKREPORT_DIR/$REPORTNAME

# task is asynchronous, can be removed any moment
check_task_still_exists

# task info: report task description
TASKINFO="$REPOCOP_TASKREPORT_DIR/$REPORTNAME/task"
mkdir -p "$TASKINFO"
cp "$TASKPATH/task/id" "$TASKINFO"/id
cp "$TASKPATH/task/repo" "$TASKINFO"/repo
cp "$TASKPATH/task/state" "$TASKINFO"/state
cp "$TASKPATH/task/try" "$TASKINFO"/try
cp "$TASKPATH/report/summary" "$TASKINFO"/description
! [ -e "$TASKPATH/task/test-only" ] || touch "$TASKINFO"/test-only

# distrotest diff prepare
if ! [ -e "$REPOCOP_WORKDIR/reports/txt/all_in_one.txt" ]; then
    echo "reports/txt/all_in_one.txt not found, skipping distrotest diff"
else
    sort -u "$REPOCOP_WORKDIR/reports/txt/all_in_one.txt" > $REPOCOP_METADATADIR/task/distrotest.before
    repocop-report-txt --repocop-report-level=info --all-in-one --no-by-srpm --no-by-test --report-include-distrotest
    sort -u "$REPOCOP_WORKDIR/reports/txt/all_in_one.txt" > $REPOCOP_METADATADIR/task/distrotest.after
    rm -f "$REPOCOP_WORKDIR/reports/txt/all_in_one.txt"
    comm -23 $REPOCOP_METADATADIR/task/distrotest.{before,after} > $REPOCOP_METADATADIR/task/distrotest.removed
    comm -13 $REPOCOP_METADATADIR/task/distrotest.{before,after} > $REPOCOP_METADATADIR/task/distrotest.added
fi

# report txt
repocop-report-txt --repocop-report-level=info --no-by-test `cat $REPOCOP_METADATADIR/task/???rpm`
repocop-report-html --repocop-report-level=info --all-in-one --no-by-test `cat $REPOCOP_METADATADIR/task/???rpm`
repocop-report-diff --repocop-report-level=info --no-by-test --no-write-report `cat $REPOCOP_METADATADIR/task/srcrpm`
repocop-report-status --repocop-report-level=info --no-by-test `cat $REPOCOP_METADATADIR/task/???rpm`
mv "$REPOCOP_WORKDIR/reports" $REPOCOP_TASKREPORT_DIR/$REPORTNAME/
repocop-report-stdout `cat $REPOCOP_METADATADIR/task/???rpm` > $REPOCOP_TASKREPORT_DIR/$REPORTNAME/reports/txt/all.txt

# distrotest diff report
mkdir -p $REPOCOP_TASKREPORT_DIR/$REPORTNAME/reports/distrotest.diff
for suffix in removed added; do
    if [ -s $REPOCOP_METADATADIR/task/distrotest.$suffix ]; then
	cp $REPOCOP_METADATADIR/task/distrotest.$suffix $REPOCOP_TASKREPORT_DIR/$REPORTNAME/reports/distrotest.diff/
	touch "$TASKINFO"/distrotest.$suffix
    fi
done

cp $REPOCOP_TASKREPORT_DIR/$REPORTNAME/reports/status/total "$TASKINFO"/status
if stat -t $REPOCOP_TASKREPORT_DIR/$REPORTNAME/reports/diff/* >/dev/null 2>&1; then
    touch "$TASKINFO"/patches
fi
