#!/bin/sh accept_rerere=t generate=no update= diff= while case "$#,$1" in 0,*) break;; *,-*) ;; esac do case "$1" in -n) accept_rerere= ;; -d) update=${2?"diff with what?"} diff=yes generate=yes shift ;; -u) update=${2?"update what?"} generate=yes shift ;; *) generate=yes break ;; esac shift done case "$generate" in no) accept_rerere () { if test -z "$accept_rerere" then return 1 fi if git diff | grep -e "^.+" -e "^+." | grep -e "^..<<<<<<<" -e "^..=======" -e "^..>>>>>>>" >/dev/null then return 1 else EDITOR=: git commit -a --no-verify echo "Accepted previous resolution" return 0 fi } while read branch eh do case "$branch" in '#'*) continue ;; esac case "$eh" in "") save=$(git rev-parse --verify HEAD) echo >&2 "* $branch" git merge "$branch" || accept_rerere || exit this=$(git rev-parse --verify HEAD) if test "$this" = "$save" then : elif git show-ref -q --verify "refs/merge-fix/$branch" then git cherry-pick --no-commit "refs/merge-fix/$branch" && EDITOR=: git commit --amend -a fi ;; pick" "*) echo >&2 "* $eh" git cherry-pick "$branch" || exit ;; *) echo >&2 "Eh? $branch $eh"; exit ;; esac done exit esac if test -n "$update" && test $# = 0 then set x $(sed -n -e '2s/^# //p' <"$update") && shift fi # Generation (or updating) x40='[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]' x40="$x40$x40$x40$x40$x40$x40$x40$x40" LF=' ' show_merge () { case "$msg" in "Merge branch '"*"'"*) branch=$(expr "$msg" : "Merge branch '\(.*\)'") merge_hier=heads/ ;; "Merge remote branch '"*"'"*) branch=$(expr "$msg" : "Merge remote branch '\(.*\)'") merge_hier= ;; *) echo 2>&1 "Huh?: $msg" return ;; esac && tip=$(git rev-parse --verify "refs/$merge_hier$branch" 2>/dev/null) && merged=$(git name-rev --refs="refs/$merge_hier$branch" "$other" 2>/dev/null) && merged=$(expr "$merged" : "$x40 \(.*\)") && test "$merged" != undefined || { other=$(git log -1 --pretty='format:%s' $other) && merged="$branch :rebased? $other" } } show_pick () { merged="$(git rev-parse --verify "$commit") pick $msg" } generate () { PROGRAM=$1 shift echo '#!/bin/sh' echo "# $1" echo 'case "$#,$1" in' echo '1,-u|1,-d)' echo " exec $PROGRAM" '"$1" "$0"' echo 'esac' echo "$PROGRAM" '"$@" <<\EOF' git log --pretty=oneline --first-parent "$1" | { series= while read commit msg do if other=$(git rev-parse -q --verify "$commit^2") then show_merge else show_pick fi if test -z "$series" then series="$merged" else series="$merged$LF$series" fi done echo "$series" } echo EOF } if test -z "$update" then generate "$0" "$@" elif test -z "$diff" then generate "$0" "$@" | diff -u "$update" - if test $? = 0 then echo >&2 "No changes." else echo >&2 -n "Update [Y/n]? " read yesno case "$yesno" in [Yy]*) generate "$0" "$@" | sed -e 's/ :rebased?.*//' >"$update" ;; *) echo >&2 "No update then." ;; esac fi else generate "$0" "$@" | diff -u "$update" - fi