On Mon, Apr 30, 2012 at 05:52:35PM +0200, Helmut Grohne wrote:
> On the debhelper side it should be enough to remove all remaining calls
> to update-catalog and introduce a dependency on the changed sgml-base. I
> did not test this thus far.

I worked out the remaining bits and tested them. For convenience the
very same sgml-base.debdiff as in the previous mail is attached. In
addition a debhelper.debdiff fixing this issue is attached. I verified
the following things (in pbuilder):

1) Building sgml-base NMU.
2) Building debhelper NMU.
3) Installing sgml-base NMU.
4) Upgrading sgml-base from sid to NMU.
5) Upgrading debhelper from sid to NMU.
6) Building python-docutils with debhelper NMU.
7) Upgrading docutils-common to binNMU.
8) Purging docutils-common binNMU.
9) Installing docutils-common binNMU.

I did not observe any problems like obvious failures or even conffile
questions. I looked at /etc/sgml/catalog and
/etc/sgml/docutils-common.cat after each step and verified that the
contents are sensible.

Note that downgrading sgml-base leaves artifacts.

Also note that if the debhelper.debdiff gets applied before the
sgml-base.debdiff gets applied, packages built with the updated
debhelper will be uninstallable.

I ask for feedback on this combination of patches. Since the bug is
assigned to debhelper now, I explicitly pull in the sgml-base
maintainers (who seem to be MIA).

Helmut
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        2012-04-30 17:16:27.000000000 
+0200
@@ -1,3 +1,13 @@
+sgml-base (1.26+nmu2) unstable; urgency=low
+
+  * Non-maintainer upload.
+  * Generate the super catalog from /etc/sgml directory contents.
+    This does not solve #477751, but the upcoming debhelper changes will solve
+    that bug based on this work.
+  * Do not truncate the manual pages during build.
+
+ -- Helmut Grohne <hel...@subdivi.de>  Mon, 30 Apr 2012 17:15:48 +0200
+
 sgml-base (1.26+nmu1) unstable; urgency=low
 
   * Non-maintainer upload
diff -Nru sgml-base-1.26+nmu1/debian/control sgml-base-1.26+nmu2/debian/control
--- sgml-base-1.26+nmu1/debian/control  2010-07-18 14:37:50.000000000 +0200
+++ sgml-base-1.26+nmu2/debian/control  2012-04-30 13:15:14.000000000 +0200
@@ -11,7 +11,7 @@
 Priority: optional
 Architecture: all
 Conflicts: sgml-data (<= 0.02), sgmltools-2 (<= 2.0.2-4)
-Depends: ${perl:Depends}
+Depends: ${perl:Depends}, dpkg (>= 1.14.18)
 Suggests: sgml-base-doc
 Description: SGML infrastructure and SGML catalog file support
  This package creates the SGML infrastructure directories and provides
diff -Nru sgml-base-1.26+nmu1/debian/copyright 
sgml-base-1.26+nmu2/debian/copyright
--- sgml-base-1.26+nmu1/debian/copyright        2004-06-07 05:18:28.000000000 
+0200
+++ sgml-base-1.26+nmu2/debian/copyright        2012-04-30 17:06:30.000000000 
+0200
@@ -6,6 +6,7 @@
 
 Copyright (C) 1997 Christian Schwarz <schw...@debian.org>.
 Copyright (C) 2001-2004 Ardo van Rangelrooij <a...@debian.org>
+Copyright (C) 2012 Helmut Grohne <hel...@subdivi.de>
 
 This is free software; you may redistribute it and/or modify it under
 the terms of the GNU General Public License as published by the Free
diff -Nru sgml-base-1.26+nmu1/debian/sgml-base.NEWS 
sgml-base-1.26+nmu2/debian/sgml-base.NEWS
--- sgml-base-1.26+nmu1/debian/sgml-base.NEWS   1970-01-01 01:00:00.000000000 
+0100
+++ sgml-base-1.26+nmu2/debian/sgml-base.NEWS   2012-04-30 16:37:03.000000000 
+0200
@@ -0,0 +1,13 @@
+sgml-base (1.26+nmu2) unstable; urgency=low
+
+  Starting with this release the SGML super catalog /etc/sgml/catalog will be
+  replaced with a symbolic link to /var/lib/sgml-base/supercatalog. The latter
+  file can be regenerated from the contents of the /etc/sgml directory 
including
+  all files ending in .cat using the new update-catalog --update-super option.
+  This call will be (dpkg) triggered by packages placing files in /etc/sgml. 
The
+  transition to this way of handling the super catalog will loose user changes 
to
+  /etc/sgml/catalog. Further overwriting of user changes will happen until all
+  packages using dh_installcatalogs are built with a fixed version of 
debhelper.
+  Sorry for the inconvenience.
+
+ -- Helmut Grohne <hel...@subdivi.de>  Mon, 30 Apr 2012 16:37:01 +0200
diff -Nru sgml-base-1.26+nmu1/debian/sgml-base.dirs 
sgml-base-1.26+nmu2/debian/sgml-base.dirs
--- sgml-base-1.26+nmu1/debian/sgml-base.dirs   1970-01-01 01:00:00.000000000 
+0100
+++ sgml-base-1.26+nmu2/debian/sgml-base.dirs   2012-04-30 13:16:43.000000000 
+0200
@@ -0,0 +1 @@
+var/lib/sgml-base
diff -Nru sgml-base-1.26+nmu1/debian/sgml-base.postinst 
sgml-base-1.26+nmu2/debian/sgml-base.postinst
--- sgml-base-1.26+nmu1/debian/sgml-base.postinst       2004-08-14 
17:04:15.000000000 +0200
+++ sgml-base-1.26+nmu2/debian/sgml-base.postinst       2012-04-30 
14:15:51.000000000 +0200
@@ -11,20 +11,11 @@
 then
 
     ## ------------------------------------------------------------------
-    ## create SGML root catalog
-    [ ! -f /etc/sgml/catalog ] \
-       && cp -a /usr/share/sgml-base/catalog.super /etc/sgml/catalog
-
-    ## ------------------------------------------------------------------
     ## clean up /usr/lib/sgml
     if [ -d /usr/lib/sgml ]
     then
 
        ## --------------------------------------------------------------
-        ## remove nasty old circular catalog
-       update-catalog --remove --super /usr/lib/sgml/catalog || true
-
-       ## --------------------------------------------------------------
        ## remove symlink to /etc/sgml/catalog
        rm -f /usr/lib/sgml/catalog
 
@@ -33,7 +24,6 @@
        TRANSCAT=transitional.cat
        if [ -f /usr/lib/sgml/${TRANSCAT} ]
        then
-           update-catalog --remove --super /usr/lib/sgml/${TRANSCAT} || true
            mv -f /usr/lib/sgml/${TRANSCAT} /etc/sgml/${TRANSCAT}
            if [ -f /usr/lib/sgml/${TRANSCAT}.old ]
            then
@@ -71,12 +61,12 @@
     fi
 
     ## ------------------------------------------------------------------
-    TRANSCAT=/etc/sgml/transitional.cat
-    if [ -f ${TRANSCAT} ]
-    then
-       update-catalog --add --super ${TRANSCAT}
-    fi
-
+    update-catalog --update-super
+    ln -sf /var/lib/sgml-base/supercatalog /etc/sgml/catalog
+fi
+if [ "$1" = "triggered" ]
+then
+    update-catalog --update-super
 fi
 
 ## ---------------------------------------------------------------------- 
diff -Nru sgml-base-1.26+nmu1/debian/sgml-base.postrm 
sgml-base-1.26+nmu2/debian/sgml-base.postrm
--- sgml-base-1.26+nmu1/debian/sgml-base.postrm 2010-07-17 16:15:59.000000000 
+0200
+++ sgml-base-1.26+nmu2/debian/sgml-base.postrm 2012-04-30 14:17:30.000000000 
+0200
@@ -13,6 +13,9 @@
     ## ------------------------------------------------------------------
     ## remove SGML root catalog
     rm -f /etc/sgml/catalog /etc/sgml/catalog.old
+    rm -f /var/lib/sgml-base/supercatalog
+    rm -f /var/lib/sgml-base/supercatalog.new
+    rm -f /var/lib/sgml-base/supercatalog.old
 
     ## ------------------------------------------------------------------
     ## remove /etc/sgml and /var/lib/sgml-base
diff -Nru sgml-base-1.26+nmu1/debian/sgml-base.prerm 
sgml-base-1.26+nmu2/debian/sgml-base.prerm
--- sgml-base-1.26+nmu1/debian/sgml-base.prerm  2004-08-14 17:04:15.000000000 
+0200
+++ sgml-base-1.26+nmu2/debian/sgml-base.prerm  2012-04-30 14:18:14.000000000 
+0200
@@ -14,8 +14,8 @@
     TRANSCAT=/etc/sgml/transitional.cat
     if [ -f ${TRANSCAT} ]
     then
-       update-catalog --remove --super ${TRANSCAT} || true
        rm -f ${TRANSCAT} ${TRANSCAT}.old
+       update-catalog --update-super
     fi
 
 fi
diff -Nru sgml-base-1.26+nmu1/debian/sgml-base.triggers 
sgml-base-1.26+nmu2/debian/sgml-base.triggers
--- sgml-base-1.26+nmu1/debian/sgml-base.triggers       1970-01-01 
01:00:00.000000000 +0100
+++ sgml-base-1.26+nmu2/debian/sgml-base.triggers       2012-04-30 
14:06:05.000000000 +0200
@@ -0,0 +1 @@
+interest /etc/sgml
diff -Nru sgml-base-1.26+nmu1/tools/Makefile sgml-base-1.26+nmu2/tools/Makefile
--- sgml-base-1.26+nmu1/tools/Makefile  2004-04-21 21:35:41.000000000 +0200
+++ sgml-base-1.26+nmu2/tools/Makefile  2012-04-30 17:10:00.000000000 +0200
@@ -22,9 +22,10 @@
 
 all:           $(man8s)
 
-%.$(man8_ext): %
-
-               $(POD2MAN) --section $(man8_ext) --center $(pkg_name) ${<} ${@}
+# There is no POD documentation. This just truncates the existing manual pages.
+#%.$(man8_ext):        %
+#
+#              $(POD2MAN) --section $(man8_ext) --center $(pkg_name) ${<} ${@}
 
 
 install:
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    2012-04-30 17:20:52.000000000 
+0200
@@ -3,6 +3,7 @@
 ## Debian GNU/Linux update-catalog version 0.2
 ## ----------------------------------------------------------------------
 ## Copyright (c) 2001-2004 Ardo van Rangelrooij
+## Copyright (c) 2012 Helmut Grohne
 ##
 ## This is free software; see the GNU General Public Licence version 2
 ## or later for copying conditions.  There is NO warranty.
@@ -28,6 +29,7 @@
 use vars qw( $quiet );
 use vars qw( $remove );
 use vars qw( $super );
+use vars qw( $updatesuper );
 use vars qw( $template );
 use vars qw( $type );
 
@@ -56,6 +58,10 @@
     {
         $debug = 1;
     }
+    elsif ( $_ eq '--update-super' )
+    {
+        $updatesuper = 1;
+    }
     elsif ( $_ eq '--help' )
     {
         &help;
@@ -75,16 +81,22 @@
 }
 
 ## ----------------------------------------------------------------------
-if ( ! @ARGV )
+if ( $add + $remove + $updatesuper != 1)
 {
-    print STDERR "\n";
-    &help;
+    print "Huh? You have to use precisely one out of --add --remove or 
--update-super.\n";
     exit 1;
 }
 
 ## ----------------------------------------------------------------------
 if ( $add || $remove )
 {
+    if ( ! @ARGV )
+    {
+        print STDERR "\n";
+        &help;
+        exit 1;
+    }
+
     if ( $super )
     {
        $catalog = '/etc/sgml/catalog';
@@ -93,18 +105,16 @@
     {
        $catalog = shift( @ARGV );
     }
-}
 
-## ----------------------------------------------------------------------
-if ( ! @ARGV )
-{
-    print STDERR "\n";
-    &help;
-    exit 1;
-}
+    if ( ! @ARGV )
+    {
+        print STDERR "\n";
+        &help;
+        exit 1;
+    }
 
-## ----------------------------------------------------------------------
-$entry = shift( @ARGV );
+    $entry = shift( @ARGV );
+}
 
 ## ----------------------------------------------------------------------
 if ( @ARGV )
@@ -115,18 +125,24 @@
 }
 
 ## ----------------------------------------------------------------------
-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;
 
 ## ----------------------------------------------------------------------
-if ( $add )
+if ( $super )
+{
+    print "update-catalog: Suppressing action on super catalog. Invoking 
trigger instead.\n";
+    system("dpkg-trigger /etc/sgml");
+    if ( $? != 0 )
+    {
+        print "Invocation of dpkg-trigger failed with status $?.\n";
+        print "Forcing update of the super catalog...\n";
+        &update_super;
+    } else {
+        print "update-catalog: Please rebuild the package being set up with a 
version of debhelper fixing #477751.\n";
+    }
+}
+elsif ( $add )
 {
     print "Adding entry $entry to catalog $catalog...\n"
         unless $quiet;
@@ -143,6 +159,12 @@
     &read_catalog_without_entry;
     &write_catalog;
 }
+elsif ( $updatesuper )
+{
+    print "Updating the super catalog...\n"
+        unless $quiet;
+    &update_super;
+}
 
 ## ----------------------------------------------------------------------
 exit 0;
@@ -218,6 +240,46 @@
 }
 
 ## ----------------------------------------------------------------------
+sub update_super
+{
+    my(@cats);
+    my($catdir)="/etc/sgml";
+    my($supercat)="/var/lib/sgml-base/supercatalog";
+    opendir(CATDIR, $catdir)
+        or die "cannot open catalog directory $catdir: $!";
+    while( readdir CATDIR )
+    {
+        m/^[^.].*\.cat$/ or next;
+        push(@cats, $catdir . "/" . $_);
+    }
+    closedir(CATDIR)
+        or die "cannot close catalog directory $catdir: $!";
+    if ( not $debug )
+    {
+        open( CATALOG, ">$supercat.new")
+            or die "cannot open $supercat.new for writing: $!";
+        print CATALOG "--\n";
+        print CATALOG "## This file is created by update-catalog 
--update-super.\n";
+        print CATALOG "## Please see update-catalog(8) for how to modify this 
file.\n";
+        print CATALOG "--\n";
+        for ( @cats ) { print CATALOG "CATALOG $_\n"; }
+        close( CATALOG );
+        if( -e $supercat)
+        {
+            rename( $supercat, "$supercat.old" )
+                or die "cannot rename $supercat to $supercat.old: $!";
+        }
+        rename( "$supercat.new", $supercat )
+            or die "cannot rename $supercat.new to $supercat: $!";
+   }
+   else
+   {
+        print "The new super catalog would contain the following entries.\n";
+        for ( @cats ) { print "CATALOG $_\n"; }
+   }
+}
+
+## ----------------------------------------------------------------------
 sub help
 {
     print STDERR <<END;
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  2012-04-30 17:07:09.000000000 
+0200
@@ -17,57 +17,58 @@
 .SH SYNOPSIS
 .B update-catalog
 .RI [ options ]
-.B --add --super
-.I centralized_catalog
-.PP
-.B update-catalog
-.RI [ options ]
 .B --add
 .I centralized_catalog ordinary_catalog
 .PP
 .B update-catalog
 .RI [ options ]
-.B --remove --super
-.I centralized_catalog
+.B --remove
+.I centralized_catalog ordinary_catalog
 .PP
 .B update-catalog
 .RI [ options ]
-.B --remove
-.I centralized_catalog ordinary_catalog
+.B --update-super
 .\"
 .\" ----------------------------------------------------------------------
 .SH DESCRIPTION
 .PP
 .B update-catalog
-inserts, updates or removes entries in the SGML super catalog
-.I /etc/sgml/catalog
-and the
+inserts, updates or removes entries in the 
 SGML centralized catalogs located in
 .IR /etc/sgml .
+To change the SGML super catalog located in
+.IR /etc/sgml/catalog
+modify the directory contents of
+.IR /etc/sgml
+to contain new files or symbolic links having a
+.B .cat
+extension or remove (or move) existing centralized catalogs and regenerate the 
super catalog using the
+.B --update-super
+option.
 .\"
 .\" ----------------------------------------------------------------------
 .SH OPTIONS
 .TP
 .B --add
 Adds an entry for the
-.I centralized_catalog
-in the super catalog
-.IR /etc/sgml/catalog ,
-or an entry for the
 .I ordinary_catalog
 in the
 .IR centralized_catalog .
 .TP
 .B --remove
 Removes the entry for the
-.I centralized_catalog
-from the super catalog
-.IR /etc/sgml/catalog ,
-or the entry for the
 .I ordinary_catalog
 from the
 .IR centralized_catalog .
 .TP
+.B --update-super
+Regenerates the SGML super catalog from the contents of the
+.IR /etc/sgml
+directory including all files having a
+.B .cat
+extension.
+Files ending in .disabled or .old for instance are not considered.
+.TP
 .B --quiet
 Prevents the usual diagnostic output.
 .TP
@@ -88,6 +89,7 @@
 .\" ----------------------------------------------------------------------
 .SH COPYRIGHT
 Copyright \(co 2001-2004 Ardo van Rangelrooij
+Copyright \(co 2012 Helmut Grohne
 
 This is free software; see the GNU General Public Licence version 2 or
 later for copying conditions.  There is
diff -Nru debhelper-9.20120419/autoscripts/postinst-sgmlcatalog 
debhelper-9.20120419+nmu1/autoscripts/postinst-sgmlcatalog
--- debhelper-9.20120419/autoscripts/postinst-sgmlcatalog       2011-08-07 
02:46:45.000000000 +0200
+++ debhelper-9.20120419+nmu1/autoscripts/postinst-sgmlcatalog  1970-01-01 
01:00:00.000000000 +0100
@@ -1,7 +0,0 @@
-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
diff -Nru debhelper-9.20120419/autoscripts/postrm-sgmlcatalog 
debhelper-9.20120419+nmu1/autoscripts/postrm-sgmlcatalog
--- debhelper-9.20120419/autoscripts/postrm-sgmlcatalog 2011-08-07 
02:46:45.000000000 +0200
+++ debhelper-9.20120419+nmu1/autoscripts/postrm-sgmlcatalog    2012-05-04 
14:43:14.000000000 +0200
@@ -1,3 +1,3 @@
 if [ "$1" = "purge" ]; then
-       rm -f #CENTRALCAT# #CENTRALCAT#.old
+       rm -f #CENTRALCAT#.old
 fi
diff -Nru debhelper-9.20120419/autoscripts/preinst-sgmlcatalog 
debhelper-9.20120419+nmu1/autoscripts/preinst-sgmlcatalog
--- debhelper-9.20120419/autoscripts/preinst-sgmlcatalog        1970-01-01 
01:00:00.000000000 +0100
+++ debhelper-9.20120419+nmu1/autoscripts/preinst-sgmlcatalog   2012-05-04 
14:44:17.000000000 +0200
@@ -0,0 +1,7 @@
+if [ "$1" = "upgrade" ] && ! dpkg-query -S #CENTRALCAT# >/dev/null 2>&1; then
+       # If the dpkg-query command returns non-zero, the central catalog is
+       # not owned by any package. This is due to an old behaviour of
+       # debhelper. Now that file becomes a conffile. In order to avoid a
+       # question during installation, we remove the old non-conffile.
+       rm -f #CENTRALCAT#
+fi
diff -Nru debhelper-9.20120419/autoscripts/prerm-sgmlcatalog 
debhelper-9.20120419+nmu1/autoscripts/prerm-sgmlcatalog
--- debhelper-9.20120419/autoscripts/prerm-sgmlcatalog  2011-08-07 
02:46:45.000000000 +0200
+++ debhelper-9.20120419+nmu1/autoscripts/prerm-sgmlcatalog     1970-01-01 
01:00:00.000000000 +0100
@@ -1,3 +0,0 @@
-if [ "$1" = "remove" ] || [ "$1" = "upgrade" ]; then
-       update-catalog --quiet --remove --super #CENTRALCAT#
-fi
diff -Nru debhelper-9.20120419/debian/changelog 
debhelper-9.20120419+nmu1/debian/changelog
--- debhelper-9.20120419/debian/changelog       2012-04-18 01:33:44.000000000 
+0200
+++ debhelper-9.20120419+nmu1/debian/changelog  2012-05-04 14:45:47.000000000 
+0200
@@ -1,3 +1,11 @@
+debhelper (9.20120419+nmu1) unstable; urgency=low
+
+  * Non-maintainer upload.
+  * Turn /etc/sgml/$package.cat into conffiles and introduce dependency
+    on trigger-based sgml-base. Closes: #477751
+
+ -- Helmut Grohne <hel...@subdivi.de>  Fri, 04 May 2012 14:44:52 +0200
+
 debhelper (9.20120419) unstable; urgency=low
 
   * Fix compat level checking for cmake. Closes: #669181
diff -Nru debhelper-9.20120419/dh_installcatalogs 
debhelper-9.20120419+nmu1/dh_installcatalogs
--- debhelper-9.20120419/dh_installcatalogs     2011-09-12 18:01:19.000000000 
+0200
+++ debhelper-9.20120419+nmu1/dh_installcatalogs        2012-05-04 
15:08:23.000000000 +0200
@@ -9,7 +9,7 @@
 use strict;
 use Debian::Debhelper::Dh_Lib;
 
-my $sgmlbasever = "1.17";
+my $sgmlbasever = "1.26+nmu2";
 
 =head1 SYNOPSIS
 
@@ -96,12 +96,16 @@
                        doit("install","-d","-m755","$tmpdir/etc/sgml");
                }
 
+               my $centralcat = "/etc/sgml/$package.cat";
+
+               open(CENTRALCAT, ">", "$tmpdir$centralcat") || error("failed to 
write to $tmpdir$centralcat");
+               foreach my $sgmldest (@sgmlinstalled) {
+                       print CENTRALCAT "CATALOG " . $sgmldest . "\n";
+               }
+               close CENTRALCAT;
+
                if (! $dh{NOSCRIPTS}) {
-                       my $ordcats = join(" ", @sgmlinstalled);
-                       my $centralcat = "/etc/sgml/$package.cat";
-                       autoscript($package, "postinst", "postinst-sgmlcatalog",
-                                  "s%#CENTRALCAT#%$centralcat%g; 
s%#ORDCATS#%$ordcats%g;");
-                       autoscript($package, "prerm", "prerm-sgmlcatalog",
+                       autoscript($package, "preinst", "preinst-sgmlcatalog",
                                   "s%#CENTRALCAT#%$centralcat%g;");
                        autoscript($package, "postrm", "postrm-sgmlcatalog",
                                   "s%#CENTRALCAT#%$centralcat%g;");

Reply via email to