Author: Alex Badea <vampire@p16.pub.ro>
authorPerry Lorier <isomer@undernet.org>
Tue, 2 Apr 2002 05:00:10 +0000 (05:00 +0000)
committerPerry Lorier <isomer@undernet.org>
Tue, 2 Apr 2002 05:00:10 +0000 (05:00 +0000)
Log message:

Allows adding/removing patches that aren't part of ircu proper.

git-svn-id: file:///home/klmitch/undernet-ircu/undernet-ircu-svn/ircu2/trunk@698 c9e4aea6-c8fd-4c43-8297-357d70d61c8c

ircd-patch [new file with mode: 0755]

diff --git a/ircd-patch b/ircd-patch
new file mode 100755 (executable)
index 0000000..08818a8
--- /dev/null
@@ -0,0 +1,127 @@
+#!/bin/sh
+#
+# ircd-patch
+# Copyright (C) 2002 Alex Badea <vampire@p16.pub.ro>
+#
+# Experimental centralized patch system for ircu
+#
+
+DIFFS=patches/diffs
+MARKS=patches/marks
+
+PLIST=""
+for fname in $DIFFS/*.diff ; do
+       name=`basename $fname | sed -e 's/\.diff//'`
+       PLIST="$PLIST $name"
+done
+
+patch_list() {
+       echo "Available patches (* marks applied patches):"
+       for name in $PLIST ; do
+               [ -f $MARKS/$name ] && echo -n " * " || echo -n "   "
+               echo $name
+       done
+       echo "Done."
+}
+
+patch_test() {
+       echo "Testing patches:"
+       list="$*"
+       [ -z "$list" ] && list=$PLIST
+       for name in $list ; do
+               fname=$DIFFS/$name.diff
+               echo -n "  "
+               if [ ! -f $MARKS/$name ] ; then
+                       echo -n "        "
+                       if patch -p0 -N -t --dry-run >/dev/null < $fname ; then
+                               echo -n "     "
+                       else
+                               echo -n "fail "
+                       fi
+               else
+                       echo -n "applied "
+                       if patch -p0 -R -t --dry-run >/dev/null < $fname ; then
+                               echo -n "     "
+                       else
+                               echo -n "fail "
+                       fi
+               fi
+               echo " $name"
+       done
+       echo "Done."
+}
+
+patch_add() {
+       name=$1
+       fname="$DIFFS/$name.diff"
+       if [ ! -f $fname ]; then
+               echo "Patch $name ($fname) does not exist"
+               return 1
+       fi
+       if [ -f $MARKS/$name ] ; then
+               echo "Patch $name seems already applied"
+               return 1
+       fi
+       echo "Applying $fname..."
+       if patch -p0 -N -t < $fname ; then
+               touch $MARKS/$name
+               echo "Done."
+       else
+               echo "Failed."
+       fi
+}
+
+patch_del() {
+       name=$1
+       fname="$DIFFS/$name.diff"
+       if [ ! -f $fname ]; then
+               echo "Patch $name ($fname) does not exist"
+               return 1
+       fi
+       if [ ! -f $MARKS/$name ] ; then
+               echo "Patch $name doesn't seem to be applied"
+               return 1
+       fi
+       echo "Reversing $fname..."
+       if patch -p0 -R -t < $fname ; then
+               rm -f $MARKS/$name
+               echo "Done."
+       else
+               echo "Failed."
+       fi
+}
+
+do_help() {
+       echo "Usage: $0 [args]"
+       echo "Arguments may be:"
+       echo "  help              Prints this help"
+       echo "  list              List available patches"
+       echo "  test [patch list] Tests whether patches can be (un)applied correctly"
+       echo "  add  <patch list> Applies a patch"
+       echo "  del  <patch list> Reverses a patch"
+}
+
+case "$1" in
+       add)
+               shift
+               for name in $* ; do
+                       patch_add $name
+               done
+               ;;
+       del)
+               shift
+               for name in $* ; do
+                       patch_del $name
+               done
+               ;;
+       test)
+               shift
+               patch_test $*
+               ;;
+       list)
+               patch_list
+               ;;
+       *)
+               do_help
+               ;;
+esac