1#!/bin/sh 2## 3## "dotest" is my stupid name for my patch-application script, which 4## I never got around to renaming after I tested it. We're now on the 5## second generation of scripts, still called "dotest". 6## 7## Update: Ryan Anderson finally shamed me into naming this "applymbox". 8## 9## You give it a mbox-format collection of emails, and it will try to 10## apply them to the kernel using "applypatch" 11## 12## applymbox [ -k ] [ -q ] (-c .dotest/msg-number | mail_archive) [Signoff_file]" 13## 14## The patch application may fail in the middle. In which case: 15## (1) look at .dotest/patch and fix it up to apply 16## (2) re-run applymbox with -c .dotest/msg-number for the current one. 17## Pay a special attention to the commit log message if you do this and 18## use a Signoff_file, because applypatch wants to append the sign-off 19## message to msg-clean every time it is run. 20 21. git-sh-setup-script|| die "Not a git archive" 22 23keep_subject= query_apply=continue= resume=t 24while case"$#"in0)break;;esac 25do 26case"$1"in 27-k) keep_subject=-k;; 28-q) query_apply=t ;; 29-c)continue="$2"; resume=f;shift;; 30-*) usage ;; 31*)break;; 32esac 33shift 34done 35 36case"$continue"in 37'') 38rm-rf .dotest 39mkdir .dotest 40 git-mailsplit"$1" .dotest ||exit1 41shift 42esac 43 44files=$(git-diff-cache --cached --name-only HEAD)||exit 45if["$files"];then 46echo"Dirty index: cannot apply patches (dirty:$files)">&2 47exit1 48fi 49 50case"$query_apply"in 51t)touch .dotest/.query_apply 52esac 53case"$keep_subject"in 54-k) : >.dotest/.keep_subject 55esac 56 57signoff="$1" 58set x .dotest/0* 59shift 60while case"$#"in0)break;;esac 61do 62 i="$1" 63case"$resume,$continue"in 64 f,$i) resume=t;; 65 f,*)continue;; 66*) 67 git-mailinfo$keep_subject \ 68 .dotest/msg .dotest/patch<$i>.dotest/info ||exit1 69 git-stripspace< .dotest/msg > .dotest/msg-clean 70;; 71esac 72while:;# for fixing up and retry 73do 74 git-applypatch .dotest/msg-clean .dotest/patch .dotest/info "$signoff" 75case"$?"in 760|2) 77# 2 is a special exit code from applypatch to indicate that 78# the patch wasn't applied, but continue anyway 79;; 80*) 81 ret=$? 82iftest -f .dotest/.query_apply 83then 84echo>&2"* Patch failed." 85echo>&2"* You could fix it up in your editor and" 86echo>&2" retry. If you want to do so, say yes here" 87echo>&2" AFTER fixing .dotest/patch up." 88echo>&2-n"Retry [y/N]? " 89read yesno 90case"$yesno"in 91[Yy]*) 92continue;; 93esac 94fi 95exit$ret 96esac 97break 98done 99shift 100done 101# return to pristine 102rm-fr .dotest