summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xdoc/shift-section.sh118
1 files changed, 118 insertions, 0 deletions
diff --git a/doc/shift-section.sh b/doc/shift-section.sh
new file mode 100755
index 0000000..9787189
--- /dev/null
+++ b/doc/shift-section.sh
@@ -0,0 +1,118 @@
+#! /usr/bin/env bash
+
+# Shift a section in the ODB manual. This is normally necessary when
+# you need to insert new content at a specific place. For example,
+# you may have sections 10.1 10.2, and 10.3 and you need to insert a
+# new 10.2 section and shift the old 10.2 to 10.3 and the old 10.3
+# to 10.4. To accomplish this, performs the following steps:
+#
+# 1. Commit or stage existing changes to the manual.
+# 2. Run 'shift-section.sh -p 10 -l 3 -h 3 manual.xhtml' Note that
+# you should always start from the last section you need to shift
+# and work your way backwards.
+# 3. Review the changes with diff or gitk, make sure the script didn't
+# mess up. Note that the script is KNOWN TO MESS UP sometimes so this
+# step if not optional. If everything is good, stage the changes and
+# repeat steps 2-3 for the next section.
+#
+# If you need to shift a lot of leaf sections (i.e., sections that do
+# not have sub-sections, then you can try to do the whole thing in one
+# step. However, catching script errors will be harder. For example:
+#
+# shift-section.sh -p 10.4 -l 8 -h 23 manual.xhtml
+#
+# -p <section-prefix>
+# -l <low-bound>
+# -h <high-bound>
+#
+
+function error ()
+{
+ echo "$*" 1>&2
+}
+
+prefix=
+low=
+high=
+usage="$0 -p <section-prefix> -l <low-bound> -h <high-bound> manual.xhtml"
+
+while [ $# -gt 0 ]; do
+ case $1 in
+ -p)
+ shift
+ prefix="$1"
+ shift
+ ;;
+ -l)
+ shift
+ low="$1"
+ shift
+ ;;
+ -h)
+ shift
+ high="$1"
+ shift
+ ;;
+ -*)
+ error "unknown option: $1"
+ exit 1
+ ;;
+ *)
+ break
+ ;;
+ esac
+done
+
+if [ "$low" = "" ]; then
+ error "low bound is not specified"
+ error $usage
+ exit 1
+fi
+
+if [ "$high" = "" ]; then
+ error "high bound is not specified"
+ error $usage
+ exit 1
+fi
+
+if [ "$1" = "" ]; then
+ error "document is not specified"
+ error $usage
+ exit 1
+fi
+
+for (( i=$high; i>=$low; i-- )); do
+
+ if [ "$prefix" != "" ]; then
+ old="$prefix."
+ new="$prefix."
+ fi
+
+ old="$old$i"
+ new="$new$((i+1))"
+
+ # Escape periods in the old section names.
+ #
+ eold=`echo $old | sed -e 's/\./\\\\./g'`
+
+ #echo "$eold"
+ #echo "$new"
+
+ sed -e 's/\([># "]\)'"$eold/\1$new/g" $1 >$1.shifted
+
+ if [ "$?" != 0 ]; then
+ rm -f $1.shifted
+ exit 1
+ fi
+
+ cmp -s $1 $1.shifted
+
+ if [ "$?" != 0 ]; then
+ mv $1.shifted $1
+ else
+ rm $1.shifted
+ error "document unchanged on step $old -> $new"
+ exit 1
+ fi
+
+done