#!/bin/bash
# -----------------------------------------------------------------------------
# Shell script to determine the last commit version of the project It
# checks for CVS and .git repositories.  The output is a string that
# can be used in a define at compile time to automatically mark
# repository versions.  For CVS repositories the string contains the
# date and time of the commit that lead to the current version of
# files.  For git repositories the output contains the git-id of the
# current tree.  An indication if localy modified files exist is
# added currently only for CVS.
# -----------------------------------------------------------------------------

[ $# -lt 1 ] && echo "USAGE: version-util [-F] <versionfile>" && exit 1

VERS_FILE=$1
FORCE_EMPTY=0

[ "$VERS_FILE" == "-F" -a $# -lt 2 ] && echo "USAGE: version-util [-F] <versionfile>" && exit 1

if [ $# -gt 1 ]; then
    VERS_FILE=$2
    FORCE_EMPTY=1
fi


SCRIPT_PATH=`dirname $0`

# echo "file: ${VERS_FILE}, force = $FORCE_EMPTY"
# exit 0

createVers()
{
cat <<EOF
/* ATTENTION: this file is automatically generated and will be overwritten!
 * Manual changes will get lost!
 */
#ifndef GEN_VERSION_SUFFIX_H
#define GEN_VERSION_SUFFIX_H
#define VERSION_SUFFIX "$1"
#endif
EOF
}

fileVersions()
{
    for file in `find . -wholename '*CVS/Entries' -print`
    do
	sed -e's/\//|/g' -e's/|/\//' $file \
	    | grep --label=$file -H '^/' \
	    | sed -e's/\/CVS\/Entries://' -e's/\.\///'
    done
}

cvsLog()
{
    echo "= == ===marker=== == ="
    cvs log -b -N 2> /dev/null
}

cvsData()
{
    fileVersions
    cvsLog
}

cvsVers()
{
    d=`cvsData \
	| awk -f ${SCRIPT_PATH}/version-util.awk \
	| sort -u \
	| tail -1 \
	| tr -d ' \-:'`
    m=`cvs status 2> /dev/null \
	| grep 'Status: Locally Modified' > /dev/null && echo "_MOD"`
    echo "_cvs_${d}${m}"
}

gitVers()
{
    b=`git branch \
	| grep '^*' \
	| sed -e's/^* //'`
    h=`git show --pretty=format:"%h_%ci" HEAD \
	| head -1 \
	| tr -d ' \-:'`
    echo "_git_${b}_${h}"
}

emptyVers()
{
    echo ""
}

checkVers()
{
    s=`$1`
    if [ ! -e ${VERS_FILE} ]; then
	echo "$VERS_FILE does not exist! creating a new one."
	createVers $s > ${VERS_FILE}
    else
	v=`grep '^#define VERSION_SUFFIX' ${VERS_FILE} \
	    | awk '{print $3}'`
	if [ "$v" != "\"$s\"" ]; then
	    echo "$VERS_FILE is being recreated!"
	    createVers $s > ${VERS_FILE}
	fi
    fi
}

if [ $FORCE_EMPTY -eq 1 ]; then
    checkVers emptyVers
    exit 0
fi

if [ -d CVS ]; then
    checkVers cvsVers
    exit 0
fi

if [ -d .git ]; then
    checkVers gitVers
    exit 0
fi

checkVers emptyVers
