| #!/bin/sh | |
| #fix-info-dir (GNU texinfo) | |
| VERSION=1.1 | |
| #Copyright (C) 1998, 2003 Free Software Foundation, Inc. | |
| #fix-info-dir comes with NO WARRANTY, to the extent permitted by law. | |
| #You may redistribute copies of fix-info-dir | |
| #under the terms of the GNU General Public License. | |
| #For more information about these matters, see the files named COPYING." | |
| #fix-info-dir was derived from update-info and gen-dir-node | |
| # The skeleton file contains info topic names in the | |
| # order they should appear in the output. There are three special | |
| # lines that alter the behavior: a line consisting of just "--" causes | |
| # the next line to be echoed verbatim to the output. A line | |
| # containing just "%%" causes all the remaining filenames (wildcards | |
| # allowed) in the rest of the file to be ignored. A line containing | |
| # just "!!" exits the script when reached (unless preceded by a line | |
| # containing just "--"). | |
| #Author: Richard L. Hawes, rhawes@dmapub.dma.org. | |
| # ###SECTION 1### Constants | |
| set -h 2>/dev/null | |
| # ENVIRONMENT | |
| if test -z "$TMPDIR"; then | |
| TMPDIR="/usr/tmp" | |
| fi | |
| if test -z "$LINENO"; then | |
| LINENO="0" | |
| fi | |
| MENU_BEGIN='^\*\([ ]\)\{1,\}Menu:' | |
| MENU_FILTER1='s/^\*\([ ]\)\{1,\}/* /' | |
| MENU_FILTER2='s/\([ ]\)\{1,\}$//g' | |
| TMP_FILE1="${TMPDIR}/fx${$}.info" | |
| TMP_FILE2="${TMPDIR}/fy${$}.info" | |
| TMP_FILE_LIST="$TMP_FILE1 $TMP_FILE2" | |
| TRY_HELP_MSG="Try --help for more information" | |
| # ###SECTION 100### main program | |
| #variables set by options | |
| CREATE_NODE="" | |
| DEBUG=":" | |
| MODE="" | |
| # | |
| Total="0" | |
| Changed="" | |
| while test "$*"; do | |
| case "$1" in | |
| -c|--create) CREATE_NODE="y";; | |
| --debug) set -eux; DEBUG="set>&2";; | |
| -d|--delete) MODE="Detect_Invalid";; | |
| +d);; | |
| --version) | |
| cat<<VersionEOF | |
| fix-info-dir (GNU Texinfo) $VERSION | |
| Copyright (C) 1998 Free Software Foundation, Inc. | |
| fix-info-dir comes with NO WARRANTY, to the extent permitted by law. | |
| You may redistribute copies of fix-info-dir | |
| under the terms of the GNU General Public License. | |
| For more information about these matters, see the files named COPYING. | |
| Author: Richard L. Hawes | |
| VersionEOF | |
| exit;; | |
| --help) | |
| cat<<HelpEndOfFile | |
| Usage: fix-info-dir [OPTION]... [INFO_DIR/[DIR_FILE]] [SKELETON] | |
| It detects and inserts missing menu items into the info dir file. | |
| The info dir must be the current directory. | |
| Options: | |
| -c, --create create a new info node | |
| -d, --delete delete invalid menu items (ignore missing menu items) | |
| --debug print debug information to standard error path | |
| --help print this help message and exit | |
| --version print current version and exit | |
| Backup of the info node has a '.old' suffix added. This is a shell script. | |
| Environment Variables: TMPDIR | |
| Email bug reports to bug-texinfo@gnu.org. | |
| HelpEndOfFile | |
| exit;; | |
| [-+]*) echo "$0:$LINENO: \"$1\" is not a valid option">&2 | |
| echo "$TRY_HELP_MSG">&2 | |
| exit 2;; | |
| *) break;; | |
| esac | |
| shift | |
| done | |
| ORIGINAL_DIR=`pwd` | |
| if test "$#" -gt "0"; then | |
| INFO_DIR="$1" | |
| shift | |
| else | |
| INFO_DIR=$DEFAULT_INFO_DIR | |
| fi | |
| if test ! -d "${INFO_DIR}"; then | |
| DIR_FILE=`basename ${INFO_DIR}`; | |
| INFO_DIR=`dirname ${INFO_DIR}`; | |
| else | |
| DIR_FILE="dir" | |
| fi | |
| cd "$INFO_DIR"||exit | |
| if test "$CREATE_NODE"; then | |
| if test "$#" -gt "0"; then | |
| if test `expr $1 : /` = '1'; then | |
| SKELETON="$1" | |
| else | |
| SKELETON="$ORIGINAL_DIR/$1" | |
| fi | |
| if test ! -r "$SKELETON" && test -f "$SKELETON"; then | |
| echo "$0:$LINENO: $SKELETON is not readable">&2 | |
| exit 2 | |
| fi | |
| shift | |
| else | |
| SKELETON=/dev/null | |
| fi | |
| else | |
| if test ! -f "$DIR_FILE"; then | |
| echo "$0:$LINENO: $DIR_FILE is irregular or nonexistant">&2 | |
| exit 2 | |
| elif test ! -r "$DIR_FILE"; then | |
| echo "$0:$LINENO: $DIR_FILE is not readable">&2 | |
| exit 2 | |
| elif test ! -w "$DIR_FILE"; then | |
| echo "$0:$LINENO: $DIR_FILE is not writeable">&2 | |
| exit 2 | |
| fi | |
| fi | |
| if test "$#" -gt "0"; then | |
| echo "$0:$LINENO: Too many parameters">&2 | |
| echo "$TRY_HELP_MSG">&2 | |
| exit 2 | |
| fi | |
| if test -f "$DIR_FILE"; then | |
| cp "$DIR_FILE" "$DIR_FILE.old" | |
| echo "Backed up $DIR_FILE to $DIR_FILE.old." | |
| fi | |
| if test "$CREATE_NODE"; then | |
| if test "$MODE"; then | |
| echo "$0:$LINENO: ERROR: Illogical option combination: -d -c">&2 | |
| echo "$TRY_HELP_MSG">&2 | |
| exit 2 | |
| fi | |
| echo "Creating new Info Node: `pwd`/$DIR_FILE" | |
| Changed="y" | |
| { | |
| ### output the dir header | |
| echo "-*- Text -*-" | |
| echo "This file was generated automatically by $0." | |
| echo "This version was generated on `date`" | |
| echo "by `whoami`@`hostname` for `pwd`" | |
| cat<<DIR_FILE_END_OF_FILE | |
| This is the file .../info/$DIR_FILE, which contains the topmost node of the | |
| Info hierarchy. The first time you invoke Info you start off | |
| looking at that node, which is ($DIR_FILE)Top. | |
| File: $DIR_FILE Node: Top This is the top of the INFO tree | |
| This (the Directory node) gives a menu of major topics. | |
| Typing "q" exits, "?" lists all Info commands, "d" returns here, | |
| "h" gives a primer for first-timers, | |
| "mEmacs<Return>" visits the Emacs topic, etc. | |
| In Emacs, you can click mouse button 2 on a menu item or cross reference | |
| to select it. | |
| * Menu: The list of major topics begins on the next line. | |
| DIR_FILE_END_OF_FILE | |
| ### go through the list of files in the skeleton. If an info file | |
| ### exists, grab the ENTRY information from it. If an entry exists | |
| ### use it, otherwise create a minimal $DIR_FILE entry. | |
| # Read one line from the file. This is so that we can echo lines with | |
| # whitespace and quoted characters in them. | |
| while read fileline; do | |
| # flag fancy features | |
| if test ! -z "$echoline"; then # echo line | |
| echo "$fileline" | |
| echoline="" | |
| continue | |
| elif test "${fileline}" = "--"; then | |
| # echo the next line | |
| echoline="1" | |
| continue | |
| elif test "${fileline}" = "%%"; then | |
| # skip remaining files listed in skeleton file | |
| skip="1" | |
| continue | |
| elif test "${fileline}" = "!!"; then | |
| # quit now | |
| break | |
| fi | |
| # handle files if they exist | |
| for file in $fileline""; do | |
| fname= | |
| if test -z "$file"; then | |
| break | |
| fi | |
| # Find the file to operate upon. | |
| if test -r "$file"; then | |
| fname="$file" | |
| elif test -r "${file}.info"; then | |
| fname="${file}.info" | |
| elif test -r "${file}.gz"; then | |
| fname="${file}.gz" | |
| elif test -r "${file}.info.gz"; then | |
| fname="${file}.info.gz" | |
| else | |
| echo "$0:$LINENO: can't find info file for ${file}?">&2 | |
| continue | |
| fi | |
| # if we found something and aren't skipping, do the entry | |
| if test "$skip"; then | |
| continue | |
| fi | |
| infoname=`echo $file|sed -e 's/.info$//'` | |
| entry=`zcat -f $fname|\ | |
| sed -e '1,/START-INFO-DIR-ENTRY/d'\ | |
| -e '/END-INFO-DIR-ENTRY/,$d'` | |
| if [ ! -z "${entry}" ]; then | |
| echo "${entry}" | |
| else | |
| echo "* ${infoname}: (${infoname})." | |
| fi | |
| Total=`expr "$Total" + "1"` | |
| done | |
| done | |
| }>$DIR_FILE<$SKELETON | |
| fi | |
| trap ' eval "$DEBUG"; rm -f $TMP_FILE_LIST; exit ' 0 | |
| trap ' rm -f $TMP_FILE_LIST | |
| exit ' 1 | |
| trap ' rm -f $TMP_FILE_LIST | |
| echo "$0:$LINENO: received INT signal.">&2 | |
| exit ' 2 | |
| trap ' rm -f $TMP_FILE_LIST | |
| echo "$0:$LINENO: received QUIT signal.">&2 | |
| exit ' 3 | |
| sed -e "1,/$MENU_BEGIN/d" -e "$MENU_FILTER1" -e "$MENU_FILTER2"<$DIR_FILE\ | |
| |sed -n -e '/\* /{ | |
| s/).*$//g | |
| s/\.gz$// | |
| s/\.info$// | |
| s/^.*(//p | |
| }'|sort -u>$TMP_FILE1 | |
| ls -F|sed -e '/\/$/d' -e '/[-.][0-9]/d'\ | |
| -e "/^$DIR_FILE\$/d" -e "/^$DIR_FILE.old\$/d"\ | |
| -e 's/[*@]$//' -e 's/\.gz$//' -e 's/\.info$//'|sort>$TMP_FILE2 | |
| if test -z "$MODE"; then | |
| #Detect Missing | |
| DONE_MSG="total menu item(s) were inserted into `pwd`/$DIR_FILE" | |
| for Info_Name in `comm -13 $TMP_FILE1 $TMP_FILE2`; do | |
| if test -r "$Info_Name"; then | |
| Info_File="$Info_Name" | |
| elif test -r "${Info_Name}.info"; then | |
| Info_File="${Info_Name}.info" | |
| elif test -r "${Info_Name}.gz"; then | |
| Info_File="${Info_Name}.gz" | |
| elif test -r "${Info_Name}.info.gz"; then | |
| Info_File="${Info_Name}.info.gz" | |
| else | |
| echo "$0:$LINENO: can't find info file for ${Info_Name}?">&2 | |
| continue | |
| fi | |
| Changed="y" | |
| if install-info $Info_File $DIR_FILE; then | |
| Total=`expr "$Total" + "1"` | |
| fi | |
| done | |
| else | |
| # Detect Invalid | |
| DONE_MSG="total invalid menu item(s) were removed from `pwd`/$DIR_FILE" | |
| for Info_Name in `comm -23 $TMP_FILE1 $TMP_FILE2`; do | |
| Changed="y" | |
| if install-info --remove $Info_Name $DIR_FILE; then | |
| Total=`expr "$Total" + "1"` | |
| fi | |
| done | |
| fi | |
| # print summary | |
| if test "$Changed"; then | |
| echo "$Total $DONE_MSG" | |
| else | |
| echo "Nothing to do" | |
| fi | |
| rm -f $TMP_FILE_LIST | |
| eval "$DEBUG" | |
| exit 0 |