#!/bin/sh

#HOME=/home/repocop
export PATH=$HOME/bin:$PATH

ARCHDIFFHACK=/usr/share/repocop/pkgtests/unmet-dependency-build-missing-package/_archdiff
REPOCOP_CACHEDIR=$HOME/.repocop
ARCHDIFFDIR=$REPOCOP_CACHEDIR/testcache/_archdiff
BRANCH=sisyphus
DISTROMAP_REPOSITORY=altlinux



PROG="${0##*/}"
quiet=

DO_rsync=
DO_archdiff=yes
DO_beehive=
DO_collect=yes
DO_posttest=yes
DO_report=yes
DO_diff=yes
DO_cybertalk=
DO_prometheus=
DO_distrodb=yes
DO_archive=yes
DO_altnode=yes

# import beehive logs on Tuesdays
# [ `date +%u` = 2 ] && DO_beehive= 

REPOCOP_RUN_COLLECT_OPTS=
REPOCOP_RUN_POSTTEST_OPTS=
REPOCOP_REPORT_PROMETHEUS_OPTS=
REPOCOP_REPORT_ACL_OPTS=

[ -e $REPOCOP_CACHEDIR/daily.conf ] && . $REPOCOP_CACHEDIR/daily.conf

REPODIR=${REPODIR:-~/Sisyphus}
ALLRPMS=${ALLRPMS:-$REPODIR/files/noarch/RPMS $REPODIR/files/x86_64/RPMS $REPODIR/files/SRPMS}
SRPMS=${SRPMS:-$REPODIR/files/SRPMS}
FTPDIR=${FTPDIR:-/var/ftp}
ALTNODE_DIR=${ALTNODE_DIR:-$FTPDIR/altnode/`whoami`}
PUBDIR=${PUBDIR:-$FTPDIR/pub/repocop}
PUB_PROMETHEUS1_DIR=${PUB_PROMETHEUS1_DIR:-$PUBDIR/prometeus}
PUB_PROMETHEUS2_DIR=${PUB_PROMETHEUS2_DIR:-$PUBDIR/prometheus2}

Unlink_Except()
{
    local kept_file="$1"
    shift;
    for i in "$@"; do
	[ "$kept_file" != "$i" ] && ! [ -L "$i" ] && rm -f -- "$i"
    done
}

Message()
{
	[ -z "$quiet" ] || return 0
	printf %s\\n "$*"
}

Fatal()
{
	printf %s\\n "$PROG: $*" >&2
	exit 1
}

do_rsync()
{
    Message "rsync (nothing to do)..."
}

do_archdiff()
{
    if [ -x $ARCHDIFFHACK ]; then
	Message "running _archdiff hack..."
	$ARCHDIFFHACK "$ARCHDIFFDIR" $REPODIR || exit 3
	cp "$ARCHDIFFDIR"/i586.only "$ARCHDIFFDIR"/missing
    fi
}

do_beehive()
{
    cmd=/usr/bin/repocop-process-build-logs
    if [ -x $cmd ]; then
	if [ -x ~/bin/repocop-rsync-build-logs ]; then
	    Message "run (beehive log collect)..."
	    repocop-rsync-beehive-logs || exit 3
	fi
	Message "run (beehive log process)..."
	$cmd || exit 3
    else
	Message "skip (beehive) - no "
    fi
}

do_collect()
{
    Message "run (collect)..."
    # if repocop-run exited abnormally it should just stop
    repocop-run --no-posttest $REPOCOP_RUN_COLLECT_OPTS $ALLRPMS || exit 2
    vacuum_opt=--novacuum
    [ `date +%u` = 3 ] && vacuum_opt=--vacuum
    repocop-purge-except -l $vacuum_opt
}


do_posttest()
{
    Message "run (posttest)..."
    # if repocop-run exited abnormally it should just stop
    repocop-run --no-collect --posttest --distrotest $REPOCOP_RUN_POSTTEST_OPTS || exit 2
}

do_diff()
{
    cmd=/usr/bin/repocop-fix-srpm
    if [ -x $cmd ]; then
	Message "diff..."
	# SLOWER
	#repocop-fix-srpm --write-report --diff $REPOCOP_REPORT_ACL_OPTS $SRPMS
	# FASTER
	$cmd --write-report --diff $REPOCOP_REPORT_ACL_OPTS $REPOCOP_CACHEDIR/testcache/specfile
	# tmp hack to fix in repocop-fix-srpm
	find $REPOCOP_CACHEDIR/reports/diff/by-srpm/ -type f -size 0 -delete
    fi
}

do_report()
{
    Message "report (txt)..."
    repocop-report-txt --report experimental $REPOCOP_REPORT_ACL_OPTS
    cmd=/usr/bin/repocop-report-html
    if [ -x $cmd ]; then
	Message "report (html)..."
	$cmd --report experimental $REPOCOP_REPORT_ACL_OPTS $REPOCOP_REPORT_HTML_OPTS
    fi
    rsync -a --delete-after $REPOCOP_CACHEDIR/reports $PUBDIR/
}

do_cybertalk()
{
    cmd=/usr/bin/repocop-report-email
    if [ -x $cmd ] && [ -n "$REPOCOP_CYBERTALK_EMAIL" ]; then
	Message "cybertalk..."
	$cmd "$REPOCOP_CYBERTALK_EMAIL"
    fi
}

# ----- prometheus -----------
do_prometheus()
{
    cmd=/usr/bin/repocop-report-prometheus-dump
    if [ -x $cmd ]; then
	Message "prometheus..."
	mkdir -p $PUB_PROMETHEUS1_DIR
	$cmd > $PUB_PROMETHEUS1_DIR/repocop-prometeus.sql
	rm -f $PUB_PROMETHEUS1_DIR/repocop-prometeus.sql.gz
	gzip -9 $PUB_PROMETHEUS1_DIR/repocop-prometeus.sql
	stat $PUB_PROMETHEUS1_DIR/repocop-prometeus.sql.gz --format %y > $PUB_PROMETHEUS1_DIR/timestamp
    fi
    cmd=/usr/bin/repocop-report-prometheus2
    if [ -x $cmd ]; then
	Message "prometheus2 (text sql)..."
	CURDATA=`date '+%Y%m%d'`
	mkdir -p $PUB_PROMETHEUS2_DIR
	rm -f $PUB_PROMETHEUS2_DIR/prometheus2*.sql
	$cmd --branch $BRANCH > $PUB_PROMETHEUS2_DIR/prometheus2-$CURDATA.sql
	ln -sf $PUB_PROMETHEUS2_DIR/prometheus2-$CURDATA.sql $PUB_PROMETHEUS2_DIR/prometheus2.sql
	rm -f $PUB_PROMETHEUS2_DIR/prometheus2-patches-*.sql
	cmd=/usr/bin/repocop-report-prometheus2-patches
	$cmd --branch $BRANCH > $PUB_PROMETHEUS2_DIR/prometheus2-patches-$CURDATA.sql
	ln -sf $PUB_PROMETHEUS2_DIR/prometheus2-patches-$CURDATA.sql $PUB_PROMETHEUS2_DIR/prometheus2-patches.sql
    fi
    cmd=/usr/bin/repocop-report-prometheus2-sqlite
    if [ -x $cmd ]; then
	Message "prometheus2 (sqlite)..."
	CURDATA=`date '+%Y%m%d'`
	mkdir -p $PUB_PROMETHEUS2_DIR
	rm -f $PUB_PROMETHEUS2_DIR/prometheus2-$CURDATA.sqlite.bz2
	$cmd --branch $BRANCH ${DISTROMAP_COMPONENT:+--component "$DISTROMAP_COMPONENT"} --out $PUB_PROMETHEUS2_DIR/prometheus2-$CURDATA.sqlite
	bzip2 $PUB_PROMETHEUS2_DIR/prometheus2-$CURDATA.sqlite
	ln -sf $PUB_PROMETHEUS2_DIR/prometheus2-$CURDATA.sqlite.bz2 $PUB_PROMETHEUS2_DIR/prometheus2.sqlite.bz2
	Unlink_Except $PUB_PROMETHEUS2_DIR/prometheus2-$CURDATA.sqlite.bz2 $PUB_PROMETHEUS2_DIR/prometheus2-*.sqlite.bz2
    fi
}
# ---- end prometheus ----

Pack_and_Rotate()
{
    local destdir=$1
    local fileprefix=$2
    shift;shift;
    mkdir -p $destdir/
    local CURDATA=`date '+%Y%m%d'`
    rm -rf $destdir/$fileprefix-$CURDATA.tar.gz
    tar czf $destdir/$fileprefix-$CURDATA.tar.gz "$@"
    ln -sf $fileprefix-$CURDATA.tar.gz $destdir/$fileprefix-current.tar.gz
    Unlink_Except $destdir/$fileprefix-$CURDATA.tar.gz $destdir/$fileprefix*
}

do_distrodb()
{
    cmd=/usr/bin/repocop-report-distrodb
    if [ -x $cmd ]; then
	Message "distrodb..."
	$cmd --branch $BRANCH ${DISTROMAP_COMPONENT:+--component "$DISTROMAP_COMPONENT"}
	distrodb_main_file=repocop-distrodb-$BRANCH
	distrodb_extra_file=repocop-distrodb-extra-$BRANCH
	[ -n "$DISTROMAP_COMPONENT" ] && distrodb_main_file="$distrodb_main_file-$DISTROMAP_COMPONENT"
	Pack_and_Rotate $PUBDIR/data $distrodb_extra_file  -C ~  .cache/distrodb/$DISTROMAP_REPOSITORY/$BRANCH/unique_data
	Pack_and_Rotate $PUBDIR/data $distrodb_main_file  -C ~ --exclude '*/unique_data*' .cache/distrodb/$DISTROMAP_REPOSITORY/$BRANCH
    fi
}

do_archive()
{
    Message "archive..."
    Pack_and_Rotate $PUBDIR/data repocop-report  -C ~ .repocop/reports/diff .repocop/reports/txt
    Pack_and_Rotate $PUBDIR/data repocop-data  -C ~ .repocop/testcache .repocop/db .repocop/testdb
    [ -d $REPOCOP_CACHEDIR/testcache/watch ] && Pack_and_Rotate $PUBDIR/data repocop-watchfiles  -C $REPOCOP_CACHEDIR/testcache watch
    [ -d $REPOCOP_CACHEDIR/testcache/specfile ] && Pack_and_Rotate $PUBDIR/data repocop-specfiles -C $REPOCOP_CACHEDIR/testcache specfile

    ln -f .repocop/db/freedesktop-desktop.db $PUBDIR/data/
}

_altnode_stamp_common()
{
    echo repocop > $ALTNODE_DIR/type
    echo $BRANCH > $ALTNODE_DIR/platform
    echo ${DISTROMAP_COMPONENT:+$DISTROMAP_COMPONENT/}$BRANCH > $ALTNODE_DIR/repository
    echo ${PUBDIR##$FTPDIR/}/reports > $ALTNODE_DIR/relative_path
    date +'%F %T %Z' > $ALTNODE_DIR/datastring
}

do_altnode()
{
    Message "altnode..."
    _altnode_stamp_common
    repocop-report-total-messages > $ALTNODE_DIR/repocop_summary
    echo ok > $ALTNODE_DIR/status
}

while [ "$#" -ge 1 ]; do
	case "$1" in
		-q|--quiet) quiet=-q
			;;
		-v|--verbose) quiet=
			;;
		-h|--help) show_help
			;;
		--) shift; break
			;;
		--no-[a-z]*)
			arg="NO_${1##--no-}"
			eval $arg=1
			;;
		--[a-z]*)
			arg="DO_${1##--}"
			eval $arg=1
			;;
		*) Fatal "unrecognized option: $1"
			;;
	esac
	shift
done

if ! repocop-cachedir-lock --lock $$ ; then
	echo -n "can't lock the workdir. "
	repocop-cachedir-lock $$
	_altnode_stamp_common
	echo fail > $ALTNODE_DIR/status
	exit 1
fi

# Failsafe tmp cleanup
me=`whoami`
[ -d /tmp/.private/$me ] && for i in /tmp/.private/$me/*; do rm -rf $i; done

[ -n "$DO_rsync" ] && [ -z "$NO_rsync" ] && do_rsync
[ -n "$DO_archdiff" ] && [ -z "$NO_archdiff" ] && do_archdiff
[ -n "$DO_beehive" ] && [ -z "$NO_beehive" ] && do_beehive
[ -n "$DO_collect" ] && [ -z "$NO_collect" ] && do_collect
[ -n "$DO_posttest" ] && [ -z "$NO_posttest" ] && do_posttest
[ -n "$DO_diff" ] && [ -z "$NO_diff" ] && do_diff
[ -n "$DO_report" ] && [ -z "$NO_report" ] && do_report
[ -n "$DO_cybertalk" ] && [ -z "$NO_cybertalk" ] && do_cybertalk
[ -n "$DO_prometheus" ] && [ -z "$NO_prometheus" ] && do_prometheus
[ -n "$DO_distrodb" ] && [ -z "$NO_distrodb" ] && do_distrodb
[ -n "$DO_archive" ] && [ -z "$NO_archive" ] && do_archive
[ -n "$DO_altnode" ] && [ -z "$NO_altnode" ] && do_altnode

repocop-cachedir-lock --unlock $$
exit 0
