#!/bin/bash

## option defaults
OPT_BRANCH=""
OPT_DOCSDIR=""
OPT_TAG=""
OPT_KEYID=""

TOPDIR="`dirname $0`/.."
VER_H="${TOPDIR}/source3/include/version.h"

function exitOnError
{
    local _error="$1"
    local _msg="$2"

    if [ ${_error} -eq 0 ]; then
	return 0
    fi

    echo "FAILURE: ${_msg}"
    exit ${_error}
}

##
## Print help usage
##

function printUsage
{
    echo "Usage $0 [options]"
    echo "    --help             Print command usage"
    echo "    --branch <name>    Specify the branch to to create the archive file from"
    echo "    --copy-docs <dir>  Copy documentation from <dir> rather than building"
    echo "    --tag <name>       Tag name for release"
    echo "    --keyid <email>    The GnuPG key ID used to sign the release tag"
    echo ""
}

##
## Parse the command line options
##

function parseOptions
{
    while [ -n "$1" ]; do
	case "$1" in
	    --help)
		printUsage
		exit 0
		;;
	    --branch)
		shift
		if [ -z "$1" ]; then
		    printUsage
		    return 1
		fi
		OPT_BRANCH="$1"
		shift
		;;
	    --copy-docs)
		shift
		if [ -z "$1" ]; then
		    printUsage
		    return 1
		fi
		OPT_DOCSDIR="$1"
		shift
		;;
	    --tag)
		shift
		if [ -z "$1" ]; then
		    printUsage
		    return 1
		fi
		OPT_TAG="$1"
		shift
		;;
	    --keyid)
		shift
		if [ -z "$1" ]; then
		    printUsage
		    return 1
		fi
		OPT_KEYID="$1"
		shift
		;;
	    *)
		printUsage
		return 1
		;;
	esac
    done

    if [ -z "${OPT_BRANCH}" ]; then
	echo "You must specify a branch name!"
	printUsage
	return 1
    fi
}

##
## Build the documentation (may be a no-op)
##

function buildDocs
{
    if [ -n "${OPT_DOCSDIR}" ]; then
	if [ ! -d "${OPT_DOCSDIR}" ]; then
	    exitOnError 1 "${OPT_DOCSDIR} does not exist.  Please specify the absolute path."
	fi

	mkdir docs
	exitOnError $? "Failed to create docs directory"

	rsync -av "${OPT_DOCSDIR}"/ docs/
	exitOnError $? "Failed top copy docs from ${OPT_DOCSDIR}"

	cd docs/
	/bin/rm -rf test.pdf Samba4*pdf htmldocs/Samba4* htmldocs/test
	if [ -d manpages-3 ]; then
		mv manpages-3 manpages
	fi
	if [ -d htmldocs/manpages-3 ]; then
		mv htmldocs/manpages-3 htmldocs/manpages
	fi
	# Sync thanks, history and registry/ into the docs dir
	rsync -Ca --exclude=.svn ../../$OPT_BRANCH/docs-xml/registry ../docs/
	rsync -Ca --exclude=.svn ../../$OPT_BRANCH/docs-xml/archives/ ../docs/
	cd ../

	return 0
    fi

    echo "Building documentation.  This may take a while.  Log file in /tmp/docs-build.log.$$"

    ${TOPDIR}/release-scripts/build-docs 2> /tmp/docs-build.log.$$
    return $?

}


##
## Create a release tag
##
function createReleaseTag
{
    if [ -z "${OPT_TAG}" ]; then
	echo "Tagging disabled"
	return 0
    fi

    if [ "x`git tag -l ${OPT_TAG}`" != "x" ]; then
	echo -n "Tag exists.  Do you wish to overwrite? (y/N): "
	read answer

	if [ "x$answer" != "xy" ]; then
      	    echo "Tag creation aborted."
	    exit 1
	fi
    fi

    if [ -z "${OPT_KEYID}" ]; then
	echo -n "Enter the keyid:"
	read OPT_KEYID
	if [ -z "${OPT_KEYID}" ]; then
	    exitOnError 1 "No keyid specified"
	fi
    fi

    git tag -u ${OPT_KEYID} ${OPT_TAG}
    exitOnError $? "Failed to create tag"

    return 0
}
##
## Main driver
##
function main
{
    parseOptions "$@"
    exitOnError $? "Failed to parse options"

    cd $TOPDIR

    git checkout ${OPT_BRANCH}
    exitOnError $? "Invalid branch name \"${OPT_BRANCH}\""

    (cd source3 && ./script/mkversion.sh)
    if [ ! -f $VER_H ]; then
	exitOnError 1 "Failed to find ${VER_H}!"
    fi

    version=`grep "define SAMBA_VERSION_OFFICIAL_STRING" $VER_H | awk '{print $3}'`
    vendor_version=`grep "define SAMBA_VERSION_VENDOR_SUFFIX" $VER_H | awk '{print $3}'`
    if [ -n "$vendor_version" ]; then
	version="$version-$vendor_version"
    fi
    vendor_patch=`grep "define SAMBA_VERSION_VENDOR_PATCH_STRING" $VER_H | awk '{print $3}'`
    if [ -n "$vendor_patch" ]; then
	version="$version-$vendor_patch"
    fi
    version=`echo $version | sed 's/\"//g'`

    echo "Creating release tarball for Samba $version"

    /bin/rm -rf ../samba-${version}
    git archive --format=tar --prefix=samba-${version}/ HEAD | (cd .. && tar xf -)
    exitOnError $? "Failed to create release directory tree"

    pushd ../samba-${version}

    # Remove RFCs as they are non-free content (with a strict interpretation of
    # the DFSG)

    if [ -d source4 ]; then
	echo "Removing RFCs"
	find source4/ -name "rfc*.txt" -exec rm -f {} \;
	rm -f source4/ldap_server/devdocs/draft-armijo-ldap-syntax-00.txt
	rm -f source4/ldap_server/devdocs/ldapext-ldapv3-vlv-04.txt
    fi

    packaging/bin/update-pkginfo ${version} 1 ""

    buildDocs
    exitOnError $? "Failed to build documentation"

    ( cd source3 && ./autogen.sh )

    cd ..
    tar cf samba-${version}.tar --exclude=.git* --exclude=CVS --exclude=.svn samba-${version}
    exitOnError $? "Failed to create tarball from git tree"

    gpg --detach-sign --armor samba-${version}.tar
    ## exitOnError $? "Failed to sign tarball"

    gzip -9 samba-${version}.tar
    exitOnError $? "Failed to compress archive"

    popd

    createReleaseTag
    exitOnError $? "Failed to create release tag"

    return 0
}

main "$@"
exit $?