#!/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
#
#  --nocheck	Ignore errors in MANIFEST file.
#          
# 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=`perl bin/h5vers`
test "$VERS" || exit 1
verbose=yes
check=yes

# Command-line arguments
while [ -n "$1" ]; do
    arg=$1
    shift
    case "$arg" in
	-d)
	    DEST=$1
	    shift
	    ;;
	--nocheck)
	    check=no
	    ;;
	-*)
	    echo "Unknown switch: $arg" 1>&2
	    exit 1
	    ;;
	*)
	    methods="$methods $arg"
	    ;;
    esac
done

# Default method is tar
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
    if [ $check = yes ]; then
        exit 1
    else
	echo "Continuing anyway..."
    fi
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
