This script repairs the info dir file by extracting install-info
invocations from postinst files.
Obviously this is quite klugy but just looping over the installed files
does not work because they would get all put in the "Miscellaneous"
section; it would be better if all packages wrote this info in some kind
of database.
Also this script does not work for Emacs packages that put info files in
a directory of their own and use a for loop to install them; however,
the current script supports Emacs21 as a special case.
The script requires perl.
It can be found at http://ldb.ods.org/freesw_debian_repair-info.html
License is GPL as specified on http://ldb.ods.org/license.html
Since it is small here is a copy of the current version:
#!/bin/sh
if test "$1" == "-h" || test "$1" == "--help"; then
echo "Usage: repair-info [--auto]"
echo "Generates a script to repair the info dir file and runs it if --auto is specified."
exit 0
fi
tempdir=`mktemp -d`
echo '#!/bin/sh'>$tempdir/repair-info-generic.sh
cat /var/lib/dpkg/info/*.postinst|perl -e '$ignore = 0; while(<>) {chomp; if(/install-info/) {/^\s*install-info/ and $ignore = 0;} else {abort;}; $ignore and next; if(!/\\\s*$/) {$ignore = 1;}; /^#/ or print "$_\n";}'>>$tempdir/repair-info-generic.sh
echo '#!/bin/sh'>$tempdir/repair-info-emacs21.sh
if test -f /var/lib/dpkg/info/emacs21.postinst; then
cat /var/lib/dpkg/info/emacs21.postinst|perl -e '$ignore = 0; while(<>) {m,#!/bin/sh, && next; /update-alternatives/ && last; print $_;}'>>$tempdir/repair-info-emacs21.sh
fi
cat ->$tempdir/repair-info.sh <<EOF
#!/bin/sh
backup=\`tempfile\`
if test -d $tempdir; then
tempdir=$tempdir
else
tempdir=.
fi
echo "Backing up existing dir file in \$backup"
mv -f /usr/share/info/dir \$backup
touch /usr/share/info/dir
rm -f /usr/share/info/dir.lock
cleanup-info /usr/share/info # install-info hangs otherwise
\$tempdir/repair-info-generic.sh
\$tempdir/repair-info-emacs21.sh
cleanup-info /usr/share/info # install-info messes up even if starts from stracth
EOF
chmod +x $tempdir/repair-info*.sh
if test "$1" == "-a" || test "$1" == "--auto"; then
if test $UID == 0; then
echo "Running $tempdir/repair-info.sh"
$tempdir/repair-info.sh
else
echo "Give root password to run $tempdir/repair-info.sh"
su -c "$tempdir/repair-info.sh"
fi
else
echo "Now su to root and run $tempdir/repair-info.sh"
fi

Attachment:
signature.ascDescription: This is a digitally signed message part