#!/bin/sh
set -x
date
uname -a
#
# This script should be run nightly from cron.  It checks out hdf5
# from the CVS source tree and compares it against the previous
# snapshot.  If anything significant changed then a new snapshot is
# created, the minor version number is incremented, and the change is
# checked back into the CVS repository.
#

# The path isn't properly initialized on hawkwind -- /usr/local/bin is
# either missing or is after /usr/bin when it should be before.
PATH="/usr/local/bin:$PATH"

# Where are the snapshots stored?
ARCHIVES_default=/afs/ncsa/ftp/HDF/pub/outgoing/hdf5/snapshots
ARCHIVES=$ARCHIVES_default

# Where are the HDF4 library?
# At NCSA, the standard place to find HDF4 software is in /usr/ncsa/.
HDF4LIB_default="/usr/ncsa/include,/usr/ncsa/lib"
HDF4LIB=$HDF4LIB_default

# What compression methods to use?
METHODS="gzip bzip2"

# Make sure cvs would work
if [ -z "$CVSROOT" ]; then
    echo "Where is the CVS repository?" 1>&2
    exit 1
fi

#
# Command options
cmd="all"
errcode=0
echo '$#=' $# '$*="' $* '"'
while [ $# -gt 0 ] ; do
    case "$1" in
	all)	
	    cmd="all"
	    ;;
	checkout)
	    cmdcheckout="checkout"
	    cmd=""
	    ;;
	test)
	    cmdtest="test"
	    cmd=""
	    ;;
	release)
	    cmdrel="release"
	    cmd=""
	    ;;
	help)
	    cmd="help"
	    break
	    ;;
	hdf4)
	    shift
	    if [ $# -lt 1 ]; then
		echo "HDF4LIB information missing"
		errcode=1
		cmd="help"
		break
	    fi
	    HDF4LIB="$1"
	    ;;
	archive)
	    shift
	    if [ $# -lt 1 ]; then
		echo "Archive pathname missing"
		errcode=1
		cmd="help"
		break
	    fi
	    ARCHIVES="$1"
	    ;;
	*)
	    echo "Unkown option $1"
	    errcode=1
	    cmd="help"
	    break
	    ;;
    esac
    shift
done

if [ "$cmd" = help ]; then
    set -
    echo "Usage: $0 [all] [checkout] [test] [release] [help] [hdf4 <hdf4lib_path>] [archive <arch_path> ]"
    echo "    all:      Run all commands (checkout, test & release)"
    echo "              [Default is all]"
    echo "    checkout: Run cvs checkout"
    echo "    test:     Run test"
    echo "    release:  Run release"
    echo "    help:     Print this message"
    echo "    hdf4 <hdf4lib_path>:"
    echo "              Use <hdf4lib_path> as the HDF4LIB locations"
    echo "              [Default is $HDF4LIB_default]"
    echo "    archive <arch_path>: "
    echo "              Use <arch_path> as the release ARCHIVE area"
    echo "              [<arch_path> default as $ARCHIVES_default]"
    exit $errcode
fi

# Setup the proper configure option (--with-hdf4) to use hdf4 library
# provide HDF4LIB is non-empty.
HDF4LIB=${HDF4LIB:+"--with-hdf4="$HDF4LIB}
CONFIGURE="./configure $HDF4LIB"

# Execute the requests
snapshot=yes

COMPARE=${HOME}/hdf5-snapshots

#=============================
# Run CVS checkout
#=============================
if [ "$cmd" = "all" -o -n "$cmdcheckout" ]; then
    # Create a working directory.  Hopefully one is left over from last
    # time that still has the contents of the previous release.  But if
    # not, just create one and assume that a snapshot is necessary.
    test -d ${COMPARE} || mkdir -p ${COMPARE} || exit 1

    # Check out the current version from CVS
    cvs -Q co -d ${COMPARE}/current hdf5 || exit 1
fi # Do CVS checkout


#=============================
# Run Test the HDF5 library
#=============================
if [ "$cmd" = "all" -o -n "$cmdtest" ]; then
    # Compare it with the previous version.  Compare only files listed in
    # the MANIFEST plus the MANIFEST itself.
    if [ -d ${COMPARE}/previous ]; then
	if (diff -c ${COMPARE}/previous/MANIFEST ${COMPARE}/current/MANIFEST); then
	    snapshot=no
	    for src in `grep '^\.' ${COMPARE}/current/MANIFEST|expand|cut -f1 -d' '`; do
		diff -I H5_VERS_RELEASE -I " released on " \
		    -I " currently under development" \
		    ${COMPARE}/previous/$src ${COMPARE}/current/$src || \
		    snapshot=yes
		    # Don't break because we want to see all the diffs.
	    done
	fi
    fi

    # Make sure all the serial tests work.
    if [ "$snapshot" = "yes" ]; then
	if (cd ${COMPARE}/current; \
	    ${CONFIGURE}; \
	    make _test); then
	    :
	else
	    errcode=$?
	    snapshot=no
	    exit $errcode
	fi
    fi
fi # Test the HDF5 library


#=============================
# Run Release snapshot, update version, and commit to cvs and tag
#=============================
if [ "$cmd" = "all" -o -n "$cmdrel" ]; then
    if [ "$snapshot" = "yes" ]; then
	(cd ${COMPARE}/current; make distclean)
	(
	    # Turn on exit on error in the sub-shell so that it does not
	    # cvs commit if errors encounter here.
	    set -e
	    cd ${COMPARE}/current
	    bin/release -d $ARCHIVES $METHODS
	    RELEASE_VERSION="`perl bin/h5vers -v`"
	    perl bin/h5vers -i
	    cvs -Q commit -m "Snapshot $RELEASE_VERSION"
	)
	errcode=$?
    fi

    # Replace the previous version with the current version.
    rm -rf ${COMPARE}/previous
    mv ${COMPARE}/current ${COMPARE}/previous
fi #Release snapshot

exit $errcode
