[xml/sgml-pkgs] Bug#477751: tackling this bug
Helmut Grohne
helmut at subdivi.de
Sun Dec 4 12:06:06 UTC 2011
tags 477751 +patch
thanks
Hi,
I finally took the opportunity to work on this bug. As Joey Hess pointed
out the first thing to change is update-catalog. On the other hand
surely the debhelper snipped *will* have to change, because it
unconditionally removes a file in /etc. So let us have a look at the
current snippet:
$ cat /usr/share/debhelper/autoscripts/postinst-sgmlcatalog
if [ "$1" = "configure" ]; then
rm -f #CENTRALCAT#
for ordcat in #ORDCATS#; do
update-catalog --quiet --add #CENTRALCAT# ${ordcat}
done
update-catalog --quiet --add --super #CENTRALCAT#
fi
$
So there are two places where we do not preserve user changes.
1) Changes to the root catalog. This is due to the update-catalog --quiet --add
--super. It is actually easy to solve, because it is a no-op if the catalog is
already added. Thus it should only be invoked when installing the package. It
should not be invoked when upgrading the package. A simple check on $2 being
empty solves this issue.
2) Changes to the central catalog of the package. This is more tricky
and requires changes to update-catalog. There needs to be some way to
remember what catalogs the user disabled. To achieve this I changed the
behaviour of --remove (see attached debdiff). It will now comment out
catalogs to be removed. Now removing that catalog is no longer a good
thing to do. Instead updatew-catalog needs to do something more clever.
This is where update-catalog --update #CENTRALCAT# #ORDCATS# comes in.
It will walk over the central catalog removing any (disabled or not)
entries not found in the passed #ORDCATS#. It will not touch entries
already present, but add new ones. So this should solve the issue.
The new snipped would look like this:
$ cat postinst-sgmlcatalog.new
if [ "$1" = configure" ]; then
update-catalog --quiet --update #CENTRALCAT# #ORDCATS#
if [ -z "$2" ]; then
update-catalog --quiet --add --super #CENTRALCAT#
fi
fi
$
So what are your thoughts on this?
Helmut
-------------- next part --------------
diff -Nru sgml-base-1.26+nmu1/debian/changelog sgml-base-1.26+nmu2/debian/changelog
--- sgml-base-1.26+nmu1/debian/changelog 2010-07-18 14:39:38.000000000 +0200
+++ sgml-base-1.26+nmu2/debian/changelog 2011-12-04 12:50:15.000000000 +0100
@@ -1,3 +1,10 @@
+sgml-base (1.26+nmu2) unstable; urgency=low
+
+ * Non-maintainer upload.
+ * Rework update-catalog in a way that empowers debhelper to fix #477751.
+
+ -- Helmut Grohne <helmut at subdivi.de> Sun, 04 Dec 2011 12:49:07 +0100
+
sgml-base (1.26+nmu1) unstable; urgency=low
* Non-maintainer upload
diff -Nru sgml-base-1.26+nmu1/tools/update-catalog sgml-base-1.26+nmu2/tools/update-catalog
--- sgml-base-1.26+nmu1/tools/update-catalog 2004-06-21 00:04:49.000000000 +0200
+++ sgml-base-1.26+nmu2/tools/update-catalog 2011-12-04 12:41:06.000000000 +0100
@@ -30,6 +30,7 @@
use vars qw( $super );
use vars qw( $template );
use vars qw( $type );
+use vars qw( $update );
## ----------------------------------------------------------------------
while ( $ARGV[0] =~ m/^--/ )
@@ -44,6 +45,10 @@
{
$remove = 1;
}
+ elsif ( $_ eq '--update' )
+ {
+ $update = 1;
+ }
elsif ( $_ eq '--quiet' )
{
$quiet = 1;
@@ -83,10 +88,14 @@
}
## ----------------------------------------------------------------------
-if ( $add || $remove )
+if ( $add || $remove || $update )
{
if ( $super )
{
+ if ( $update ) {
+ print "Updating the super catalog is not supported.\n";
+ exit 1;
+ }
$catalog = '/etc/sgml/catalog';
}
else
@@ -104,6 +113,21 @@
}
## ----------------------------------------------------------------------
+if ( $add + $remove + $update != 1)
+{
+ print "Huh? You have to use precisely one out of --add --remove and --update.\n";
+ exit 1;
+}
+if ( $update )
+{
+ print "Updating $catalog...\n"
+ unless $quiet;
+ &read_catalog_updating_argv;
+ &write_catalog;
+ exit 0;
+}
+
+## ----------------------------------------------------------------------
$entry = shift( @ARGV );
## ----------------------------------------------------------------------
@@ -115,13 +139,6 @@
}
## ----------------------------------------------------------------------
-if ( $add == $remove )
-{
- print "Huh? You have to use --add or --remove (not both).\n";
- exit 1;
-}
-
-## ----------------------------------------------------------------------
print STDERR "$name: test mode - catalog file will not be updated\n"
if $debug && ! $quiet;
@@ -131,8 +148,7 @@
print "Adding entry $entry to catalog $catalog...\n"
unless $quiet;
- &read_catalog_without_entry;
- &add_entry;
+ &read_catalog_enabling_entry;
&write_catalog;
}
elsif ( $remove )
@@ -140,7 +156,7 @@
print "Removing entry $entry from catalog $catalog...\n"
unless $quiet;
- &read_catalog_without_entry;
+ &read_catalog_disabling_entry;
&write_catalog;
}
@@ -148,8 +164,25 @@
exit 0;
## ----------------------------------------------------------------------
- sub read_catalog_without_entry
+sub read_template
+{
+ $type = $super ? 'super' : 'centralized';
+ $template = "/usr/share/sgml-base/catalog.$type";
+ print "Reading template $template...\n"
+ if $debug;
+ open( TEMPLATE, "<$template" )
+ or die "cannot open template $template for reading: $!";
+ while ( <TEMPLATE> )
+ {
+ chop;
+ s|CATALOG|$catalog| if m/CATALOG/;
+ push( @data, $_ );
+ }
+ close( TEMPLATE );
+}
+sub read_catalog_enabling_entry
{
+ my $enabled = 0;
if ( -f $catalog )
{
print "Reading catalog $catalog and removing entry $entry...\n"
@@ -159,25 +192,83 @@
while ( <CATALOG> )
{
chop;
- push( @data, $_ ) unless m/$entry/;
+ if(m/$entry/ and m/^--.*--$/) {
+ print "Enabling disabled catalog $catalog...\n"
+ if $debug;
+ s/^--//;
+ s/--$//;
+ $enabled = 1;
+ }
+ push( @data, $_ );
}
close( CATALOG );
+ &add_entry if(!$enabled);
}
else
{
- $type = $super ? 'super' : 'centralized';
- $template = "/usr/share/sgml-base/catalog.$type";
- print "Reading template $template...\n"
+ &read_template;
+ &add_entry;
+ }
+}
+sub read_catalog_disabling_entry
+{
+ if ( -f $catalog )
+ {
+ print "Reading catalog $catalog and removing entry $entry...\n"
if $debug;
- open( TEMPLATE, "<$template" )
- or die "cannot open template $template for reading: $!";
- while ( <TEMPLATE> )
+ open( CATALOG, "<$catalog" )
+ or die "cannot open catalog $catalog for reading: $!";
+ while ( <CATALOG> )
{
chop;
- s|CATALOG|$catalog| if m/CATALOG/;
+ if(m/$entry/ and ! m/^--/) {
+ s/^/--/;
+ s/$/--/;
+ }
push( @data, $_ );
}
- close( TEMPLATE );
+ close( CATALOG );
+ }
+ else
+ {
+ &read_template;
+ }
+}
+sub read_catalog_updating_argv
+{
+ my %entries;
+ map { $entries{$_} = 1 } @ARGV;
+ if ( -f $catalog )
+ {
+ print "Reading catalog $catalog and removing entry $entry...\n"
+ if $debug;
+ open( my $fh, "<", $catalog )
+ or die "cannot open catalog $catalog for reading: $!";
+ while ( <$fh> )
+ {
+ my $found = 0;
+ chomp;
+ foreach my $key (keys %entries) {
+ # We do not care whether it is commented out or not.
+ if(m/$key/) {
+ $found = 1;
+ delete $entries{$key};
+ }
+ }
+ push( @data, $_ ) if( $found );
+ }
+ close( $fh );
+ # add new entries.
+ foreach $entry (keys %entries) {
+ &add_entry;
+ }
+ }
+ else
+ {
+ &read_template;
+ foreach $entry (@ARGV) {
+ &add_entry;
+ }
}
}
diff -Nru sgml-base-1.26+nmu1/tools/update-catalog.8 sgml-base-1.26+nmu2/tools/update-catalog.8
--- sgml-base-1.26+nmu1/tools/update-catalog.8 2004-06-21 00:04:49.000000000 +0200
+++ sgml-base-1.26+nmu2/tools/update-catalog.8 2011-12-04 12:48:06.000000000 +0100
@@ -34,6 +34,11 @@
.RI [ options ]
.B --remove
.I centralized_catalog ordinary_catalog
+.PP
+.B update-catalog
+.RI [ options ]
+.B --update
+.I centralized_catalog ordinary_catalogs
.\"
.\" ----------------------------------------------------------------------
.SH DESCRIPTION
@@ -49,7 +54,7 @@
.SH OPTIONS
.TP
.B --add
-Adds an entry for the
+Adds or enables an entry for the
.I centralized_catalog
in the super catalog
.IR /etc/sgml/catalog ,
@@ -59,7 +64,7 @@
.IR centralized_catalog .
.TP
.B --remove
-Removes the entry for the
+Disables the entry for the
.I centralized_catalog
from the super catalog
.IR /etc/sgml/catalog ,
@@ -68,6 +73,13 @@
from the
.IR centralized_catalog .
.TP
+.B --update
+Updates the given
+.I centralized_catalog
+with all the passed
+.I ordinary_catalogs
+by removing all no longer known catalogs (disabled or not) and adding previously unknown catalogs.
+.TP
.B --quiet
Prevents the usual diagnostic output.
.TP
More information about the debian-xml-sgml-pkgs
mailing list