#!/bin/bash
# BEGIN COPYRIGHT BLOCK
# (C) 2010 Red Hat, Inc.
# All rights reserved.
# END COPYRIGHT BLOCK

# Always switch into the base directory above this
# shared shell script prior to executing it so that
# all of its output is written to this directory
cd `dirname $0`/..

# Set pre-defined variables
#
# NOTE:  Variables prefixed with "REDHAT" are defined in the invoking script.
#        Variables prefixed with "PKI" are defined in this shared script.
#        Variables containing no prefix are reserved for the generated script.
#
PKI_ABORT_SCRIPT="false"
PKI_BUILD_XML=build.xml
PKI_EULA="config-ext/EULA"
PKI_RELEASE_DIR=release
PKI_RELEASE_SCRIPT=release.sh
PKI_SHARED_SCRIPT=`basename $0`

# Check the values of the passed-in environment variables
if [ "${REDHAT_BUILD_SCRIPT}" == "" ]; then
    printf "ERROR:  The 'REDHAT_BUILD_SCRIPT' environment variable is undefined!\n"
    PKI_ABORT_SCRIPT="true"
fi
if [ "${REDHAT_COMPONENT}" == "" ]; then
    printf "ERROR:  The 'REDHAT_COMPONENT' environment variable is undefined!\n"
    PKI_ABORT_SCRIPT="true"
fi
if [ "${REDHAT_SPECFILE}" == "" ]; then
    printf "ERROR:  The 'REDHAT_SPECFILE' environment variable is undefined!\n"
    PKI_ABORT_SCRIPT="true"
fi
if [ "${PKI_ABORT_SCRIPT}" == "true" ]; then
    printf "\n"
    printf "The '${PKI_SHARED_SCRIPT}' shared build script MUST be invoked by "
    printf "a\nPKI component-specific build script (e. g. - '${REDHAT_BUILD_SCRIPT}')\n"
    printf "which defines ALL environment variables prefixed by 'REDHAT'!\n"
    exit 255
fi

# Compute remaining variables by assigning their values from the specfile
PKI_SOURCE_CODE_URL="https://pki.fedoraproject.org/svn/nuxwdog/trunk"
PKI_PRODUCT_BUILD_XML="${PKI_BUILD_XML}"
PKI_PRODUCT_NAME="${PKI_PRODUCT}"
PKI_PRODUCT_SOURCE_PATH="."

PKI_RELEASE_ROOT="${PKI_RELEASE_DIR}"
PKI_SOURCE_CODE_LOCAL_REPOSITORY="."

# Always check that local source code for this PKI component is available
if [ ! -d "${PKI_SOURCE_CODE_LOCAL_REPOSITORY}" ]; then
    printf "Please checkout the '${REDHAT_COMPONENT}' source code from:\n\n"
    printf "    '${PKI_SOURCE_CODE_URL}'\n\n"
    printf "to:\n\n"
    printf "    '${PKI_SOURCE_CODE_LOCAL_REPOSITORY}'\n\n"
    exit 255
fi

# Define awk scripts
check_targets='
BEGIN {
    success = "false";
}

{
    while( getline < FILENAME > 0 ) {
        if( substr( $0, 0, 80 ) ~ "target name" ) {
            start = substr( $0,
                            match( $0, "\"" ) + 1 );
            target = substr( start,
                             start,
                             match( start, "\"" ) - 1 );
            if( build_target == target ) {
                success = "true";
            }
        }
    }
}

END {
    printf( "%s", success );
}'

display_targets='{
    while( getline < FILENAME > 0 ) {
        if( substr( $0, 0, 80 ) ~ "target name" ) {
            start = substr( $0,
                            match( $0, "\"" ) + 1 );
            target = substr( start,
                             start,
                             match( start, "\"" ) - 1 );
        }
        if( substr( $0, 0, 80 ) ~ "description" ) {
            start = substr( $0,
                            match( $0, "\"" ) + 1 );
            description[target] = substr( start,
                                          start,
                                          match( start, "\"" ) - 1 );
            printf( "'%20s' %s\n", target, description[target] );
        }
    }
}'

# Provide a usage function
usage() {
    if [ $# -gt 0 ] ; then
        echo
        echo "$1"
    fi
    echo
    echo "Usage:  ${REDHAT_BUILD_SCRIPT} [target]"
    echo
    echo "        where [target] is one of the optional values:"
    echo
    echo "                help --> display '${PKI_PRODUCT_NAME}' usage statement"
    echo "             refresh --> fetch latest '${PKI_PRODUCT_NAME}.spec' file"
    awk "$display_targets" ${PKI_PRODUCT_BUILD_XML}
    echo
    exit 255
}

# Verify that the appropriate number of
# command-line parameters have been entered
# and that a valid target has been specified
if [ $# -eq 0 ] ; then
    RELEASE_TARGET=main
    BUILD_TARGET=""
elif [ $# -eq 1 ] ; then
    if [ "$1" == "help" ]; then
        usage
    else
        SUCCESS=`awk -v build_target=$1 "$check_targets" ${PKI_PRODUCT_BUILD_XML}`
        if [ "${SUCCESS}" == "false" ]; then
            usage "ERROR:  Invalid target '$1' specified for '${PKI_PRODUCT_NAME}'!"
        else
            RELEASE_TARGET=local
            BUILD_TARGET="$1"
        fi
    fi
elif [ $# -gt 1 ] ; then
    usage "ERROR:  Too many parameters specified for '${PKI_PRODUCT_NAME}'!"
fi

# This script may ONLY be run on Linux!
PKI_OS=`uname`
if [ "${PKI_OS}" != "Linux" ]; then
    printf "The '${REDHAT_BUILD_SCRIPT}' script is ONLY executable on a 'Linux' machine!\n"
    exit 255
fi

# Always start with a new release root directory
rm -rf ${PKI_RELEASE_ROOT}
mkdir -p ${PKI_RELEASE_ROOT}

# Copy the source code to the release root
find . -name .svn -prune -o -name *.swp -prune -o -print | cpio -pdum ${PKI_RELEASE_DIR} > /dev/null 2>&1
cd - > /dev/null 2>&1

# Copy the EULA to the release root
cp ${PKI_EULA} ${PKI_RELEASE_ROOT}

# Remove unused files
rm -rf ${PKI_RELEASE_ROOT}/build_*
rm -rf ${PKI_RELEASE_ROOT}/*.spec
if [ -d ${PKI_RELEASE_ROOT}/config-ext ]; then
    rm -rf ${PKI_RELEASE_ROOT}/config-ext
fi

# Create the default spec file
cp ${REDHAT_SPECFILE} ${PKI_RELEASE_ROOT}/${PKI_PRODUCT_NAME}.spec

# Use bash-specific syntax to create the default build script
cat >> ${PKI_RELEASE_ROOT}/${PKI_RELEASE_SCRIPT} << END_OF_SCRIPT
#!/bin/bash

#####################################################################
###  DO NOT EDIT!  This script has been automatically generated!  ###
#####################################################################

# Always switch into the base directory of this
# shell script prior to executing it so that all
# of its output is written to this directory
cd \`dirname \$0\`

# Set pre-defined variables
BUILD_SCRIPT=\`basename \$0\`
BUILD_XML=${PKI_BUILD_XML}
SPECFILE=${PKI_PRODUCT_NAME}.spec

# Define awk scripts
check_targets='
BEGIN {
    success = "false";
}

{
    while( getline < FILENAME > 0 ) {
        if( substr( \$0, 0, 80 ) ~ "target name" ) {
            start = substr( \$0,
                            match( \$0, "\"" ) + 1 );
            target = substr( start,
                             start,
                             match( start, "\"" ) - 1 );
            if( build_target == target ) {
                success = "true";
            }
        }
    }
}

END {
    printf( "%s", success );
}'

display_targets='{
    while( getline < FILENAME > 0 ) {
        if( substr( \$0, 0, 80 ) ~ "target name" ) {
            start = substr( \$0,
                            match( \$0, "\"" ) + 1 );
            target = substr( start,
                             start,
                             match( start, "\"" ) - 1 );
        }
        if( substr( \$0, 0, 80 ) ~ "description" ) {
            start = substr( \$0,
                            match( \$0, "\"" ) + 1 );
            description[target] = substr( start,
                                          start,
                                          match( start, "\"" ) - 1 );
            printf( "'%20s' %s\n", target, description[target] );
        }
    }
}'

# Provide a usage function
usage() {
    if [ \$# -gt 0 ] ; then
        echo
        echo "\$1"
    fi
    echo
    echo "Usage:  \${BUILD_SCRIPT} [target]"
    echo
    echo "        where [target] is one of the optional values:"
    echo
    echo "                help --> display '${PKI_PRODUCT_NAME}' usage statement"
    awk "\$display_targets" \${BUILD_XML}
    echo
    exit 255
}

# Verify that the appropriate number of
# command-line parameters have been entered
# and that a valid target has been specified
if [ \$# -eq 0 ] ; then
    RELEASE_TARGET=main
    BUILD_TARGET=main
elif [ \$# -eq 1 ] ; then
    if [ "\$1" == "help" ]; then
        usage
    else
        SUCCESS=\`awk -v build_target=\$1 "\$check_targets" \${BUILD_XML}\`
        if [ "\${SUCCESS}" == "false" ]; then
            usage "ERROR:  Invalid target '\$1' specified for '${PKI_PRODUCT_NAME}'!"
        else
            RELEASE_TARGET=local
            BUILD_TARGET="\$1"
        fi
    fi
elif [ \$# -gt 1 ] ; then
    usage "ERROR:  Too many parameters specified for '${PKI_PRODUCT_NAME}'!"
fi

# This script may ONLY be run on Linux!
OS=\`uname\`
if [ "\${OS}" != "Linux" ]; then
    printf "The '\${BUILD_SCRIPT}' script is ONLY executable on a 'Linux' machine!\n"
    exit 255
fi

ant -f config/release.xml -Dproduct.ui.flavor.prefix=\${PKI_PRODUCT_UI_FLAVOR_PREFIX} -Dproduct.prefix=\${PKI_PRODUCT_PREFIX} -Dproduct=\${PKI_PRODUCT} -Dversion=\${PKI_VERSION} -Dbasedir=. -Dspecfile=\${SPECFILE} -Dtarget=\${BUILD_TARGET} \${RELEASE_TARGET}

END_OF_SCRIPT
chmod 00755 ${PKI_RELEASE_ROOT}/${PKI_RELEASE_SCRIPT}

cd ${PKI_RELEASE_ROOT}
./${PKI_RELEASE_SCRIPT} ${BUILD_TARGET}

