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