1#! /bin/sh 2 3# Script to tell whether a patch has been applied to a tree or not. 4# Assume patch is in diff -u form, and applies in dir with -p1. 5 6if [ $# != 2 ] || [ ! -d $1 ] || [ ! -f $2 ] 7then 8 echo Need directory and patch. >&2 9 exit 1 10fi 11 12# Convert $2 to absolute. 13case "$2" 14in 15 /*) PATCH="$2" ;; 16 *) PATCH="`pwd`/$2" ;; 17esac 18 19[ -d tmp-isapplied ] && rm -rf tmp-isapplied 20 21# Copy only files which are mentioned in patch. 22# eg. +++ working-2.4.0-test11-5/net/ipv4/netfilter/ipt_MASQUERADE.c Fri Dec 1 17:56:02 2000 23mkdir tmp-isapplied 24for f in `grep '^+++ ' $2 | cut -d/ -f2- | cut -d' ' -f1` 25do 26 mkdir -p `dirname tmp-isapplied/$f` 2>/dev/null 27 cp $1/$f tmp-isapplied/$f 2>/dev/null 28done 29 30cd tmp-isapplied || (echo Can\'t change into tmp-isapplied >&2; exit 1) 31 32MISSING_FILES=`patch -R -s -f -p1 < $PATCH | grep "No file to patch" | wc -l` 33 34REJECTS="`find . -name '*.rej' -exec cat {} \; | grep -c '^\*\*\* '`" 35HUNKS="`grep -c ^@@ $PATCH`" 36 37if [ "$MISSING_FILES" -ne 0 ] 38then 39 echo `basename $PATCH` NOT APPLIED \($MISSING_FILES missing files\) 40 cd .. && rm -rf tmp-isapplied 41 exit 1 42elif [ `expr $REJECTS \* 2` -gt $HUNKS ] 43then 44 echo `basename $PATCH` NOT APPLIED \($REJECTS rejects out of $HUNKS hunks\) 45 cd .. && rm -rf tmp-isapplied 46 exit 1 47else 48 echo `basename $PATCH` ALREADY APPLIED \($REJECTS rejects out of $HUNKS hunks\). 49 cd .. && rm -rf tmp-isapplied 50 exit 0 51fi 52