#!/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