#!/bin/sh
#
#  Make backup copies of a specified file ( arg. 1 ).  A second argument, <n>
#  is optional and specifies that you want to keep <file>.0 through <file>.<n>
#  as backups.  If no number is given then the default, 6, will be used.
#
#                                            - wheelan
#
#  Heavily Modified by lucb for compression and presentation. Backwards 
#  compatible to Bill's version
#
usage () {
        cat <<EOC

Usage: $0 [-v] [-d directory] [-c] [-n] file [number]

$0 makes backup copies of a specified file.  A second argument,
\`number' is optional and specifies that you want to keep \`file.0'
through \`file.n' as backups.  If no number is given then the default
\`9' will be used.

Compressed files [files ending in .Z or .gz] are checked for and moved
appropriately. In addition, if a compressed file is found, the newly
moved file will be compressed. The appropriate compression program is
used.

EOC
        exit 2
}

#
# parse the command line arguments:
#
while [ $# -gt 1 ] ; do
  case $1 in
    -d) shift; directory=$1;;
    -c) compression="y";;
    -n) compression="n";;
    -v) verbose="y" ;;
    -x) set -x ;;
    -h) usage;;                 # call the usage funtion
    [a-zA-Z0-9]*) break;;
    *)                          # Catch anything that doesn't match the 
                                # previous flags
        echo "Unknown option [$1]";
        usage;;
  esac
  shift
done

if [ $# -lt 1 -o $# -gt 2 ] ; then
   usage;
fi

if [ ! -f $1 ] ; then
   echo "File $1 does not exist"
   exit 1
fi

debug()
{
        if [ x$verbose = xy ] ; then 
                echo "$1"
        fi
}

index() 
{
        i=1;
        while [ $i -le ${1:-$MIDX} ] ; do
                echo -n "$i ";
                i=`expr $i + 1`;
        done
}

rindex() 
{
        i=${1:-$MIDX};
        while [ $i -gt 0 ] ; do
                echo -n "$i ";
                i=`expr $i - 1`;
        done
}

directory=${directory:-.}
if [ "${directory}" != "." ] ; then
	if [ ! -d $directory ] ; then
		echo "Can't find directory [$directory]"
		exit 2
	fi
fi

umask 000
compress=none
for n in `rindex ${2:-9}` ; do
   src=${directory}/$1.`expr $n - 1`
   dst=${directory}/$1.$n
   if [ -d $src -o -f $src ] ; then
        /bin/mv -f $src $dst && debug "/bin/mv -f $src $dst"
	compress=none
   elif [ -f $src.Z ] ; then
        /bin/mv -f $src.Z $dst.Z && debug "/bin/mv -f $src.Z $dst.Z"
        compress=compress
   elif [ -f $src.gz ] ; then
        /bin/mv -f $src.gz $dst.gz && debug "/bin/mv -f $src.gz $dst.gz"
        compress=gzip
   fi
done

# A copy would keep the file permissions the same, but will fill in "holes"
# in the file.

dst=$directory/$1.0
perm=`perl -e '$mode=((stat("'$1'"))[2] & 07777); printf ("%o\n", $mode)'`
mv $1 $dst     && debug "mv $1 $dst"
cat /dev/null > $1
chmod $perm $1 && debug "chmod $perm $1"

if [ x${compression:-} = xn ] ; then
        debug "No compression requested";
elif [ x${compression:-} = xy ] ; then
        gzip $dst && debug "gzip $dst (explicitely)" ;
else
        case "$compress" in
        "none") 
                debug "No compression";;
        "compress")
                compress $dst && debug "compress $dst" ;;
        "gzip") 
                gzip $dst && debug "gzip $dst" ;;
        esac
fi