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