123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318 |
- #!/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_ITEM='^\* ([^ ]).*:([ ])+\('
- 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
|