#!/bin/sh echo "=====================================" echo "$0 $*" echo "=====================================" 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" # Use User's MAKE if set. Else use generic make. MAKE=${MAKE:-make} # Make sure cvs would work if [ -z "$CVSROOT" ]; then echo "Where is the CVS repository?" 1>&2 exit 1 fi # # Command options cmd="all" test_opt="" errcode=0 while [ $# -gt 0 ] ; do case "$1" in all) cmd="all" ;; checkout) cmdcheckout="checkout" cmd="" ;; test) cmdtest="test" cmd="" ;; srcdir) #use srcdir option for test srcdir="yes" ;; srcdirname) shift if [ $# -lt 1 ]; then echo "srcdirname <dir> missing" errcode=1 cmd="help" break fi SRCDIRNAME="$1" ;; release) cmdrel="release" cmd="" ;; clean | distclean) cmdclean="$1" 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" ;; --*) OP_CONFIGURE="$OP_CONFIGURE $1" ;; op-configure) shift if [ $# -lt 1 ]; then echo "op-configure option missing" errcode=1 cmd="help" break fi OP_CONFIGURE="$OP_CONFIGURE $1" ;; *) echo "Unkown option $1" errcode=1 cmd="help" break ;; esac shift done if [ "$cmd" = help ]; then set - cat <<EOF Usage: $0 [all] [checkout] [test] [srcdir] [release] [help] [hdf4 <hdf4lib_path>] [archive <arch_path>] [dir <dir>] [op-configure <option>] [--<option>] all: Run all commands (checkout, test & release) [Default is all] checkout: Run cvs checkout test: Run test release: Run release clean: Run make clean distclean:Run make distclean srcdir: Use srcdir option (does not imply other commands) "snapshot srcdir" is equivalent to "snapshot srcdir all" "snapshot srcdir checkout" is equivalent to "snapshot checkout" srcdirname <dir>: Use <dir> as the srcdir testing directory if srcdir is choosen. If <dir> starts with '-', it is append to the default name E.g., "snapshot srcdir srcdirname -xx" uses hostname-xx [Default is hostname] help: Print this message hdf4 <hdf4lib_path>: Use <hdf4lib_path> as the HDF4LIB locations [Default is $HDF4LIB_default] archive <arch_path>: Use <arch_path> as the release ARCHIVE area [Default is $ARCHIVES_default] op-configure <option>: Pass <option> to the configure command E.g., "snapshot op-configure --enable-parallel" configures for parallel mode --<option>: Pass --<option> to the configure command E.g., "snapshot --enable-parallel" configures for parallel mode EOF 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 $OP_CONFIGURE" # Execute the requests snapshot=yes H5VERSION=hdf5 BASEDIR=${HOME}/snapshots-${H5VERSION} CURRENT=${BASEDIR}/current PREVIOUS=${BASEDIR}/previous HOSTNAME=`hostname | cut -f1 -d.` # no domain part if [ $H5VERSION != hdf5 ]; then CVSVERSION="-r $H5VERSION" else CVSVERSION= # use the default (main) version fi # Try finding a version of diff that supports the -I option too. DIFF=diff for d in `echo $PATH | sed -e 's/:/ /g'` ; do test -x $d/diff && $d/diff -I XYZ /dev/null /dev/null > /dev/null 2>&1 && DIFF=$d/diff && break done #============================= # 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 ${BASEDIR} || mkdir -p ${BASEDIR} || exit 1 # If there is a Makefile in ${CURRENT}, the last test done in it # has not been distclean'ed. They would interfere with other # --srcdir build since make considers the files in ${CURRENT} # take precedence over files in its own build-directory. Run # a "make distclean" to clean them all out. This is not really # part of the "checkout" functions but this is the most convenient # spot to do the distclean. We will also continue the checkout process # regardless of the return code of distclean. ( cd ${CURRENT}; test -f Makefile && ${MAKE} distclean) # Check out the current version from CVS cvs -Q co -d ${CURRENT} ${CVSVERSION} hdf5 || exit 1 fi # Do CVS checkout #============================= # Run Test the HDF5 library #============================= if [ "$cmd" = "all" -o -n "$cmdtest" ]; then # setup if srcdir is used. if [ -z "$srcdir" ]; then TESTDIR=${CURRENT} else #create TESTDIR if not exist yet case "$SRCDIRNAME" in "") SRCDIRNAME=$HOSTNAME ;; -*) SRCDIRNAME="$HOSTNAME$SRCDIRNAME" ;; esac TESTDIR=${BASEDIR}/TestDir/${SRCDIRNAME} test -d ${TESTDIR} || mkdir ${TESTDIR} fi INSTALLDIR=${TESTDIR}/installdir test -d $INSTALLDIR || mkdir $INSTALLDIR # Make sure current version exists and is clean if [ -d ${TESTDIR} ]; then (cd ${TESTDIR} && ${MAKE} distclean) else errcode=$? snapshot=no exit $errcode fi # Compare it with the previous version. Compare only files listed in # the MANIFEST plus the MANIFEST itself. if [ -d ${PREVIOUS} ]; then if (${DIFF} -c ${PREVIOUS}/MANIFEST ${CURRENT}/MANIFEST); then snapshot=no for src in `grep '^\.' ${CURRENT}/MANIFEST|expand|cut -f1 -d' '`; do if ${DIFF} -I H5_VERS_RELEASE -I " released on " \ -I " currently under development" \ ${PREVIOUS}/$src ${CURRENT}/$src then : #continue else snapshot=yes # Don't break because we want to see all the diffs. break fi done fi fi # Build, run tests and install procedures if [ "$snapshot" = "yes" ]; then if (cd ${TESTDIR} && \ ${srcdir:+${CURRENT}/}${CONFIGURE} --prefix=$INSTALLDIR && \ ${MAKE} && \ ${MAKE} check && \ ${MAKE} install install-doc && \ ${MAKE} uninstall uninstall-doc); 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 ${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 ${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. # Should check if the errcode of the release process but there # are other failures after release was done (e.g. h5vers or cvs failures) # that should allow the replacement to occure. rm -rf ${PREVIOUS} mv ${CURRENT} ${PREVIOUS} fi #Release snapshot #============================= # Clean the test area. Default is no clean. #============================= if [ -n "$cmdclean" ]; then # setup if srcdir is used. if [ -z "$srcdir" ]; then TESTDIR=${CURRENT} else case "$SRCDIRNAME" in "") SRCDIRNAME=$HOSTNAME ;; -*) SRCDIRNAME="$HOSTNAME$SRCDIRNAME" ;; esac TESTDIR=${BASEDIR}/TestDir/${SRCDIRNAME} fi # Make sure current version exists and is clean if [ -d ${TESTDIR} ]; then (cd ${TESTDIR} && ${MAKE} $cmdclean ) else errcode=$? snapshot=no exit $errcode fi fi # Clean the Test directory exit $errcode