#!/bin/sh
#
# Script to clean binary files.
#
# JPackage Project <http://www.jpackage.org/>
#
# $Id: check-binary-files,v 1.1 2006/09/19 19:39:37 fnasser Exp $

# Import java functions
[ -r /usr/share/java-utils/java-functions ] \
 &&  . /usr/share/java-utils/java-functions || exit 1

# Prints help message
usage() {
    /bin/cat >&2 << EOF_USAGE

Usage: $0 -f instructions_file [-a archive_file]

Options:
    -a - Archive file on which actions will be performed, as opposed to 
         current directory
    -f - The instructions file to check against.
EOF_USAGE
    exit 2
}

[ "$1" = "--help" ] && usage

[ "$#" = 0 ] && usage

set_javacmd || exit 3
check_java_env || exit 4
set_jvm_dirs || exit 5

# Directory in which script was invoked
_WORKING_DIR=`pwd`

# Run-time variables
_ARCHIVE_FILE=""
_KEEP_LIST=""
_REMOVE_LIST=""
_INSTRUCTIONS_FILE=""

# Directory where archive is extracted, if we are working with one
_ARCHIVE_EXTRACTION_DIR=/tmp/_cbr_archive_dir.$$

# Adds to the appropriate (keep/remove) list
add_to_keep_or_remove_list() {

    if [ $1 = "keep" ]; then

        shift

        if [ -z "$_KEEP_LIST" ]; then
            _KEEP_LIST=$*
        else
            _KEEP_LIST=${_KEEP_LIST}"|"$*
        fi
    else

        shift

        if [ -z "$_REMOVE_LIST" ]; then
            _REMOVE_LIST=$*
        else
            _REMOVE_LIST=${_REMOVE_LIST}"|"$*
        fi
    fi
}

# Ensures that files in kee/remove list exist on disk, and vice-versa
ensure_files_exist() {

    _old_ifs=$IFS
    IFS="|"

    _had_errors=0

    for file in $_KEEP_LIST; do
        if [ ! -f $file ]; then
            echo "ERROR: File $file should exist, but does not."
            _had_errors=1
        fi
    done

    for file in $_REMOVE_LIST; do
        if [ -f $file ]; then
            echo "ERROR: File $file should not exist, but does."
            _had_errors=1
        fi
    done

    IFS=$_old_ifs

    if [ $_had_errors -eq 1 ]; then
        exit 7
    fi

}

while [ $# -gt 0 ] ; do
    case "$1" in
        -f)
            if [ ! -f $2 ] ; then
                echo "$0: error: Could not find instructions file!"
                exit 6;
            fi

            while read line; do

                echo $line | grep ^% >& /dev/null
                if [ $? -eq 0 ] || [ "$line" = "" ]; then
                    continue
                fi

                _type=`echo $line | awk '{print $1}'`
                _value=`echo $line | awk '{ printf "%s", $2; for (i = 3; i <= NF; i=i+1) printf " %s", $i }'`

                add_to_keep_or_remove_list $_type $_value

            done < $2

            _INSTRUCTIONS_FILE="$2"

            shift
        ;;
        -a)
            _ARCHIVE_FILE="$2"
            shift
        ;;
        *)
            echo "ERROR: Unknown argument $1"
            exit 6
        ;;
    esac
    shift
done

if [ "$_INSTRUCTIONS_FILE" = "" ]; then
    echo "ERROR: Instructions file must be specified."
    exit 6
fi

# If we are dealing with an archive file, we need to extract things somewhere, and do our actions in there
if [ ! -z $_ARCHIVE_FILE ]; then
    rm -rf $_ARCHIVE_EXTRACTION_DIR
    mkdir -p $_ARCHIVE_EXTRACTION_DIR
    pushd $_ARCHIVE_EXTRACTION_DIR >& /dev/null
    tar xf $_WORKING_DIR/`basename $_ARCHIVE_FILE`
fi

ensure_files_exist

if [ ! -z $_ARCHIVE_FILE ]; then

    _archive_basename=`basename $_ARCHIVE_FILE`
    _arch_name=${_archive_basename%%.*}
    _arch_ext=${_archive_basename#*.}

    _compression_flag=""

    echo $_ARCHIVE_FILE | grep gz$ >& /dev/null
    if [ $? -eq 0 ]; then
        _compression_flag=z
    fi

    echo $_ARCHIVE_FILE | grep bz2$ >& /dev/null
    if [ $? -eq 0 ]; then
        _compression_flag=f
    fi

    tar cf$_compression_flag $_WORKING_DIR/$_arch_name-clean.$_arch_ext *

    popd >& /dev/null
    rm -rf $_ARCHIVE_EXTRACTION_DIR
fi