Author: Alex Badea <vampire@p16.pub.ro>
[ircu2.10.12-pk.git] / ircd-patch
1 #!/bin/sh
2 #
3 # ircd-patch
4 # Copyright (C) 2002 Alex Badea <vampire@p16.pub.ro>
5 #
6 # $Id: ircd-patch,v 1.2 2002-04-02 09:42:32 isomer Exp $
7 #
8 # Experimental centralized patch system for ircu
9 #
10 # Return codes:
11 #   0 - success
12 #   1 - at least one live patch failed
13 #   2 - at least one simulation (dry run) failed 
14 #   3 - invalid arguments (i.e. no such patch)
15 #   4 - invalid operation (i.e. tried to apply when already applied)
16 #
17
18 DIFFS=patches/diffs
19 MARKS=patches/marks
20 retcode=0
21 force=0
22
23 [ ! -d $DIFFS ] && echo "*** Missing $DIFFS, creating it" ; mkdir -p $DIFFS
24 [ ! -d $MARKS ] && echo "*** Missing $MARKS, creating it" ; mkdir -p $MARKS
25
26 PLIST=""
27 for fname in $DIFFS/*.diff ; do
28         name=`basename $fname | sed -e 's/\.diff//'`
29         PLIST="$PLIST $name"
30 done
31
32 dry_run() {
33         patch -p0 -N -t --dry-run $2 >/dev/null < $1
34 }
35
36 patch_list() {
37         echo "Available patches (* marks applied patches):"
38         for name in $PLIST ; do
39                 [ -f $MARKS/$name ] && echo -n " * " || echo -n "   "
40                 echo $name
41         done
42         echo "Done."
43 }
44
45 patch_test() {
46         echo "Testing patches:"
47         list="$*"
48         [ -z "$list" ] && list=$PLIST
49         for name in $list ; do
50                 fname=$DIFFS/$name.diff
51                 echo -ne "  $name\t"
52                 if [ ! -f $MARKS/$name ] ; then
53                         if dry_run "$fname" ; then
54                                 echo -n " OK"
55                         else
56                                 echo -n " PATCH FAILED"
57                                 retcode=2
58                         fi
59                 else
60                         echo -n " APPLIED"
61                         if dry_run "$fname" -R ; then
62                                 echo -n " OK"
63                         else
64                                 echo -n " REVERSE FAILED"
65                                 retcode=2
66                         fi
67                 fi
68                 echo
69         done
70         echo "Done."
71 }
72
73 patch_add() {
74         name=$1
75         fname="$DIFFS/$name.diff"
76         if [ ! -f $fname ]; then
77                 echo "Patch $name ($fname) does not exist"
78                 retcode=3
79                 return
80         fi
81
82         if [ $force -lt 2 -a -f $MARKS/$name ] ; then
83                 echo "Patch $name seems already applied"
84                 retcode=4
85                 return
86         fi
87
88         if [ $force -lt 1 ]; then
89                 echo -n "Testing $fname... "
90                 if ! dry_run $fname ; then
91                         echo "Failed (use -f to force)."
92                         retcode=2
93                         return
94                 fi
95                 echo "seems ok."
96         fi
97
98         echo "Applying $fname..."
99         if patch -p0 -N -t < $fname ; then
100                 touch $MARKS/$name
101                 echo "Done."
102         else
103                 echo "Failed."
104                 retcode=1
105         fi
106 }
107
108 patch_del() {
109         name=$1
110         fname="$DIFFS/$name.diff"
111         if [ ! -f $fname ]; then
112                 echo "Patch $name ($fname) does not exist"
113                 retcode=3
114                 return
115         fi
116
117         if [ $force -lt 2 -a ! -f $MARKS/$name ] ; then
118                 echo "Patch $name doesn't seem to be applied"
119                 retcode=4
120                 return
121         fi
122
123         if [ $force -lt 1 ]; then
124                 echo -n "Testing $fname... "
125                 if ! dry_run $fname -R ; then
126                         echo "Failed (use -f to force)."
127                         retcode=2
128                         return
129                 fi
130                 echo "seems ok."
131         fi
132         
133         echo "Reversing $fname..."
134         if patch -p0 -R -t < $fname ; then
135                 rm -f $MARKS/$name
136                 echo "Done."
137         else
138                 echo "Failed."
139                 retcode=1
140         fi
141 }
142
143 do_help() {
144         echo "Usage: $0 [-f [-f]] [args]"
145         echo "Arguments may be:"
146         echo "  help                Prints this help"
147         echo "  list                List available patches"
148         echo "  test [patch list]   Tests whether patches can be (un)applied correctly"
149         echo "  add  <patch list>   Applies a patch"
150         echo "  del  <patch list>   Reverses a patch"
151         echo "The -f option forces patching even if a dry run fails (effective on 'add'"
152         echo "and 'del' commands only). Using it twice will also skip checking whether"
153         echo "a patch is already applied."
154 }
155
156 while [ "$1" == "-f" ]; do
157         force=$[$force + 1]
158         shift
159 done
160
161 case "$1" in
162         add)
163                 shift
164                 for name in $* ; do
165                         patch_add $name
166                 done
167                 ;;
168         del)
169                 shift
170                 for name in $* ; do
171                         patch_del $name
172                 done
173                 ;;
174         test)
175                 shift
176                 patch_test $*
177                 ;;
178         list)
179                 patch_list
180                 ;;
181         *)
182                 do_help
183                 ;;
184 esac
185
186 exit $retcode