#!/bin/sh export LC_ALL="C" ## default config PAUSE_SECONDS=$((15*60)) HTML_OUTPUT=0 SEND_MAIL=0 NICE= OWNER= MACHINE=`uname` ## subroutines usage () { echo "Usage: $0 [options]" echo "Options:" echo "-w specify timeout in secs between subsequent pull requests" echo "-i when given: run with ionice -c3, can be combined with -n" echo "-l when given: write html build log" echo "-m when given: mail errors to the committer, general errors to the " echo "-n when given: run with nice, can be combined with -i" echo "-h this help" } getCommitters () { from_date="$1" ./g -s log '--pretty=tformat:%ce' --after="$from_date" | sort | uniq } reportError () { error_kind="$1" shift rough_time="$2" shift to_mail= if test "$SEND_MAIL" -eq 1; then case "$error_kind" in owner) to_mail="$OWNER" message="box broken" ;; *) if test -z "$last_success" ; then # we need at least one successful build to # be reliable to_mail="$OWNER" else to_mail=`getCommitters "$last_success"` fi message="last success: $rough_time" ;; esac fi echo "$*" 1>&2 echo "Last success: $rough_time" 1>&2 if test -n "$to_mail" ; then subject="Tinderbox failure, $message" ( cat <&2 if test "$error_kind" = "owner" ; then exit 1 fi fi } gitHeads () { ./g rev-parse --verify HEAD } ## code while getopts hilm:nw: opt ; do case "$opt" in w) PAUSE_SECONDS="$OPTARG" ;; i) NICE="$NICE ionice -c3" ;; l) HTML_OUTPUT=1 ;; m) SEND_MAIL=1 ; OWNER="$OPTARG" ;; n) NICE="$NICE nice" ;; h) usage; exit ;; ?) usage; exit ;; esac done # sanity checks which git > /dev/null 2>&1 || { echo "You need git for this!" exit 1 } if test "$SEND_MAIL" -eq 1 ; then if test -z "$OWNER" ; then echo "Owner not set." exit 1 fi if test "$OWNER" = `echo ${OWNER} | sed 's/\@/_/g'` ; then echo "The owner address '$OWNER' does not look like an email address." exit 1 fi fi # for build.pl test $HTML_OUTPUT -eq 1 && export BUILD_HTML_OUTPUT=true # main prev_success="" last_success="" while true; do err_msg="" # cleanup $NICE make clean-local # FIXME we need a more exact way to determine a 'good' date; this is not accurate if [ "X$MACHINE" == "XDarwin" ] ; then rough_checkout_date="`date -u '+%Y-%m-%d %H:%M:%S'`" else rough_checkout_date="`date --utc --rfc-3339=seconds`" fi # try to build if ! err_msg=$(./autogen.sh 2>&1); then reportError committer "$rough_checkout_date" `printf "autogen.sh / configure failed - error is:\n\n$err_msg"` elif ! $NICE make clean >clean.log 2>&1 ; then reportError committer "$rough_checkout_date" `printf "cleaning up failed - error is:\n\n"` "$(tail -n100 clean.log)" elif ! $NICE make >build.log 2>&1 ; then reportError committer "$rough_checkout_date" `printf "building failed - error is:\n\n"` "$(tail -n100 build.log)" # elif ! $NICE make smoketest > smoketest.log 2>&1 ; then # reportError committer "$rough_checkout_date" `printf "smoketest failed - error is:\n\n"` "$(tail -n100 smoketest.log)" elif ! $NICE make dev-install >install.log 2>&1 ; then reportError committer "$rough_checkout_date" `printf "dev installation failed - error is:\n\n"` "$(tail -n100 install.log)" else echo "Build done - checkout from $rough_checkout_date successful." gitHeads > build/git-heads.txt prev_success=$last_success last_success=$rough_checkout_date fi for I in clean.log build.log smoketest.log install.log ; do mv $I prev-$I 2>/dev/null done echo updating repo # new commits? while true; do old_head=$(gitHeads) && err_msg="$(./g pull -r 2>&1)" || { reportError owner "$rough_checkout_date" `printf "git repo broken - error is:\n\n$err_msg"` } new_head=$(gitHeads) if test "$old_head" != "$new_head"; then break fi echo "Waiting $PAUSE_SECONDS seconds." sleep $PAUSE_SECONDS done done