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 [-u] [-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|| die "Not a git archive" 22 23usage () { 24echo>&2"applymbox [-u] [-k] [-q] (-c .dotest/<num> | mbox) [signoff]" 25exit1 26} 27 28keep_subject= query_apply=continue= utf8= resume=t 29while case"$#"in0)break;;esac 30do 31case"$1"in 32-u) utf8=-u;; 33-k) keep_subject=-k;; 34-q) query_apply=t ;; 35-c)continue="$2"; resume=f;shift;; 36-*) usage ;; 37*)break;; 38esac 39shift 40done 41 42case"$continue"in 43'') 44rm-rf .dotest 45mkdir .dotest 46 git-mailsplit"$1" .dotest ||exit1 47shift 48esac 49 50files=$(git-diff-index --cached --name-only HEAD)||exit 51if["$files"];then 52echo"Dirty index: cannot apply patches (dirty:$files)">&2 53exit1 54fi 55 56case"$query_apply"in 57t)touch .dotest/.query_apply 58esac 59case"$keep_subject"in 60-k) : >.dotest/.keep_subject 61esac 62 63signoff="$1" 64set x .dotest/0* 65shift 66while case"$#"in0)break;;esac 67do 68 i="$1" 69case"$resume,$continue"in 70 f,$i) resume=t;; 71 f,*)shift 72continue;; 73*) 74 git-mailinfo$keep_subject $utf8 \ 75 .dotest/msg .dotest/patch<$i>.dotest/info ||exit1 76 git-stripspace< .dotest/msg > .dotest/msg-clean 77;; 78esac 79while:;# for fixing up and retry 80do 81 git-applypatch .dotest/msg-clean .dotest/patch .dotest/info "$signoff" 82case"$?"in 830|2) 84# 2 is a special exit code from applypatch to indicate that 85# the patch wasn't applied, but continue anyway 86;; 87*) 88 ret=$? 89iftest -f .dotest/.query_apply 90then 91echo>&2"* Patch failed." 92echo>&2"* You could fix it up in your editor and" 93echo>&2" retry. If you want to do so, say yes here" 94echo>&2" AFTER fixing .dotest/patch up." 95echo>&2-n"Retry [y/N]? " 96read yesno 97case"$yesno"in 98[Yy]*) 99continue;; 100esac 101fi 102exit$ret 103esac 104break 105done 106shift 107done 108# return to pristine 109rm-fr .dotest