#!/bin/sh
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU Library General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
#
# Copyright (c) 2007 Oliver Grawert
# Copyright (c) 2007 Vagrant Cascadian
# Copyright (c) 2007, 2008 Warren Togami

MKDST_VERSION=0.9

# Read NAME and VERSION from config file
# NAME    is required in release.conf
# VERSION is required in release.conf
if [ ! -e release.conf ]; then
    echo "ERROR: release.conf does not exist.  Must define NAME and VERSION."
    exit 1 
fi
unset EXPORTCHANGELOG
. ./release.conf
if [ -z "$NAME" ] || [ -z "$VERSION" ]; then
    echo "ERROR: NAME and VERSION must be defined in release.conf."
    exit 1
fi

SCRIPT=$(basename $0)
WORK_DIR=$(pwd)
OUTPUT_DIR="$WORK_DIR"
RELEASE=$NAME-$VERSION
TDIR="$(mktemp -d)"
BUILDPATH="$TDIR/$RELEASE"
TARBALL_TYPES="gz bz2"
CLEANLIST="*.gz *.bz2 *.rpm rpmbuild.log"
DATE=`date +%Y%m%d.%H`
unset MODE
unset FROMTAG


### Functions
usage() {
    echo "mkdst-$MKDST_VERSION usage:
    $SCRIPT tar [--from-tag=NAME-VERSION]
      Create tarball
    $SCRIPT rpm
      Build RPM package
    $SCRIPT tag
      Creates tag NAME-VERSION from release.conf
    $SCRIPT clean
      Clean up tarballs"
    exit 1
}

clean() {
    for file in `ls $CLEANLIST 2> /dev/null`; do
        echo "CLEAN: removing $file"
        rm -f $file
    done
}

srccheck() {
    if [ -n "`bzr st`" ]; then
        echo "ERROR: Uncommitted changes, please commit first !"
        bzr st
        exit 1
    fi
}

tag() {
    bzr tag $RELEASE
}

autogen() {
    if [ -x $BUILDPATH/autogen.sh ]; then
        cd $BUILDPATH
        ./autogen.sh
        if [ $? -ne 0 ]; then
            echo "ERROR: autogen.sh has failed.  You are likely missing tools like autoconf/automake/gettext."
            exit 1
        fi
        cd - > /dev/null
    fi
}

export_tree_vcs() {
    # Use VCS tool to export tree 
    echo "WORK: exporting tree to workdir $BUILDPATH"
    bzr export $BUILDPATH --revision=tag:$FROMTAG
}

export_tree_copy() {
    # Copy what is in the current directory
    echo "WORK: copying tree to workdir $BUILDPATH"
    cp -a $WORK_DIR $BUILDPATH
    [ $? -ne 0 ] && echo FAIL
    rm -rf $BUILDPATH/.bzr
    clean $BUILDPATH
}

export_changelog() {
    bzr log > $BUILDPATH/ChangeLog
}

mktar(){
    echo "RELEASE: $RELEASE"
    clean
    if [ -n "$FROMTAG" ]; then
        export_tree_vcs
    else
        export_tree_copy
    fi
    [ "$EXPORTCHANGELOG" = "yes" ] && export_changelog

    # RPM spec file is not wanted in the tarball
    [ -e $BUILDPATH/$NAME.spec ] && rm -f $BUILDPATH/$NAME.spec

    autogen

    cd $TDIR
    for type in $TARBALL_TYPES ; do
        case $type in
            bz2) opt=j ;;
            gz) opt=z ;;
        esac
        if [ -n "$FROMTAG" ]; then
            TARBALL="$OUTPUT_DIR/$FROMTAG"
        elif [ -n "$TARBALL_RELEASE" ]; then
            TARBALL="$OUTPUT_DIR/$TARBALL_RELEASE"
        else
            TARBALL="$OUTPUT_DIR/$RELEASE"
        fi
        if [ -z "$TARBALL_EXT" ]; then
            TARBALL="$TARBALL.tar"
        else
            TARBALL="$TARBALL.$TARBALL_EXT"
        fi
        tar c"$opt"f $TARBALL.$type $RELEASE
        echo "OUTPUT: created source tarball $TARBALL.$type"
    done
    cd - > /dev/null
}

buildrpm() {
    if [ -e $WORK_DIR/$NAME.spec ]; then
        # Reset _datestamp in spec if present
        sed -i 's/^%define[ \t]\+_datestamp[ \t]\+.*/%define _datestamp .'$DATE'/' \
            $WORK_DIR/$NAME.spec
        cp $WORK_DIR/$NAME.spec $TDIR/
    else
        echo "ERROR: File not found: $NAME.spec"
        exit 1
    fi

    mktar
    which rpmbuild > /dev/null 2>&1
    if [ $? -ne 0 ]; then
        echo "ERROR: rpmbuild is not available."
        exit 1
    fi
    RPMBUILDDIR=$TDIR/rpmbuild
    mkdir -p $RPMBUILDDIR/SOURCEDIR/
    mkdir -p $RPMBUILDDIR/SPECDIR/
    mkdir -p $RPMBUILDDIR/BUILDDIR/
    mkdir -p $RPMBUILDDIR/SRCRPMDIR/
    mkdir -p $RPMBUILDDIR/RPMDIR/
    echo "WORK: Building RPM package"
    cp $TARBALL.bz2 $RPMBUILDDIR/SOURCEDIR/
    cp $TDIR/$NAME.spec $RPMBUILDDIR/SPECDIR/
    rpmbuild --define "_sourcedir $RPMBUILDDIR/SOURCEDIR/" \
             --define "_specdir   $RPMBUILDDIR/SPECDIR/"   \
             --define "_builddir  $RPMBUILDDIR/BUILDDIR/"  \
             --define "_srcrpmdir $RPMBUILDDIR/SRCRPMDIR/" \
             --define "_rpmdir    $RPMBUILDDIR/RPMDIR/"    \
             --quiet -ba $RPMBUILDDIR/SPECDIR/$NAME.spec > $WORK_DIR/rpmbuild.log 2>&1
    if [ $? -ne 0 ]; then
        echo "ERROR: RPM build failed.  See log below."
        echo "======================================="
        cat $WORK_DIR/rpmbuild.log
        exit 1
    fi
    mv $RPMBUILDDIR/SRCRPMDIR/*.rpm $WORK_DIR/
    mv $RPMBUILDDIR/RPMDIR/*/*.rpm $WORK_DIR/
    for rpm in `ls *.rpm`; do
        echo "OUTPUT: created package $rpm" 
    done
}

### Parse Parameters
while [ $# -gt 0 ]; do
case $1 in
    --from-tag*)
        if [ "$1" != "${1##--from-tag=}" ]; then
            FROMTAG="${1##--from-tag=}"
        else
            FROMTAG="$2"
            shift
        fi
        ;;
    rpm|tar|tag|clean|version|debtar)
        MODE=$1
        ;;
    --release|--releaserpm|--test|--testrpm|--tag|--clean)
        echo "ERROR: -- options are removed."
        echo
        usage
        ;;
    *)
        [ -n "$1" ] && echo "ERROR: invalid argument: $1"
        exit 1
        ;;
esac
shift
done

if [ -z "$MODE" ]; then
    usage
fi

### Execute Command
case $MODE in
    rpm)
        buildrpm
        ;;
    tar)
        mktar
        ;;
    debtar)
        TARBALL_RELEASE="${NAME}_${VERSION}"
        TARBALL_EXT=orig.tar
        mktar
        ;;
    tag)
        srccheck
        tag
        ;;
    clean)
        clean
        ;;
    version)
        echo "$MKDST_VERSION"
        ;;
esac
   
rm -rf $TDIR
