lhttpc / util / releaser

#!/bin/sh
# ----------------------------------------------------------------------------
# Copyright (c) 2009, Erlang Training and Consulting Ltd.
# All rights reserved.
# 
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#    * Redistributions of source code must retain the above copyright
#      notice, this list of conditions and the following disclaimer.
#    * Redistributions in binary form must reproduce the above copyright
#      notice, this list of conditions and the following disclaimer in the
#      documentation and/or other materials provided with the distribution.
#    * Neither the name of Erlang Training and Consulting Ltd. nor the
#      names of its contributors may be used to endorse or promote products
#      derived from this software without specific prior written permission.
# 
# THIS SOFTWARE IS PROVIDED BY Erlang Training and Consulting Ltd. ''AS IS''
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL Erlang Training and Consulting Ltd. BE
# LIABLE SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
# BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
# ----------------------------------------------------------------------------
# Script for making a release of lhttpc. Or any program in hg really. Check
# the Makefile target release for how to use it.

NAME=$1
VSN=$2

yesno() {
    prompt=$1
    while true; do
        read -p "$1 [Y/n] " answer
        case "x$answer" in
            "x")
            return 0
            ;;
            "xY")
            return 0
            ;;
            "xy")
            return 0
            ;;
            "xN")
            return 1
            ;;
            "xn")
            return 1
            ;;
            *)
            ;;
        esac
    done
}

get_version() {
    while true; do
        read -p "What is the version of the release? [$VSN] " release_vsn

        if [ "$release_vsn" = "" ]; then
            release_vsn=$VSN
        fi

        if $(echo "$TAGS" | grep -q "^$release_vsn\$"); then
            if yesno "A tag exists for version $release_vsn, is this correct?"; then
                break
            fi
        else
            if yesno "A tag doesn't exist for version $release_vsn, should one be created?"; then
                hg tag $release_vsn
            fi
            break
        fi
    done
    echo $release_vsn
}

if ! hg identify 1>/dev/null 2>&1; then
    echo "No hg repository here..."
    exit 1
fi

if ! [ "$(hg identify | awk '{print $2};')" = "tip" ]; then
    if ! yesno "Repository is not at tip, do you want to continue?"; then
        exit 1
    fi
fi

if ! yesno "Did the compilation run without warnings?"; then
    "Try again..."
    exit 1
fi

if ! yesno "Is the changelog up to date?"; then
    "Try again..."
    exit 1
fi

if ! yesno "Did dialyzer run without warnings?"; then
    "Try again..."
    exit 1
fi

TAGS=$(hg tags | awk '{print $1 };' | grep -v "^tip$")
LATEST_TAG=$(echo "$TAGS" | head -n 1)

RELEASE_VSN=$(get_version)
echo "Creating a release for $NAME-$RELEASE_VSN now."
archive="./$NAME-$RELEASE_VSN.tar.gz"
if [ -e $archive ]; then
    echo "$archive exists, giving up."
    exit 1
fi
hg archive -t tgz -X ".hg*" $archive
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.