#!/bin/sh

# settings are located in $HOME/.corpus

echo "Using corpus-nightly settings from $HOME/.corpus"
. $HOME/.corpus

RSYNC_PASSWORD=$password 
export RSYNC_PASSWORD

renice 10 -p $$

# use $PERL from env if unset
if [ "x${PERL:-}" = x ] ; then
  PERL=perl
fi

set -x
set -e

# ensure we're running after 0900 UTC; complex due to daylight savings.
# If we're running in the 08xx UTC hour-space, sleep for 1 hour; when
# we wake, we will be in 09xx.
(
  TIME="%e,%U,%S"; TZ=UTC; export TIME TZ
  if date | egrep '^... ... .. 08:'; then
    date; echo "sleeping for 1 hour to compensate for DST"
    sleep 3600 ; date 
  fi
)

# day of week
if date | egrep '^Sat' || [ "$1" = "net" ]; then
	net="net-"
else
	net=""
fi

# enter tree
cd $tree

# find current revision
rm -f weekly-versions.txt nightly-versions.txt
if ! wget --tries=120 --wait=30 \
    http://rsync.spamassassin.org/weekly-versions.txt \
    http://rsync.spamassassin.org/nightly-versions.txt
then
	echo "wget failed" 1>&2
	exit 0
fi

if [ -n "$net" ]; then
	revision=$(tail -1 weekly-versions.txt|awk '{print $2}')
else
	revision=$(tail -1 nightly-versions.txt|awk '{print $2}')
fi

# update
set +e
retry=0
while true; do
        rm -rf rules    # causing trouble for some reason
        rm -rf rulesrc/sandbox

        # argh svn, messiness
        svn cleanup < /dev/null

	if svn update -r $revision < /dev/null && \
            svn update -r $revision rulesrc < /dev/null
        then
		break;
	fi

        # TODO: if that failed, we should be just using
        # a brand new "svn checkout" and forget about the incremental
        # update niceties

        # OFF: this is extremely antisocial when multiple
        # corpus-nightly scripts run simultaneously on one CPU!
	# pkill -TERM svn
	# sleep 10
	# pkill -KILL svn

	if svn update -r $revision < /dev/null && \
            svn update -r $revision rulesrc < /dev/null
        then
		break;
	fi

	if [ $retry -eq 120 ]; then
		echo "svn update failed" 1>&2
		exit 1
	fi
	retry=$(( $retry + 1 ))
	sleep 20
done
set -e

# build
$PERL Makefile.PL < /dev/null
make

# call ext command, if required
if [ "x${pre_mass_check_command:-}" != x ] ; then
  $pre_mass_check_command
fi

# run test
cd masses
rm -f spamassassin/auto*
rm -f spamassassin/bayes*
rm -f razor-agent.log
if [ -n "$net" ]; then
	prefs=$prefs_weekly
	opts=$opts_weekly
else
	prefs=$prefs_nightly
	opts=$opts_nightly
fi
if [ -n "$prefs" -a -f "$prefs" ]; then
	cp $prefs spamassassin/user_prefs
else
	rm -f spamassassin/user_prefs
fi

date | tee test.start

$PERL mass-check $opts

date | tee test.end

uptime
ls -l spam.log ham.log

# results name
mv spam.log spam-$net$username.log
mv ham.log ham-$net$username.log

# rsync
set +e
retry=0
while true; do
	if rsync -Pcvuzb --timeout=120 \
            spam-$net$username.log ham-$net$username.log \
            $username@rsync.spamassassin.org::stable-corpus/
        then
		break;
	fi
	if [ $retry -eq 120 ]; then
		echo "rsync failed" 1>&2
		exit 1
	fi
	retry=$(( $retry + 1 ))
	sleep 30
done
set -e
