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