#!/bin/sh

# Make a release of hdf5.  The command-line switches are:
#
#  -d DIR	The name of the directory where the releas(es) should be
#               placed.  By default, the directory is ./releases
#          
# The other command-line options are the names of the programs to use
# for compressing the resulting tar archive (if none are given then
# `tar' is assumed):
#
#   tar		-- use tar and don't do any compressing.
#   compress	-- use compress and append `.Z' to the output name.
#   gzip	-- use gzip with `-9' and append `.gz' to the output name.
#   bzip2       -- use bzip2 with `-9' and append `.bz2' to the output name.
#
# Examples:
#
#   $ release
#   releases/hdf5-1.0.38.tar
#
#   $ release gzip
#   releases/hdf5-1.0.38.tar.gz
#
#   $ release -d /tmp tar compress gzip bzip2
#   /tmp/hdf5-1.0.38.tar
#   /tmp/hdf5-1.0.38.tar.Z
#   /tmp/hdf5-1.0.38.tar.gz
#   /tmp/hdf5-1.0.38.tar.bz2
#

# Defaults
DEST=releases
VERS=`bin/h5vers`
test "$VERS" || exit 1
verbose=yes

# Command-line arguments
if [ "X$1" = "X-d" ]; then
    DEST="$2"
    shift
    shift
fi
methods="$*"
if [ "X$methods" = "X" ]; then
    methods=tar
fi
test "$verbose" && echo "Releasing hdf5-$VERS to $DEST" 1>&2
if [ ! -d $DEST ]; then
    echo "   Destination directory $DEST does not exist" 1>&2
    exit 1
fi

# Copy the manifest file to get a list of file names.
MANIFEST=/tmp/H5_MANIFEST.$$
grep '^\.' MANIFEST | expand | cut -f1 -d' ' >$MANIFEST

# Check that all the files in MANIFEST exist and that (if this is a
# CVS checkout) that all the CVS-managed files appear in the
# MANIFEST.
test "$verbose" && echo "   Checking manifest..." 1>&2
test -f $MANIFEST || exit 1
for file in `cat $MANIFEST`; do
    if [ ! -f $file ]; then
       echo "- $file"
       fail=yes
    fi
done
for cvs in `find . -type d -name CVS -print`; do
    path=`echo $cvs |sed s+/CVS++`
    for file in `grep '^\/' $cvs/Entries |cut -d/ -f2`; do
	if (grep $path/$file $MANIFEST >/dev/null); then
	    :
	else
	    echo "+ $path/$file"
	    fail=yes
	fi
    done
done
for file in ./Changes `sh -c 'svf ls' 2>/dev/null`; do
    if (grep $file $MANIFEST >/dev/null); then
	:
    elif [ $file = ./Changes ]; then
        :
    else
	echo "+ $file"
	fail=yes
    fi
done

if [ "X$fail" = "Xyes" ]; then
    cat 1>&2 <<EOF
The MANIFEST is out of date. Files marked with a minus sign (-) no
longer exist; files marked with a plus sign (+) are CVS-managed but do
not appear in the MANIFEST.  Please remedy the situation and try again.
EOF
    exit 1
fi

# Create a manifest that contains only files for distribution.
grep '^\.' MANIFEST | grep -v _DO_NOT_DISTRIBUTE_ >$MANIFEST

# Prepare the source tree for a release.
test -h ../hdf5-$VERS && rm ../hdf5-$VERS
ln -s `pwd` ../hdf5-$VERS || exit 1
mv Makefile ../Makefile.x 2>/dev/null #might fail
cp -p Makefile.dist Makefile
echo "This is hdf5-$VERS released on `date`" >README.x
tail -n +2 <README >>README.x
mv README.x README
test "$verbose" && echo "   Running tar..." 1>&2
( \
    cd ..; \
    tar cf x.tar hdf5-$VERS/Makefile \
	`sed s+^.+hdf5-$VERS+ $MANIFEST` || exit 1 \
)

# Compress
for comp in $methods; do
    case $comp in
	tar)
	    cp -p ../x.tar $DEST/hdf5-$VERS.tar;;
	compress)
	    test "$verbose" && echo "   Running compress..." 1>&2
	    compress -c <../x.tar >$DEST/hdf5-$VERS.tar.Z;;
	gzip)
	    test "$verbose" && echo "   Running gzip..." 1>&2
	    gzip -9 <../x.tar >$DEST/hdf5-$VERS.tar.gz;;
	bzip2)
	    test "$verbose" && echo "   Running bzip2..." 1>&2
	    bzip2 -9 <../x.tar >$DEST/hdf5-$VERS.tar.bz2;;
    esac
done

# Remove temporary things
test -f ../Makefile.x && mv ../Makefile.x Makefile
rm -f $MANIFEST
rm -f ../hdf5-$VERS
rm -f ../x.tar
exit 0