| #!/usr/bin/env bash |
| BASE=$1; shift |
| |
| usage() { |
| echo "Usage: $0 NNN <file>..." |
| exit 1 |
| } |
| |
| check_number() { |
| case "$1" in |
| [0-9][0-9][0-9]) return 0;; |
| esac |
| return 1; |
| } |
| |
| patch_header() |
| { |
| awk ' |
| /^(---|\*\*\*|Index:)[ \t][^ \t]|^diff -/ \ |
| { exit } |
| { print } |
| ' |
| } |
| |
| strip_diffstat() |
| { |
| awk ' |
| /#? .* \| / \ |
| { eat = eat $0 "\n" |
| next } |
| /^#? .* files? changed(, .* insertions?\(\+\))?(, .* deletions?\(-\))?/ \ |
| { eat = "" |
| next } |
| { print eat $0 |
| eat = "" } |
| ' |
| } |
| |
| strip_trailing_whitespace() { |
| sed -e 's:[ '$'\t'']*$::' |
| } |
| |
| fixup_header() { |
| awk ' |
| /^From / { next } |
| /^Subject: / { |
| sub("Subject: \\[[^\]]*\\]", "Subject: [PATCH]") |
| } |
| { print } |
| ' |
| } |
| |
| check_number "$BASE" || usage |
| |
| quilt series > /dev/null || { |
| echo "Not in quilt directory" |
| exit 2 |
| } |
| |
| get_next() { |
| NEW=$BASE |
| quilt series | while read CUR; do |
| [ -n "$CUR" ] || break |
| CUR=${CUR%%-*} |
| check_number "$CUR" || continue |
| [ "$CUR" -lt "$NEW" ] && continue |
| [ "$CUR" -ge "$(($BASE + 100))" ] && continue |
| NEW="$(($CUR + 1))" |
| echo $NEW |
| done | tail -n1 |
| } |
| |
| CUR=$(get_next) |
| CUR="${CUR:-$BASE}" |
| |
| while [ -n "$1" ]; do |
| FILE="$1"; shift |
| NAME="$(basename $FILE)" |
| NAME="${NAME#[0-9]*-}" |
| echo -n "Processing patch $NAME: " |
| |
| [ -e "$FILE" ] || { |
| echo "file $FILE not found" |
| exit 1 |
| } |
| |
| grep -qE "$NAME$" patches/series && { |
| echo "already applied" |
| continue |
| } |
| |
| quilt new "$CUR-$NAME" || exit 1 |
| patch_header < "$FILE" | |
| strip_diffstat | |
| strip_trailing_whitespace | |
| fixup_header > "patches/$CUR-$NAME" |
| |
| quilt fold < "$FILE" || { |
| cp "$FILE" ./cur_patch |
| echo "patch $FILE failed to apply, copied to ./cur_patch" |
| exit 1 |
| } |
| |
| quilt refresh -p ab --no-index --no-timestamps |
| |
| CUR="$(($CUR + 1))" |
| done |
| |
| exit 0 |