Hi Daniel and Joey, I took some more time to look at Daniel's proposal and managed to come up with an implementation which consists of one debdiff to only debhelper (no sgml-base changes).
On Mon, Dec 05, 2011 at 12:05:26AM +0100, Daniel Leidert wrote: > (1) Register the catalog, if it exists (and unregister any registered > catalog, if it doesn't exist anymore). So users can remove the package > catalog file. > > (2) Register the catalog only during installation, but not during > upgrade. Usually we only add a catalog reference to the super > catalog. > > (3) Catalog files should be written at build time not during > installation. Instead of creating /etc/sgml/package.cat during > installation, this should be created during package build. So the user > can edit /etc/sgml/package.cat and /etc/sgml/catalog and we preserve > these changes. > > If the user now changes /etc/sgml/package.cat and we need to ship an > updated file, he should usually be asked, if he wishes to update the > file during installation. I implemented the above description. The details are: * prerm will no longer remove the package catalog from the root catalog during upgrade. * postrm will only remove the .old file on purge (dpkg remove the conffile /etc/sgml/$package.cat). * postinst will no longer regenerate /etc/sgml/$package.cat and only add the package catalog to the root catalog during installation (as it is no longer removed during upgrade). * dh_installcatalogs will create a /etc/sgml/$package.cat containing the same contents (without the comment header). * preinst will do the tricky transition part. If it is called during an upgrade and /etc/sgml/$package.cat is not owned by any package (this is currently the case), then it fixes up the installation. The old prerm will have the package catalog removed from the root catalog, so it is readded here. The old postinst would recreate /etc/sgml/$package.cat. This file is removed during preinst. The advantage of this approach is that the conffile can be installed without asking the user. The disadvantage of this approach is that we are overwriting user changes one more time. There is a debhelper.debdiff attached which implements the above description. I have rebuild xml-core using this patched debhelper and tried to upgrade and reinstall xml-core. However downgrading xml-core and upgrading it again results in a broken installation. Even when downgrading a package a conffile stays to be a conffile, so the preinst hook is only executed during the first upgrade. After the second upgrade the /etc/sgml/$package.cat is left untouched (being a conffile) and missing from /etc/sgml/catalog. What do you think about this approach? Helmut
diff -Nru debhelper-8.9.13/autoscripts/postinst-sgmlcatalog debhelper-8.9.13+nmu1/autoscripts/postinst-sgmlcatalog --- debhelper-8.9.13/autoscripts/postinst-sgmlcatalog 2011-08-07 02:46:45.000000000 +0200 +++ debhelper-8.9.13+nmu1/autoscripts/postinst-sgmlcatalog 2011-12-12 13:26:14.000000000 +0100 @@ -1,7 +1,3 @@ -if [ "$1" = "configure" ]; then - rm -f #CENTRALCAT# - for ordcat in #ORDCATS#; do - update-catalog --quiet --add #CENTRALCAT# ${ordcat} - done +if [ "$1" = "configure" ] && [ -z "$2" ]; then update-catalog --quiet --add --super #CENTRALCAT# fi diff -Nru debhelper-8.9.13/autoscripts/postrm-sgmlcatalog debhelper-8.9.13+nmu1/autoscripts/postrm-sgmlcatalog --- debhelper-8.9.13/autoscripts/postrm-sgmlcatalog 2011-08-07 02:46:45.000000000 +0200 +++ debhelper-8.9.13+nmu1/autoscripts/postrm-sgmlcatalog 2011-12-12 12:12:48.000000000 +0100 @@ -1,3 +1,3 @@ if [ "$1" = "purge" ]; then - rm -f #CENTRALCAT# #CENTRALCAT#.old + rm -f #CENTRALCAT#.old fi diff -Nru debhelper-8.9.13/autoscripts/preinst-sgmlcatalog debhelper-8.9.13+nmu1/autoscripts/preinst-sgmlcatalog --- debhelper-8.9.13/autoscripts/preinst-sgmlcatalog 1970-01-01 01:00:00.000000000 +0100 +++ debhelper-8.9.13+nmu1/autoscripts/preinst-sgmlcatalog 2011-12-12 14:04:43.000000000 +0100 @@ -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 and needs to be cleaned up. + rm -f #CENTRALCAT# + update-catalog --quiet --add --super #CENTRALCAT# +fi diff -Nru debhelper-8.9.13/autoscripts/prerm-sgmlcatalog debhelper-8.9.13+nmu1/autoscripts/prerm-sgmlcatalog --- debhelper-8.9.13/autoscripts/prerm-sgmlcatalog 2011-08-07 02:46:45.000000000 +0200 +++ debhelper-8.9.13+nmu1/autoscripts/prerm-sgmlcatalog 2011-12-12 12:12:07.000000000 +0100 @@ -1,3 +1,3 @@ -if [ "$1" = "remove" ] || [ "$1" = "upgrade" ]; then +if [ "$1" = "remove" ]; then update-catalog --quiet --remove --super #CENTRALCAT# fi diff -Nru debhelper-8.9.13/debian/changelog debhelper-8.9.13+nmu1/debian/changelog --- debhelper-8.9.13/debian/changelog 2011-12-09 18:53:42.000000000 +0100 +++ debhelper-8.9.13+nmu1/debian/changelog 2011-12-12 14:22:58.000000000 +0100 @@ -1,3 +1,11 @@ +debhelper (8.9.13+nmu1) unstable; urgency=low + + * Non-maintainer upload. + * Turn /etc/sgml/$package.cat into conffiles and do not touch + /etc/sgml/catalog during upgrads. Closes: #88010 + + -- Helmut Grohne <hel...@subdivi.de> Mon, 12 Dec 2011 14:21:36 +0100 + debhelper (8.9.13) unstable; urgency=low * Pass CPPFLAGS to qmake. Closes: #646129 Thanks, Felix Geyert diff -Nru debhelper-8.9.13/dh_installcatalogs debhelper-8.9.13+nmu1/dh_installcatalogs --- debhelper-8.9.13/dh_installcatalogs 2011-09-12 18:01:19.000000000 +0200 +++ debhelper-8.9.13+nmu1/dh_installcatalogs 2011-12-12 14:05:49.000000000 +0100 @@ -96,11 +96,19 @@ 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, "preinst", "preinst-sgmlcatalog", + "s%#CENTRALCAT#%$centralcat%g;"); autoscript($package, "postinst", "postinst-sgmlcatalog", - "s%#CENTRALCAT#%$centralcat%g; s%#ORDCATS#%$ordcats%g;"); + "s%#CENTRALCAT#%$centralcat%g;"); autoscript($package, "prerm", "prerm-sgmlcatalog", "s%#CENTRALCAT#%$centralcat%g;"); autoscript($package, "postrm", "postrm-sgmlcatalog",