1#!/usr/bin/env bash 2BASE=$1; shift 3 4usage() { 5 echo "Usage: $0 NNN <file>..." 6 exit 1 7} 8 9check_number() { 10 case "$1" in 11 [0-9][0-9][0-9]) return 0;; 12 esac 13 return 1; 14} 15 16patch_header() 17{ 18 awk ' 19 /^(---|\*\*\*|Index:)[ \t][^ \t]|^diff -/ \ 20 { exit } 21 { print } 22 ' 23} 24 25strip_diffstat() 26{ 27 awk ' 28 /#? .* \| / \ 29 { eat = eat $0 "\n" 30 next } 31 /^#? .* files? changed(, .* insertions?\(\+\))?(, .* deletions?\(-\))?/ \ 32 { eat = "" 33 next } 34 { print eat $0 35 eat = "" } 36 ' 37} 38 39strip_trailing_whitespace() { 40 sed -e 's:[ '$'\t'']*$::' 41} 42 43fixup_header() { 44 awk ' 45 /^From / { next } 46 /^Subject: / { 47 sub("Subject: \\[[^\]]*\\]", "Subject: [PATCH]") 48 } 49 { print } 50 ' 51} 52 53check_number "$BASE" || usage 54 55quilt series > /dev/null || { 56 echo "Not in quilt directory" 57 exit 2 58} 59 60get_next() { 61 NEW=$BASE 62 quilt series | while read CUR; do 63 [ -n "$CUR" ] || break 64 CUR=${CUR%%-*} 65 check_number "$CUR" || continue 66 [ "$CUR" -lt "$NEW" ] && continue 67 [ "$CUR" -ge "$(($BASE + 100))" ] && continue 68 NEW="$(($CUR + 1))" 69 echo $NEW 70 done | tail -n1 71} 72 73CUR=`get_next` 74CUR="${CUR:-$BASE}" 75 76while [ -n "$1" ]; do 77 FILE="$1"; shift 78 NAME="$(basename $FILE)" 79 NAME="${NAME#[0-9]*-}" 80 echo -n "Processing patch $NAME: " 81 82 [ -e "$FILE" ] || { 83 echo "file $FILE not found" 84 exit 1 85 } 86 87 grep -qE "$NAME$" patches/series && { 88 echo "already applied" 89 continue 90 } 91 92 quilt new "$CUR-$NAME" || exit 1 93 patch_header < "$FILE" | 94 strip_diffstat | 95 strip_trailing_whitespace | 96 fixup_header > "patches/$CUR-$NAME" 97 98 quilt fold < "$FILE" || { 99 cp "$FILE" ./cur_patch 100 echo "patch $FILE failed to apply, copied to ./cur_patch" 101 exit 1 102 } 103 104 quilt refresh -p ab --no-index --no-timestamps 105 106 CUR="$(($CUR + 1))" 107done 108 109exit 0 110