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 # Experimental centralized patch system for ircu
7 #
8
9 DIFFS=patches/diffs
10 MARKS=patches/marks
11
12 PLIST=""
13 for fname in $DIFFS/*.diff ; do
14         name=`basename $fname | sed -e 's/\.diff//'`
15         PLIST="$PLIST $name"
16 done
17
18 patch_list() {
19         echo "Available patches (* marks applied patches):"
20         for name in $PLIST ; do
21                 [ -f $MARKS/$name ] && echo -n " * " || echo -n "   "
22                 echo $name
23         done
24         echo "Done."
25 }
26
27 patch_test() {
28         echo "Testing patches:"
29         list="$*"
30         [ -z "$list" ] && list=$PLIST
31         for name in $list ; do
32                 fname=$DIFFS/$name.diff
33                 echo -n "  "
34                 if [ ! -f $MARKS/$name ] ; then
35                         echo -n "        "
36                         if patch -p0 -N -t --dry-run >/dev/null < $fname ; then
37                                 echo -n "     "
38                         else
39                                 echo -n "fail "
40                         fi
41                 else
42                         echo -n "applied "
43                         if patch -p0 -R -t --dry-run >/dev/null < $fname ; then
44                                 echo -n "     "
45                         else
46                                 echo -n "fail "
47                         fi
48                 fi
49                 echo " $name"
50         done
51         echo "Done."
52 }
53
54 patch_add() {
55         name=$1
56         fname="$DIFFS/$name.diff"
57         if [ ! -f $fname ]; then
58                 echo "Patch $name ($fname) does not exist"
59                 return 1
60         fi
61         if [ -f $MARKS/$name ] ; then
62                 echo "Patch $name seems already applied"
63                 return 1
64         fi
65         echo "Applying $fname..."
66         if patch -p0 -N -t < $fname ; then
67                 touch $MARKS/$name
68                 echo "Done."
69         else
70                 echo "Failed."
71         fi
72 }
73
74 patch_del() {
75         name=$1
76         fname="$DIFFS/$name.diff"
77         if [ ! -f $fname ]; then
78                 echo "Patch $name ($fname) does not exist"
79                 return 1
80         fi
81         if [ ! -f $MARKS/$name ] ; then
82                 echo "Patch $name doesn't seem to be applied"
83                 return 1
84         fi
85         echo "Reversing $fname..."
86         if patch -p0 -R -t < $fname ; then
87                 rm -f $MARKS/$name
88                 echo "Done."
89         else
90                 echo "Failed."
91         fi
92 }
93
94 do_help() {
95         echo "Usage: $0 [args]"
96         echo "Arguments may be:"
97         echo "  help              Prints this help"
98         echo "  list              List available patches"
99         echo "  test [patch list] Tests whether patches can be (un)applied correctly"
100         echo "  add  <patch list> Applies a patch"
101         echo "  del  <patch list> Reverses a patch"
102 }
103
104 case "$1" in
105         add)
106                 shift
107                 for name in $* ; do
108                         patch_add $name
109                 done
110                 ;;
111         del)
112                 shift
113                 for name in $* ; do
114                         patch_del $name
115                 done
116                 ;;
117         test)
118                 shift
119                 patch_test $*
120                 ;;
121         list)
122                 patch_list
123                 ;;
124         *)
125                 do_help
126                 ;;
127 esac