From b6953de842b3097589a2e5e7bb23916d5463d82b Mon Sep 17 00:00:00 2001 From: zhouwenpei Date: Tue, 29 Aug 2023 16:20:39 +0800 Subject: [PATCH] add fix-info-dir command --- fix-info-dir | 316 +++++++++++++++++++++++++++++++ info-6.5-sync-fix-info-dir.patch | 40 ++++ texinfo-6.5-fix-info-dir.patch | 41 ++++ texinfo.spec | 16 +- 4 files changed, 411 insertions(+), 2 deletions(-) create mode 100644 fix-info-dir create mode 100644 info-6.5-sync-fix-info-dir.patch create mode 100644 texinfo-6.5-fix-info-dir.patch diff --git a/fix-info-dir b/fix-info-dir new file mode 100644 index 0000000..a0de563 --- /dev/null +++ b/fix-info-dir @@ -0,0 +1,316 @@ +#!/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<&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<" 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 \ No newline at end of file diff --git a/info-6.5-sync-fix-info-dir.patch b/info-6.5-sync-fix-info-dir.patch new file mode 100644 index 0000000..c03664c --- /dev/null +++ b/info-6.5-sync-fix-info-dir.patch @@ -0,0 +1,40 @@ +diff -uNr texinfo-6.5.orig/contrib/fix-info-dir texinfo-6.5/contrib/fix-info-dir +--- texinfo-6.5.orig/contrib/fix-info-dir 2014-04-22 03:56:56.000000000 +0200 ++++ texinfo-6.5/contrib/fix-info-dir 2018-02-04 13:48:35.979359350 +0100 +@@ -163,29 +163,23 @@ + { + + ### 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<" visits the Emacs topic, etc. ++ "mEmacs" visits the Emacs manual, 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. +- ++* Menu: + DIR_FILE_END_OF_FILE + + ### go through the list of files in the skeleton. If an info file \ No newline at end of file diff --git a/texinfo-6.5-fix-info-dir.patch b/texinfo-6.5-fix-info-dir.patch new file mode 100644 index 0000000..f11ea31 --- /dev/null +++ b/texinfo-6.5-fix-info-dir.patch @@ -0,0 +1,41 @@ +This fixes two issues: + +https://bugzilla.redhat.com/show_bug.cgi?id=1592433 +This is a bug in fix-info-dir --delete +(Hunk 3) + +https://bugzilla.redhat.com/show_bug.cgi?id=1614162 +This is a weird infinite loop that happens when fix-info-dir is run with stderr +redirected to /dev/null while /dev/null doesn't exist (or isn't a device) +(Hunks 1 and 2) + +diff --git a/contrib/fix-info-dir b/contrib/fix-info-dir +index 4439ada..9240060 100755 +--- a/contrib/fix-info-dir ++++ b/contrib/fix-info-dir +@@ -124,6 +124,7 @@ if test "$CREATE_NODE"; then + fi + shift + else ++ SKIP_READ=yes + SKELETON=/dev/null + + fi +@@ -188,7 +189,7 @@ DIR_FILE_END_OF_FILE + + # 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 ++ while test -z "$SKIP_READ" && read fileline; do + # flag fancy features + if test ! -z "$echoline"; then # echo line + echo "$fileline" +@@ -294,7 +295,7 @@ else + 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 ++ if install-info --remove --remove-exactly $Info_Name $DIR_FILE; then + Total=`expr "$Total" + "1"` + fi + done \ No newline at end of file diff --git a/texinfo.spec b/texinfo.spec index 1a1a6a7..fce27e2 100644 --- a/texinfo.spec +++ b/texinfo.spec @@ -4,17 +4,21 @@ Name: texinfo Version: 7.0.3 -Release: 2 +Release: 3 Summary: The GNU Documentation System License: GPLv3+ Url: http://www.gnu.org/software/texinfo/ Source0: https://ftp.gnu.org/gnu/texinfo/texinfo-%{version}.tar.xz Source1: https://ftp.gnu.org/gnu/texinfo/texinfo-%{version}.tar.xz.sig +#https://git.savannah.gnu.org/cgit/texinfo.git/tree/contrib/fix-info-dir +Source2: fix-info-dir #patch from :https://src.fedoraproject.org/rpms/texinfo/tee/rawhide Patch6000: texinfo-6.1-install-info-use-create-tmp-then-rename-pattern.patch Patch6001: texinfo-6.5-covscan-fixes.patch Patch6002: texinfo-7.0.2-undef-val-array-ref.patch +Patch6003: info-6.5-sync-fix-info-dir.patch +Patch6004: texinfo-6.5-fix-info-dir.patch BuildRequires: gcc perl-generators zlib-devel ncurses-devel help2man BuildRequires: perl(Data::Dumper) perl(Locale::Messages) perl(Unicode::EastAsianWidth) perl(Text::Unidecode) perl(Storable) perl(Unicode::Normalize) @@ -57,7 +61,10 @@ Summary: Documentation for texinfo This package contains help documentation for texinfo. %prep -%autosetup -p1 +%setup -q +mkdir contrib +install -Dpm0755 -t contrib %{SOURCE2} +%autopatch -p1 %build %configure --with-external-Text-Unidecode --with-external-libintl-perl --with-external-Unicode-EastAsianWidth --disable-perl-xs @@ -73,6 +80,7 @@ install -p -m644 doc/texinfo.tex doc/txi-??.tex $RPM_BUILD_ROOT%{tex_texinfo} mv $RPM_BUILD_ROOT%{_bindir}/install-info $RPM_BUILD_ROOT/sbin +install -Dpm0755 -t %{buildroot}%{_sbindir} contrib/fix-info-dir %find_lang %{name} %find_lang %{name}_document @@ -112,6 +120,7 @@ export ALL_TESTS=yes %files -n info %license COPYING %{_bindir}/info +%{_sbindir}/fix-info-dir /sbin/install-info %ghost %{_infodir}/dir %ghost %{_infodir}/dir.old @@ -135,6 +144,9 @@ export ALL_TESTS=yes %{_mandir}/man5/texinfo.5* %changelog +* Tue Aug 29 2023 zhouwenpei - 7.0.3-3 +- add fix-info-dir command + * Wed Aug 02 2023 zhouwenpei - 7.0.3-2 - fix undefined value error -- Gitee