| #!/bin/sh | |
| afresh () { | |
| URL="${1?URL}" | |
| shift | |
| if test $# != 0 | |
| then | |
| branch="$1" | |
| shift | |
| fi | |
| if test $# = 1 | |
| then | |
| git checkout --detach "$1" | |
| shift | |
| elif git symbolic-ref -q HEAD | |
| then | |
| echo >&2 "HEAD not detached" | |
| exit 1 | |
| fi | |
| if test $# != 0 | |
| then | |
| echo >&2 "$0 URL topic-name [base]" | |
| exit 1 | |
| fi | |
| b4 am -o- -t "$URL" | | |
| tee ./+b4am.mbx | | |
| git am -s3 && rm -f ./+b4am.mbx | |
| status=$? | |
| if test $status = 0 && test -n "$branch" | |
| then | |
| git checkout -b "$branch" | |
| fi | |
| exit $? | |
| } | |
| redo_or_afresh () { | |
| if git show-ref --quiet --verify "refs/heads/$1" | |
| then | |
| git checkout "$1" || exit | |
| return | |
| else | |
| afresh "$@" | |
| return | |
| fi | |
| } | |
| force= | |
| while case "$#" in 0) break;; esac | |
| do | |
| case "$1" in | |
| -f | --force) | |
| force=--force ;; | |
| -*) | |
| echo >&2 "$0: unknown option '$1'" | |
| exit 1 ;; | |
| *) | |
| break ;; | |
| esac | |
| shift | |
| done | |
| case $# in | |
| 0) : happy ;; | |
| 1|2|3) redo_or_afresh "$@" ;; | |
| *) echo >&2 "$0: extra arguments" ;; | |
| esac | |
| above_master=$(git rev-list --first-parent master.. | wc -l) | |
| above_next=$(git rev-list --first-parent next.. | wc -l) | |
| if test "$above_master" != "$above_next" | |
| then | |
| if test "$force" = "--force" | |
| then | |
| echo >&2 warning: some patches are already in next | |
| else | |
| echo >&2 fatal: some patches are already in next | |
| exit 1 | |
| fi | |
| fi | |
| MID= | |
| OLD=$(git rev-parse HEAD) | |
| git detach ${force+--force} || exit | |
| git rev-list HEAD..$OLD | | |
| while read commit | |
| do | |
| git notes --ref=amlog show $commit | |
| done | | |
| sed -n -e '/^Message-Id: /{ | |
| s///p | |
| q | |
| }' | | |
| xargs -n1 b4 am -o- -T | | |
| tee ./+b4am.mbx | | |
| git am -s3 && rm -f ./+b4am.mbx || exit $? | |
| git range-diff --notes=amlog --crea=999 @{-1}... | |
| echo -n >&2 "Update [y/n]? " | |
| while read yesno | |
| do | |
| case "$yesno" in | |
| [Yy]*) | |
| git co -B @{-1} | |
| exit 0 | |
| ;; | |
| [Nn]*) | |
| exit 1 | |
| ;; | |
| esac | |
| done |