#!/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 .
# Written by Ian Beckwith 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