#!/bin/sh
# stable-cherry-pick -- Cherry-pick commits into current branch and
#   log them to NEWS.stable. See STABLE-HOWTO for more info,
#   also at http://erislabs.net/projects/gnulib/STABLE-HOWTO.html

# Copyright (C) 2009-2010 Free Software Foundation, Inc.

# 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 3 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 General Public License for more details.

# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

# Written by Ian Beckwith <ianb@erislabs.net> 20091114

PROGNAME="$(basename "$0")"
NEXTCOMMITMARKER="__NEXTCOMMITMARKER__"
NEWS="NEWS.stable"
TMP="$NEWS.tmp"

warn ()
{
    echo "$PROGNAME: $1"
    shift
    while [ $# -gt 0 ]; do
	echo " $1"
	shift
    done
}

fail ()
{
    warn "$@"
    exit 1
}

if [ $# -ne 1 ]; then
    echo "usage: $PROGNAME COMMIT-ID"
    echo " cherry-picks COMMIT-ID into current branch and logs it to $NEWS"
    exit 1
fi

COMMIT="$1"
git show "$COMMIT" > /dev/null 2>&1
if [ $? -ne 0 ];then
    fail "commit $COMMIT not found"
fi

SHORTCOMMIT="$(git log -1 --format=%h "$COMMIT")"
SUBJECT="$(git log -1 --format=%s "$COMMIT")"
CHERRYOUT="$(git cherry-pick -x "$COMMIT")"
CHERRYRES=$?
echo "$CHERRYOUT"
if [ $CHERRYRES -ne 0 ];then
     warn "cherry-pick failed, logging without new commit-id." \
	  "Resolve conflicts, commit then add new commit-id to ${NEWS}."
     CHERRYSHORTCOMMIT=""
else
    CHERRYFULLCOMMIT=$(echo "$CHERRYOUT" | grep '^\[[^ ]\+ [a-fA-F0-9]\+\] ' |sed 's/^\[[^ ]\+ \([a-fA-F0-9]\+\)\].*/\1/;')
    CHERRYSHORTCOMMIT="$(git log -1 --format=%h "$CHERRYFULLCOMMIT")"
fi

MESSAGE="[$SHORTCOMMIT]->[$CHERRYSHORTCOMMIT] $SUBJECT"
echo "    * $MESSAGE"

if [ ! -f "$NEWS" ]; then
    fail "$NEWS not found, not logging"
fi

if ! grep -q "$NEXTCOMMITMARKER" "$NEWS"; then
    fail "commit marker $NEXTCOMMITMARKER not found in ${NEWS}, not logging"
fi

sed "/$NEXTCOMMITMARKER/Q" < "$NEWS" > "$TMP"

echo "    * $MESSAGE" >> "$TMP"

sed -n  "/$NEXTCOMMITMARKER/,\$p" < "$NEWS" >> "$TMP"

mv "$TMP" "$NEWS"

if [ $? -ne 0 ]; then
    fail "failed to rename $TMP to $NEWS"
fi

# If cherry-pick succeeded, commit changes to $NEWS
if [ -n "$CHERRYSHORTCOMMIT" ]; then
    git add "$NEWS"
    git commit -m "$NEWS: log cherry-pick $MESSAGE"
fi
