git/git-applymbox.sh
Junio C Hamano 4ebe63dfe6 Clean mail files after dealing with them.
When you are applying 200 mails in sequence, .dotest/ directory
will be littered with many messsages, and when the patch in one
of them fails to apply, it is not obvious which message was
being processed.  Remove the one that has been already dealt
with, so that the last failed one is found typically as the
lowest numbered split message.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2005-10-06 14:25:52 -07:00

116 lines
2.7 KiB
Bash
Executable File

#!/bin/sh
##
## "dotest" is my stupid name for my patch-application script, which
## I never got around to renaming after I tested it. We're now on the
## second generation of scripts, still called "dotest".
##
## Update: Ryan Anderson finally shamed me into naming this "applymbox".
##
## You give it a mbox-format collection of emails, and it will try to
## apply them to the kernel using "applypatch"
##
## The patch application may fail in the middle. In which case:
## (1) look at .dotest/patch and fix it up to apply
## (2) re-run applymbox with -c .dotest/msg-number for the current one.
## Pay a special attention to the commit log message if you do this and
## use a Signoff_file, because applypatch wants to append the sign-off
## message to msg-clean every time it is run.
. git-sh-setup || die "Not a git archive"
usage () {
echo >&2 "applymbox [-u] [-k] [-q] [-m] (-c .dotest/<num> | mbox) [signoff]"
exit 1
}
keep_subject= query_apply= continue= utf8= resume=t
while case "$#" in 0) break ;; esac
do
case "$1" in
-u) utf8=-u ;;
-k) keep_subject=-k ;;
-q) query_apply=t ;;
-c) continue="$2"; resume=f; shift ;;
-m) fallback_3way=t ;;
-*) usage ;;
*) break ;;
esac
shift
done
case "$continue" in
'')
rm -rf .dotest
mkdir .dotest
git-mailsplit "$1" .dotest || exit 1
shift
esac
files=$(git-diff-index --cached --name-only HEAD) || exit
if [ "$files" ]; then
echo "Dirty index: cannot apply patches (dirty: $files)" >&2
exit 1
fi
case "$query_apply" in
t) touch .dotest/.query_apply
esac
case "$fall_back_3way" in
t) : >.dotest/.3way
esac
case "$keep_subject" in
-k) : >.dotest/.keep_subject
esac
signoff="$1"
set x .dotest/0*
shift
while case "$#" in 0) break;; esac
do
i="$1"
case "$resume,$continue" in
f,$i) resume=t;;
f,*) shift
continue;;
*)
git-mailinfo $keep_subject $utf8 \
.dotest/msg .dotest/patch <$i >.dotest/info || exit 1
git-stripspace < .dotest/msg > .dotest/msg-clean
;;
esac
while :; # for fixing up and retry
do
git-applypatch .dotest/msg-clean .dotest/patch .dotest/info "$signoff"
case "$?" in
0)
# Remove the cleanly applied one to reduce clutter.
rm -f .dotest/$i
;;
2)
# 2 is a special exit code from applypatch to indicate that
# the patch wasn't applied, but continue anyway
;;
*)
ret=$?
if test -f .dotest/.query_apply
then
echo >&2 "* Patch failed."
echo >&2 "* You could fix it up in your editor and"
echo >&2 " retry. If you want to do so, say yes here"
echo >&2 " AFTER fixing .dotest/patch up."
echo >&2 -n "Retry [y/N]? "
read yesno
case "$yesno" in
[Yy]*)
continue ;;
esac
fi
exit $ret
esac
break
done
shift
done
# return to pristine
rm -fr .dotest