#!/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