1 1.1 christos #!/bin/sh 2 1.1 christos #fix-info-dir (GNU texinfo) 3 1.1 christos VERSION=1.1 4 1.1 christos #Copyright (C) 1998, 2003 Free Software Foundation, Inc. 5 1.1 christos #fix-info-dir comes with NO WARRANTY, to the extent permitted by law. 6 1.1 christos #You may redistribute copies of fix-info-dir 7 1.1 christos #under the terms of the GNU General Public License. 8 1.1 christos #For more information about these matters, see the files named COPYING." 9 1.1 christos #fix-info-dir was derived from update-info and gen-dir-node 10 1.1 christos # The skeleton file contains info topic names in the 11 1.1 christos # order they should appear in the output. There are three special 12 1.1 christos # lines that alter the behavior: a line consisting of just "--" causes 13 1.1 christos # the next line to be echoed verbatim to the output. A line 14 1.1 christos # containing just "%%" causes all the remaining filenames (wildcards 15 1.1 christos # allowed) in the rest of the file to be ignored. A line containing 16 1.1 christos # just "!!" exits the script when reached (unless preceded by a line 17 1.1 christos # containing just "--"). 18 1.1 christos #Author: Richard L. Hawes, rhawes (at] dmapub.dma.org. 19 1.1 christos 20 1.1 christos # ###SECTION 1### Constants 21 1.1 christos set -h 2>/dev/null 22 1.1 christos # ENVIRONMENT 23 1.1 christos if test -z "$TMPDIR"; then 24 1.1 christos TMPDIR="/usr/tmp" 25 1.1 christos fi 26 1.1 christos if test -z "$LINENO"; then 27 1.1 christos LINENO="0" 28 1.1 christos fi 29 1.1 christos 30 1.1 christos MENU_BEGIN='^\*\([ ]\)\{1,\}Menu:' 31 1.1 christos MENU_ITEM='^\* ([^ ]).*:([ ])+\(' 32 1.1 christos MENU_FILTER1='s/^\*\([ ]\)\{1,\}/* /' 33 1.1 christos MENU_FILTER2='s/\([ ]\)\{1,\}$//g' 34 1.1 christos 35 1.1 christos TMP_FILE1="${TMPDIR}/fx${$}.info" 36 1.1 christos TMP_FILE2="${TMPDIR}/fy${$}.info" 37 1.1 christos TMP_FILE_LIST="$TMP_FILE1 $TMP_FILE2" 38 1.1 christos 39 1.1 christos TRY_HELP_MSG="Try --help for more information" 40 1.1 christos 41 1.1 christos # ###SECTION 100### main program 42 1.1 christos #variables set by options 43 1.1 christos CREATE_NODE="" 44 1.1 christos DEBUG=":" 45 1.1 christos MODE="" 46 1.1 christos # 47 1.1 christos Total="0" 48 1.1 christos Changed="" 49 1.1 christos 50 1.1 christos while test "$*"; do 51 1.1 christos case "$1" in 52 1.1 christos -c|--create) CREATE_NODE="y";; 53 1.1 christos --debug) set -eux; DEBUG="set>&2";; 54 1.1 christos -d|--delete) MODE="Detect_Invalid";; 55 1.1 christos +d);; 56 1.1 christos --version) 57 1.1 christos cat<<VersionEOF 58 1.1 christos fix-info-dir (GNU Texinfo) $VERSION 59 1.1 christos Copyright (C) 1998 Free Software Foundation, Inc. 60 1.1 christos fix-info-dir comes with NO WARRANTY, to the extent permitted by law. 61 1.1 christos You may redistribute copies of fix-info-dir 62 1.1 christos under the terms of the GNU General Public License. 63 1.1 christos For more information about these matters, see the files named COPYING. 64 1.1 christos Author: Richard L. Hawes 65 1.1 christos VersionEOF 66 1.1 christos exit;; 67 1.1 christos 68 1.1 christos --help) 69 1.1 christos cat<<HelpEndOfFile 70 1.1 christos Usage: fix-info-dir [OPTION]... [INFO_DIR/[DIR_FILE]] [SKELETON] 71 1.1 christos 72 1.1 christos It detects and inserts missing menu items into the info dir file. 73 1.1 christos The info dir must be the current directory. 74 1.1 christos 75 1.1 christos Options: 76 1.1 christos -c, --create create a new info node 77 1.1 christos -d, --delete delete invalid menu items (ignore missing menu items) 78 1.1 christos --debug print debug information to standard error path 79 1.1 christos --help print this help message and exit 80 1.1 christos --version print current version and exit 81 1.1 christos Backup of the info node has a '.old' suffix added. This is a shell script. 82 1.1 christos Environment Variables: TMPDIR 83 1.1 christos Email bug reports to bug-texinfo@gnu.org. 84 1.1 christos HelpEndOfFile 85 1.1 christos exit;; 86 1.1 christos 87 1.1 christos [-+]*) echo "$0:$LINENO: \"$1\" is not a valid option">&2 88 1.1 christos echo "$TRY_HELP_MSG">&2 89 1.1 christos exit 2;; 90 1.1 christos *) break;; 91 1.1 christos esac 92 1.1 christos shift 93 1.1 christos done 94 1.1 christos 95 1.1 christos ORIGINAL_DIR=`pwd` 96 1.1 christos 97 1.1 christos if test "$#" -gt "0"; then 98 1.1 christos INFO_DIR="$1" 99 1.1 christos shift 100 1.1 christos else 101 1.1 christos INFO_DIR=$DEFAULT_INFO_DIR 102 1.1 christos fi 103 1.1 christos 104 1.1 christos if test ! -d "${INFO_DIR}"; then 105 1.1 christos DIR_FILE=`basename ${INFO_DIR}`; 106 1.1 christos INFO_DIR=`dirname ${INFO_DIR}`; 107 1.1 christos else 108 1.1 christos DIR_FILE="dir" 109 1.1 christos fi 110 1.1 christos 111 1.1 christos cd "$INFO_DIR"||exit 112 1.1 christos 113 1.1 christos 114 1.1 christos if test "$CREATE_NODE"; then 115 1.1 christos if test "$#" -gt "0"; then 116 1.1 christos if test `expr $1 : /` = '1'; then 117 1.1 christos SKELETON="$1" 118 1.1 christos else 119 1.1 christos SKELETON="$ORIGINAL_DIR/$1" 120 1.1 christos fi 121 1.1 christos if test ! -r "$SKELETON" && test -f "$SKELETON"; then 122 1.1 christos echo "$0:$LINENO: $SKELETON is not readable">&2 123 1.1 christos exit 2 124 1.1 christos fi 125 1.1 christos shift 126 1.1 christos else 127 1.1 christos SKELETON=/dev/null 128 1.1 christos 129 1.1 christos fi 130 1.1 christos else 131 1.1 christos if test ! -f "$DIR_FILE"; then 132 1.1 christos echo "$0:$LINENO: $DIR_FILE is irregular or nonexistant">&2 133 1.1 christos exit 2 134 1.1 christos elif test ! -r "$DIR_FILE"; then 135 1.1 christos echo "$0:$LINENO: $DIR_FILE is not readable">&2 136 1.1 christos exit 2 137 1.1 christos elif test ! -w "$DIR_FILE"; then 138 1.1 christos echo "$0:$LINENO: $DIR_FILE is not writeable">&2 139 1.1 christos exit 2 140 1.1 christos fi 141 1.1 christos fi 142 1.1 christos 143 1.1 christos if test "$#" -gt "0"; then 144 1.1 christos echo "$0:$LINENO: Too many parameters">&2 145 1.1 christos echo "$TRY_HELP_MSG">&2 146 1.1 christos exit 2 147 1.1 christos fi 148 1.1 christos 149 1.1 christos if test -f "$DIR_FILE"; then 150 1.1 christos cp "$DIR_FILE" "$DIR_FILE.old" 151 1.1 christos echo "Backed up $DIR_FILE to $DIR_FILE.old." 152 1.1 christos fi 153 1.1 christos 154 1.1 christos if test "$CREATE_NODE"; then 155 1.1 christos if test "$MODE"; then 156 1.1 christos echo "$0:$LINENO: ERROR: Illogical option combination: -d -c">&2 157 1.1 christos echo "$TRY_HELP_MSG">&2 158 1.1 christos exit 2 159 1.1 christos fi 160 1.1 christos echo "Creating new Info Node: `pwd`/$DIR_FILE" 161 1.1 christos Changed="y" 162 1.1 christos 163 1.1 christos { 164 1.1 christos 165 1.1 christos ### output the dir header 166 1.1 christos echo "-*- Text -*-" 167 1.1 christos echo "This file was generated automatically by $0." 168 1.1 christos echo "This version was generated on `date`" 169 1.1 christos echo "by `whoami`@`hostname` for `pwd`" 170 1.1 christos 171 1.1 christos cat<<DIR_FILE_END_OF_FILE 172 1.1 christos This is the file .../info/$DIR_FILE, which contains the topmost node of the 173 1.1 christos Info hierarchy. The first time you invoke Info you start off 174 1.1 christos looking at that node, which is ($DIR_FILE)Top. 175 1.1 christos 176 1.1 christos 177 1.1 christos File: $DIR_FILE Node: Top This is the top of the INFO tree 178 1.1 christos 179 1.1 christos This (the Directory node) gives a menu of major topics. 180 1.1 christos Typing "q" exits, "?" lists all Info commands, "d" returns here, 181 1.1 christos "h" gives a primer for first-timers, 182 1.1 christos "mEmacs<Return>" visits the Emacs topic, etc. 183 1.1 christos 184 1.1 christos In Emacs, you can click mouse button 2 on a menu item or cross reference 185 1.1 christos to select it. 186 1.1 christos 187 1.1 christos * Menu: The list of major topics begins on the next line. 188 1.1 christos 189 1.1 christos DIR_FILE_END_OF_FILE 190 1.1 christos 191 1.1 christos ### go through the list of files in the skeleton. If an info file 192 1.1 christos ### exists, grab the ENTRY information from it. If an entry exists 193 1.1 christos ### use it, otherwise create a minimal $DIR_FILE entry. 194 1.1 christos 195 1.1 christos # Read one line from the file. This is so that we can echo lines with 196 1.1 christos # whitespace and quoted characters in them. 197 1.1 christos while read fileline; do 198 1.1 christos # flag fancy features 199 1.1 christos if test ! -z "$echoline"; then # echo line 200 1.1 christos echo "$fileline" 201 1.1 christos echoline="" 202 1.1 christos continue 203 1.1 christos elif test "${fileline}" = "--"; then 204 1.1 christos # echo the next line 205 1.1 christos echoline="1" 206 1.1 christos continue 207 1.1 christos elif test "${fileline}" = "%%"; then 208 1.1 christos # skip remaining files listed in skeleton file 209 1.1 christos skip="1" 210 1.1 christos continue 211 1.1 christos elif test "${fileline}" = "!!"; then 212 1.1 christos # quit now 213 1.1 christos break 214 1.1 christos fi 215 1.1 christos 216 1.1 christos # handle files if they exist 217 1.1 christos for file in $fileline""; do 218 1.1 christos fname= 219 1.1 christos if test -z "$file"; then 220 1.1 christos break 221 1.1 christos fi 222 1.1 christos # Find the file to operate upon. 223 1.1 christos if test -r "$file"; then 224 1.1 christos fname="$file" 225 1.1 christos elif test -r "${file}.info"; then 226 1.1 christos fname="${file}.info" 227 1.1 christos elif test -r "${file}.gz"; then 228 1.1 christos fname="${file}.gz" 229 1.1 christos elif test -r "${file}.info.gz"; then 230 1.1 christos fname="${file}.info.gz" 231 1.1 christos else 232 1.1 christos echo "$0:$LINENO: can't find info file for ${file}?">&2 233 1.1 christos continue 234 1.1 christos fi 235 1.1 christos 236 1.1 christos # if we found something and aren't skipping, do the entry 237 1.1 christos if test "$skip"; then 238 1.1 christos continue 239 1.1 christos fi 240 1.1 christos 241 1.1 christos infoname=`echo $file|sed -e 's/.info$//'` 242 1.1 christos entry=`zcat -f $fname|\ 243 1.1 christos sed -e '1,/START-INFO-DIR-ENTRY/d'\ 244 1.1 christos -e '/END-INFO-DIR-ENTRY/,$d'` 245 1.1 christos if [ ! -z "${entry}" ]; then 246 1.1 christos echo "${entry}" 247 1.1 christos else 248 1.1 christos echo "* ${infoname}: (${infoname})." 249 1.1 christos fi 250 1.1 christos Total=`expr "$Total" + "1"` 251 1.1 christos done 252 1.1 christos done 253 1.1 christos }>$DIR_FILE<$SKELETON 254 1.1 christos fi 255 1.1 christos 256 1.1 christos trap ' eval "$DEBUG"; rm -f $TMP_FILE_LIST; exit ' 0 257 1.1 christos trap ' rm -f $TMP_FILE_LIST 258 1.1 christos exit ' 1 259 1.1 christos trap ' rm -f $TMP_FILE_LIST 260 1.1 christos echo "$0:$LINENO: received INT signal.">&2 261 1.1 christos exit ' 2 262 1.1 christos trap ' rm -f $TMP_FILE_LIST 263 1.1 christos echo "$0:$LINENO: received QUIT signal.">&2 264 1.1 christos exit ' 3 265 1.1 christos 266 1.1 christos sed -e "1,/$MENU_BEGIN/d" -e "$MENU_FILTER1" -e "$MENU_FILTER2"<$DIR_FILE\ 267 1.1 christos |sed -n -e '/\* /{ 268 1.1 christos s/).*$//g 269 1.1 christos s/\.gz$// 270 1.1 christos s/\.info$// 271 1.1 christos s/^.*(//p 272 1.1 christos }'|sort -u>$TMP_FILE1 273 1.1 christos ls -F|sed -e '/\/$/d' -e '/[-.][0-9]/d'\ 274 1.1 christos -e "/^$DIR_FILE\$/d" -e "/^$DIR_FILE.old\$/d"\ 275 1.1 christos -e 's/[*@]$//' -e 's/\.gz$//' -e 's/\.info$//'|sort>$TMP_FILE2 276 1.1 christos 277 1.1 christos if test -z "$MODE"; then 278 1.1 christos #Detect Missing 279 1.1 christos DONE_MSG="total menu item(s) were inserted into `pwd`/$DIR_FILE" 280 1.1 christos for Info_Name in `comm -13 $TMP_FILE1 $TMP_FILE2`; do 281 1.1 christos if test -r "$Info_Name"; then 282 1.1 christos Info_File="$Info_Name" 283 1.1 christos elif test -r "${Info_Name}.info"; then 284 1.1 christos Info_File="${Info_Name}.info" 285 1.1 christos elif test -r "${Info_Name}.gz"; then 286 1.1 christos Info_File="${Info_Name}.gz" 287 1.1 christos elif test -r "${Info_Name}.info.gz"; then 288 1.1 christos Info_File="${Info_Name}.info.gz" 289 1.1 christos else 290 1.1 christos echo "$0:$LINENO: can't find info file for ${Info_Name}?">&2 291 1.1 christos continue 292 1.1 christos fi 293 1.1 christos Changed="y" 294 1.1 christos if install-info $Info_File $DIR_FILE; then 295 1.1 christos Total=`expr "$Total" + "1"` 296 1.1 christos fi 297 1.1 christos done 298 1.1 christos else 299 1.1 christos # Detect Invalid 300 1.1 christos DONE_MSG="total invalid menu item(s) were removed from `pwd`/$DIR_FILE" 301 1.1 christos for Info_Name in `comm -23 $TMP_FILE1 $TMP_FILE2`; do 302 1.1 christos Changed="y" 303 1.1 christos if install-info --remove $Info_Name $DIR_FILE; then 304 1.1 christos Total=`expr "$Total" + "1"` 305 1.1 christos fi 306 1.1 christos done 307 1.1 christos fi 308 1.1 christos 309 1.1 christos # print summary 310 1.1 christos if test "$Changed"; then 311 1.1 christos echo "$Total $DONE_MSG" 312 1.1 christos else 313 1.1 christos echo "Nothing to do" 314 1.1 christos fi 315 1.1 christos rm -f $TMP_FILE_LIST 316 1.1 christos eval "$DEBUG" 317 1.1 christos exit 0 318