[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#3125: bug (and correction) in dpkg-1.1.6 scripts/install-info.pl



  It looks like my previous mail didn't make it to the bug list; so
much the better : after a little more study on Perl, I have simplified
the code.  Still, inspect carefully begore using.

  Another word of warning if you plan on calling it in dpkg.postinst :
it backups the dir file to dir.old, so the install-info command that
would be found with it would make the real original file disappear.

  BTW, what/where is dpkg-1.2.3 ?  And dpkg now defaults to
--force-overwrite (bad IMHO), but --force-help doesn't say so.

+++ THIS IS cleanup-info.pl +++
#!/usr/bin/perl --
#
#   Clean up the mess that bogus install-info may have done :
#
#	- gather all sections with the same heading into a single one.
#
#   Other clean ups :
#
#	- remove empty sections,
#	- squeeze blank lines (in entries part only).
#
#   Order of sections is preserved (the first encountered section
# counts).
#
#   Order of entries within a section is preserved.
#
# BUGS:
#
#   Probably many : I just recently learned Perl for this program
# using the man pages.  Hopefully this is a short enough program to
# debug.

use strict;

sub version {
    print STDERR <<END;
Debian GNU/Linux cleanup-info 1.1.  Copyright (C) 1994,1995 Kim-Minh
Kaplan. This is free software; see the GNU General Public Licence
version 2 or later for copying conditions.  There is NO warranty.
END
}

sub usage {
    print STDERR "usage: cleanup-info [--version] [--help] [--] [<dirname>]\n";
}

my $infodir = '/usr/info';
$0 =~ m|[^/]+$|;
my $name= $&;

sub ulquit {
    unlink "$infodir/dir.lock"
	or warn "$name: warning - unable to unlock $infodir/dir: $!\n";
    die $_[0];
}

while (scalar @ARGV > 0 && $ARGV[0] =~ m/^--/) {
    $_ = shift;
    if ($_ eq '--') {
	last;
    } elsif ($_ eq "--version") {
	version;
	exit 0;
    } elsif ($_ eq "--help") {
	usage;
	exit 0;
    } else {
	print STDERR "$name: unknown option \`$_'\n";
	usage;
	exit 1;
    }
}

if (scalar @ARGV > 0) {
    $infodir = shift;
    if (scalar @ARGV > 0) {
	print STDERR "$name: too many arguments\n";
	usage;
	exit 1;
    }
}

if (!link "$infodir/dir", "$infodir/dir.lock") {
    die "$name: failed to lock dir for editing! $!\n".
        ($! =~ m/exist/i ? "try deleting $infodir/dir.lock\n" : '');
}
open OLD, "$infodir/dir"  or ulquit "$name: can't open $infodir/dir: $!\n";
open OUT, ">$infodir/dir.new"
    or ulquit "$name can't create $infodir/dir.new: $!\n";

do {				# dump the non entries part
    $_ = <OLD>;
    last if !$_;
    print OUT $_ or ulquit "$name: error writing $infodir/dir.new: $!\n";
} until (m/^\*\s*Menu:/i);

my (%sections, @section_list);
my $section="Miscellaneous";	# default section
foreach (<OLD>) {		# collect sections
    next if (m/^\s*$/);		# squeeze blank lines
    s/\s*$//;
    if (m/^[^\*\s]/) {		# change of section
	$section = $_;
    } else {			# add to section
	if (! exists $sections{$section}) { # create section header
	    push @section_list, $section;
	    $sections{$section} = "\n$section\n";
	}
	$sections{$section} .= "$_\n";
    }
}

eof OLD or ulquit "$name: read $infodir/dir: $!\n";
close OLD or ulquit "$name: close $infodir/dir after read: $!\n";

print OUT @sections{@section_list};
close OUT or ulquit "$name: error closing $infodir/dir.new: $!\n";

# install clean version
unlink "$infodir/dir.old";
link "$infodir/dir", "$infodir/dir.old"
    or ulquit "$name: can't backup old $infodir/dir, giving up: $!\n";
rename "$infodir/dir.new", "$infodir/dir"
    or ulquit "$name: failed to install $infodir/dir; I'll leave it as $infodir/dir.new: $!\n";

unlink "$infodir/dir.lock"
    or die "$name: failed to unlock $infodir/dir: $!\n";

exit 0;
+++ THIS IS NO MORE cleanup-info.pl +++
--
FAX : +33-1-45 80 08 02
<Kim-Minh.Kaplan@cdf.in2p3.fr> <kaplan@afflynn.frmug.fr.net>

Linux Is Not UniX.  What's lignux ?


Reply to: