#!/bin/bash mode=$1 shift help() { echo "" echo "Usage: $0 co patch file" echo " $0 ci patch file" echo "" echo " $0 joe file" echo " $0 vim file" echo "" echo " $0 ed patch [file]" echo "" echo " $0 filter patch command" echo "" exit 1 } case "$mode" in joe) file="${1%.rej}" joe $file{,.rej} ;; vim) file="${1%.rej}" vim -o $file{,.rej} ;; ed) if [ -n "$2" ]; then $0 co "$1" "$2" $0 vim "$2" $0 ci "$1" "$2" else cp "$1" "$1.fixed"; vim "$1.fixed" diff -u "$1" "$1.fixed" > "$(dirname $1)/fixdiff_$(basename $1).part" touch "$(dirname $1)/fixdiff_$(basename $1)" mv "$(dirname $1)/$(basename $1).fixed" "$1" combinediff "$(dirname $1)/fixdiff_$(basename $1)" \ "$(dirname $1)/fixdiff_$(basename $1).part" \ > "$(dirname $1)/fixdiff_$(basename $1).new" mv "$(dirname $1)/fixdiff_$(basename $1).new" \ "$(dirname $1)/fixdiff_$(basename $1)" rm -f "$(dirname $1)/fixdiff_$(basename $1).part" fi ;; co) patch=$1; shift if [ ! -f "$patch" ] || [ $# -ne 1 ]; then help; fi for x; do x="${x%.rej}" rm -f "$x".{orig,rej} if [ -f "$x" ]; then cp "$x" "$x.orig" else touch "$x.orig"; fi filterdiff -i "$x" "$patch" | patch -p0 done ;; ci) patch=$1; shift if [ ! -f "$patch" ] || [ $# -ne 1 ]; then help; fi { gotit="" awk '/^--- / { exit; } { print; }' < "$patch" while read f; do thisisnew=0 for x; do x="${x%.rej}" if [ "$f" = "$x" ]; then thisisnew=1; fi done if [ "$thisisnew" = "0" ]; then filterdiff -i "$f" "$patch" else filterdiff -i "$f" $patch | head -n 2 diff -u "$x.orig" "$x" | tail -n +3 gotit="$gotit $f " fi done < <( lsdiff "$patch" ) for x; do x="${x%.rej}" if [ -n "${gotit##* $x *}" ]; then diff -u "$x.orig" "$x" fi done } > "$patch.fixed" diff -u "$patch" "$patch.fixed" \ > "$(dirname $patch)/fixdiff_$(basename $patch).part" touch "$(dirname $patch)/fixdiff_$(basename $patch)" mv "$patch.fixed" "$patch" combinediff "$(dirname $patch)/fixdiff_$(basename $patch)" \ "$(dirname $patch)/fixdiff_$(basename $patch).part" \ > "$(dirname $patch)/fixdiff_$(basename $patch).new" mv "$(dirname $patch)/fixdiff_$(basename $patch).new" \ "$(dirname $patch)/fixdiff_$(basename $patch)" rm -f "$(dirname $patch)/fixdiff_$(basename $patch).part" for x; do x="${x%.rej}" rm -f "$x.rej" mv "$x.orig" "$x" done ;; filter) eval "$2" < "$1" > "$1.fixed" diff -u "$1" "$1.fixed" > "$(dirname $1)/fixdiff_$(basename $1).part" touch "$(dirname $1)/fixdiff_$(basename $1)" mv "$1.fixed" "$1" combinediff "$(dirname $1)/fixdiff_$(basename $1)" \ "$(dirname $1)/fixdiff_$(basename $1).part" \ > "$(dirname $1)/fixdiff_$(basename $1).new" mv "$(dirname $1)/fixdiff_$(basename $1).new" \ "$(dirname $1)/fixdiff_$(basename $1)" rm -f "$(dirname $1)/fixdiff_$(basename $1).part" ;; *) help ;; esac