#!/bin/bash ## option defaults OPT_BRANCH="" OPT_DOCSDIR="" OPT_TAG="" OPT_KEYID="" TOPDIR="`dirname $0`/.." VER_H="${TOPDIR}/source/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 dopcumentation (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}" 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 source && ./script/mkversion.sh) if [ ! -f $VER_H ]; then exitOnError 1 "Failed to find ${VER_H}!" fi version=`grep SAMBA_VERSION_OFFICIAL_STRING $VER_H | awk '{print $3}'` vendor_version=`grep SAMBA_VERSION_VENDOR_SUFFIX $VER_H | awk '{print $3}'` if [ -n "$vendor_version" ]; then version="$version-$vendor_version" 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} packaging/bin/update-pkginfo ${version} 1 "" buildDocs exitOnError $? "Failed to build documentation" ( cd source && ./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 $?