#!/bin/sh
#
# Copyright (c) 2005 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
# "Software"), to deal in the Software without restriction, including
# without limitation the rights to use, copy, modify, merge, publish,
# distribute, sublicense, and/or sell copies of the Software, and to
# permit persons to whom the Software is furnished to do so, subject to
# the following conditions:
#
# The above copyright notice and this permission notice shall be included
# in all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

PROG=`basename $0`
NOARGFLAGS="afhlnqrstz"
ARGFLAGS="p:"
ALLFLAGS="${NOARGFLAGS}${ARGFLAGS}"
USAGE="Usage:  ${PROG} [-${NOARGFLAGS}] [-p project] change"

HELP="$USAGE

  -a            Update the latest Aegis baseline (aedist) file.
  -f            Force update, skipping up-front sanity check.
  -h            Print this help message and exit.
  -l            Update the local CVS repository.
  -n            Don't execute, just echo commands.
  -p project    Set the Aegis project.
  -q            Quiet, don't print commands before executing them.
  -r            Rsync the Aegis repository to SourceForge.
  -s            Update the sourceforge.net CVS repository.
  -t            Update the tigris.org CVS repository.
  -z            Update the latest .tar.gz and .zip files.
"

DO=""
PRINT="echo"
EXECUTE="eval"
SANITY_CHECK="yes"

while getopts $ALLFLAGS FLAG; do
    case $FLAG in
    a | l | r | s | t | z )
        DO="${DO}${FLAG}"
        ;;
    f )
        SANITY_CHECK="no"
        ;;
    h )
        echo "${HELP}"
        exit 0
        ;;
    n )
        EXECUTE=":"
        ;;
    p )
        AEGIS_PROJECT="${OPTARG}"
        ;;
    q )
        PRINT=":"
        ;;
    * )
        echo "FLAG = ${FLAG}" >&2
        echo "${USAGE}" >&2
        exit 1
        ;;
    esac
done

shift `expr ${OPTIND} - 1`

if test "X$1" = "X"; then
    echo "${USAGE}" >&2
    exit 1
fi

if test "X${AEGIS_PROJECT}" = "X"; then
    echo "$PROG: No AEGIS_PROJECT set." >&2
    echo "${USAGE}" >&2
    exit 1
fi

if test "X$DO" = "X"; then
    DO="alrstz"
fi

cmd()
{
    $PRINT "$*"
    $EXECUTE "$*"
}

CHANGE=$1

if test "X${SANITY_CHECK}" = "Xyes"; then
    SCM="cvs"
    SCMROOT="/home/scons/CVSROOT/scons"
    DELTA=`aegis -l -ter cd ${CHANGE} | sed -n 's/.*, Delta \([0-9]*\)\./\1/p'`
    if test "x${DELTA}" = "x"; then
        echo "${PROG}:  Could not find delta for change ${CHANGE}." >&2
        echo "Has this finished integrating?  Change ${CHANGE} not distributed." >&2
        exit 1
    fi
    PREV_DELTA=`expr ${DELTA} - 1`
    COMMAND="scons-scmcheck -D ${PREV_DELTA} -d q -p ${AEGIS_PROJECT} -s ${SCM} ${SCMROOT}"
    $PRINT "${COMMAND}"
    OUTPUT=`${COMMAND}`
    if test "X${OUTPUT}" != "X"; then
        echo "${PROG}: ${SCMROOT} is not up to date:" >&2
        echo "${OUTPUT}" >& 2
        echo "Did you skip any changes?  Change ${CHANGE} not distributed." >&2
        exit 1
    fi
fi

if test X$EXECUTE != "X:" -a "X$SSH_AGENT_PID" = "X"; then
    eval `ssh-agent`
    ssh-add
    trap 'eval `ssh-agent -k`; exit' 0 1 2 3 15
fi

cd

BASELINE=`aesub -p ${AEGIS_PROJECT} -c ${CHANGE} '${Project trunk_name}'`

TMPBLAE="/tmp/${BASELINE}.ae"
TMPCAE="/tmp/${AEGIS_PROJECT}.C${CHANGE}.ae"

# Original values for SourceForge.
#SFLOGIN="stevenknight"
#SFHOST="scons.sourceforge.net"
#SFDEST="/home/groups/s/sc/scons/htdocs"

SCONSLOGIN="scons"
SCONSHOST="manam.pair.com"
#SCONSDEST="public_html/production"
SCONSDEST="public_ftp"

#
# Copy the baseline .ae to the constant location on SourceForge.
#
case "${DO}" in
*a* )
    cmd "aedist -s -bl -p ${AEGIS_PROJECT} > ${TMPBLAE}"
    cmd "scp ${TMPBLAE} ${SCONSLOGIN}@${SCONSHOST}:${SCONSDEST}/${BASELINE}.ae"
    cmd "rm ${TMPBLAE}"
    ;;
esac

#
# Copy the latest .tar.gz and .zip files to the constant location on
# SourceForge.
#
case "${DO}" in
*z* )
    BUILD_DIST=`aegis -p ${AEGIS_PROJECT} -cd -bl`/build/dist
    SCONS_SRC_TAR_GZ=`echo ${AEGIS_PROJECT} | sed 's/scons./scons-src-/'`*.tar.gz
    SCONS_SRC_ZIP=`echo ${AEGIS_PROJECT} | sed 's/scons./scons-src-/'`*.zip
    cmd "scp ${BUILD_DIST}/${SCONS_SRC_TAR_GZ} ${SCONSLOGIN}@${SCONSHOST}:${SCONSDEST}/scons-src-latest.tar.gz"
    cmd "scp ${BUILD_DIST}/${SCONS_SRC_ZIP} ${SCONSLOGIN}@${SCONSHOST}:${SCONSDEST}/scons-src-latest.zip"
esac

#
# Sync Aegis tree with SourceForge.
#
# Cribbed and modified from Peter Miller's same-named script in
# /home/groups/a/ae/aegis/aegis at SourceForge.
#
# Guide to what this does with rsync:
#
#   --rsh=ssh          use ssh for the transfer
#   -l                 copy symlinks as symlinks
#   -p                 preserve permissions
#   -r                 recursive
#   -t                 preserve times
#   -z                 compress data
#   --stats            file transfer statistics
#   --exclude          exclude files matching the pattern
#   --delete           delete files that don't exist locally
#   --delete-excluded  delete files that match the --exclude patterns
#   --progress         show progress during the transfer
#   -v                 verbose
#
# We no longer use the --stats option.
#
case "${DO}" in
*r* )
    LOCAL=/home/scons/scons
    REMOTE=/home/groups/s/sc/scons/scons
    cmd "/usr/bin/rsync --rsh='ssh -l stevenknight' \
            -l -p -r -t -z \
            --exclude build \
            --exclude '*,D' \
            --exclude '*.pyc' \
            --exclude aegis.log \
            --exclude '.sconsign*' \
            --delete --delete-excluded \
            --progress -v \
            ${LOCAL}/. scons.sourceforge.net:${REMOTE}/."
    ;;
esac

#
# Sync the CVS tree with the local repository.
#
case "${DO}" in
*l* )
    (
        export CVSROOT=/home/scons/CVSROOT/scons
        #cmd "ae2cvs -X -aegis -p ${AEGIS_PROJECT} -c ${CHANGE} -u $HOME/SCons/baldmt.com/scons"
        cmd "ae-cvs-ci ${AEGIS_PROJECT} ${CHANGE}"
    )
    ;;
esac

#
# Sync the Subversion tree with Tigris.org.
#
case "${DO}" in
*t* )
    (
        SVN=http://scons.tigris.org/svn/scons
        case ${AEGIS_PROJECT} in
        scons.0.96 )
            SVN_URL=${SVN}/branches/core
            ;;
        scons.0.96.513 )
            SVN_URL=${SVN}/branches/sigrefactor
            ;;
        * )
            echo "$PROG: Don't know SVN branch for '${AEGIS_PROJECT}'" >&2
            exit 1
            ;;
        esac
        SVN_CO_FLAGS="--username stevenknight"
        #cmd "ae2cvs -X -aegis -p ${AEGIS_PROJECT} -c ${CHANGE} -u $HOME/SCons/tigris.org/scons"
        cmd "ae-svn-ci ${AEGIS_PROJECT} ${CHANGE} ${SVN_URL} ${SVN_CO_FLAGS}"
    )
    ;;
esac

#
# Sync the CVS tree with SourceForge.
#
case "${DO}" in
*s* )
    (
        export CVS_RSH=ssh
        export CVSROOT=:ext:stevenknight@scons.cvs.sourceforge.net:/cvsroot/scons
        #cmd "ae2cvs -X -aegis -p ${AEGIS_PROJECT} -c ${CHANGE} -u $HOME/SCons/sourceforge.net/scons"
        cmd "ae-cvs-ci ${AEGIS_PROJECT} ${CHANGE}"
    )
    ;;
esac

#
# Send the change .ae to the scons-aedist mailing list
#
# The subject requires editing by hand...
#
#aedist -s -p ${AEGIS_PROJECT} ${CHANGE} > ${TMPCAE}
#aegis -l -p ${AEGIS_PROJECT} -c ${CHANGE} cd |
#        pine -attach_and_delete ${TMPCAE} scons-aedist@lists.sourceforge.net