Package: debhelper
Version: 12.4
Severity: wishlist

Packages containing a GSettings schema currently generate a dependency
on "dconf-gsettings-backend | gsettings-backend", so that whenever an
application or library has settings, they actually get stored on disk
(rather than only existing in memory, with a warning, which is GLib's
fallback behaviour if no GSettings backend is available).

Some participants in a recent thread on -devel assert that this is too
strong, either for GSettings schemas associated with libraries or for all
GSettings schemas, and should be a Recommends or even a Suggests. Without
taking a position on the correct balance between "weaken non-essential
Depends to Recommends to make the system more flexible" and "don't
lose user configuration", this is not currently possible, because
dh_installgsettings always generates a hard dependency.

If it is desirable to make it possible to weaken dependencies on a
GSettings backend to Recommends or Suggests, without accidentally
weakening other dependencies that happen to go via ${misc:Depends}
and are more important, then dh_installgsettings should have an option
analogous to "dpkg-shlibdeps -dRecommends", perhaps something like the
attached patch.

Looking at the other dh scripts for other mentions of misc:Depends:

* dh_gconf is in the same situation as dh_installgsettings, but GConf is
  obsolete anyway, and nobody seems to have objected to the dependency
  in the 15 years since it was added, so I think that one can be ignored.

* dh_installcatalogs adds a dependency on sgml-base, so that its triggers
  will be run. Is this essential to the functionality of SGML stuff or
  could a maintainer have valid reasons to weaken it?

* dh_installdebconf adds a dependency on a debconf implementation, but the
  man page only says it "probably" needs to depend on debconf, so perhaps
  this one should be possible to weaken?

* dh_installdocs adds a dependency on the package with linked documentation,
  which Policy ยง12.5 says has to be a hard dependency, so this is correct.

* dh_installinit and dh_installsystemduser add a versioned dependency on
  init-system-helpers, which is used from maintainer scripts (so it's
  correct to be a hard dependency) and is Essential anyway.

* dh_installxfonts adds a dependency on xfonts-utils, again for the
  maintainer script. This is guarded by `which` so maybe it should be
  possible to weaken? (I don't know.)

* dh_ucf unconditionally uses ucf in the maintainer scripts, so a hard
  dependency is certainly correct.

Regards,
    smcv
>From a80dd94cf062fbcd6fb0e675d714556f6f68d3d9 Mon Sep 17 00:00:00 2001
From: Simon McVittie <s...@debian.org>
Date: Fri, 16 Aug 2019 09:42:00 +0100
Subject: [PATCH] dh_installgsettings: Allow dependency to be weakened

Signed-off-by: Simon McVittie <s...@debian.org>
---
 dh_installgsettings                         | 18 ++++++-
 t/dh_installgsettings/debian/changelog      |  5 ++
 t/dh_installgsettings/debian/control        | 25 +++++++++
 t/dh_installgsettings/dh_installgsettings.t | 59 +++++++++++++++++++++
 4 files changed, 106 insertions(+), 1 deletion(-)
 create mode 100644 t/dh_installgsettings/debian/changelog
 create mode 100644 t/dh_installgsettings/debian/control
 create mode 100755 t/dh_installgsettings/dh_installgsettings.t

diff --git a/dh_installgsettings b/dh_installgsettings
index 45b228eb..3198929e 100755
--- a/dh_installgsettings
+++ b/dh_installgsettings
@@ -53,9 +53,20 @@ priority instead of 10. Higher values than ten can be used by
 derived distributions (20), blend distributions (50), or site-specific
 packages (90).
 
+=item B<--field> I<field>
+
+If the package contains GSettings schemas, add a suitable GSettings
+backend to the substvar B<misc:>I<field> instead of B<misc:Depends>.
+For example, if the settings described in a package's schemas are
+considered to be non-critical and it would be acceptable to fall back
+to the in-memory backend on unusually minimal systems, the maintainer
+could use B<dh_installgsettings --field Recommends>, and add
+B<Recommends: ${misc:Recommends}> in F<debian/control>.
+
 =cut
 
 init(options => {
+	"field=s" => \$dh{FIELD},
 	"priority=s" => \$dh{PRIORITY},
 });
 
@@ -64,6 +75,11 @@ if (defined $dh{PRIORITY}) {
 	$priority=$dh{PRIORITY};
 }
 
+my $field='Depends';
+if (defined $dh{FIELD}) {
+	$field=$dh{FIELD};
+}
+
 # PROMISE: DH NOOP WITHOUT gsettings-override tmp(usr/share/glib-2.0/schemas) cli-options()
 
 foreach my $package (@{$dh{DOPACKAGES}}) {
@@ -84,7 +100,7 @@ foreach my $package (@{$dh{DOPACKAGES}}) {
 							 '(', '-name', '*.xml', '-o', '-name', '*.override',
 							 ')', '-printf', '%P');
 		if ($schemas ne '') {
-			addsubstvar($package, "misc:Depends", "dconf-gsettings-backend | gsettings-backend");
+			addsubstvar($package, "misc:$field", "dconf-gsettings-backend | gsettings-backend");
 		}
 	}
 }
diff --git a/t/dh_installgsettings/debian/changelog b/t/dh_installgsettings/debian/changelog
new file mode 100644
index 00000000..5850f0e2
--- /dev/null
+++ b/t/dh_installgsettings/debian/changelog
@@ -0,0 +1,5 @@
+foo (1.0-1) unstable; urgency=low
+
+  * Initial release. (Closes: #XXXXXX)
+
+ -- Test <testing@nowhere>  Mon, 11 Jul 2016 18:10:59 +0200
diff --git a/t/dh_installgsettings/debian/control b/t/dh_installgsettings/debian/control
new file mode 100644
index 00000000..b402ff69
--- /dev/null
+++ b/t/dh_installgsettings/debian/control
@@ -0,0 +1,25 @@
+Source: foo
+Section: misc
+Priority: optional
+Maintainer: Test <testing@nowhere>
+Standards-Version: 3.9.8
+
+Package: has-settings
+Architecture: all
+Depends: ${misc:Depends}
+Description: package has-settings
+ This package has a GSettings schema.
+
+Package: has-unimportant-settings
+Architecture: all
+Depends: ${misc:Depends}
+Recommends: ${misc:Recommends}
+Description: package has-unimportant-settings
+ This package has a GSettings schema but it represents unimportant
+ settings.
+
+Package: no-settings
+Architecture: all
+Depends: ${misc:Depends}
+Description: package no-settings
+ This package doesn't have a GSettings schema.
diff --git a/t/dh_installgsettings/dh_installgsettings.t b/t/dh_installgsettings/dh_installgsettings.t
new file mode 100755
index 00000000..36953d95
--- /dev/null
+++ b/t/dh_installgsettings/dh_installgsettings.t
@@ -0,0 +1,59 @@
+#!/usr/bin/perl
+use strict;
+use Test::More;
+
+use autodie;
+use File::Basename qw(dirname);
+use lib dirname(dirname(__FILE__));
+use Test::DH;
+use File::Path qw(remove_tree make_path);
+use Debian::Debhelper::Dh_Lib qw(!dirname);
+
+our @TEST_DH_EXTRA_TEMPLATE_FILES = (qw(
+    debian/changelog
+    debian/control
+));
+
+my $SCHEMAS = 'usr/share/glib-2.0/schemas';
+
+sub touch {
+	my $path = shift;
+	open(my $fh, '>>', $path);
+	close $fh;
+}
+
+sub slurp {
+	my $path = shift;
+	local $/ = undef;
+	open(my $fh, '<', $path);
+	my $contents = <$fh>;
+	close $fh;
+	return $contents;
+}
+
+each_compat_subtest {
+	make_path("debian/has-settings/$SCHEMAS");
+	touch("debian/has-settings/$SCHEMAS/com.example.HasSettings.xml");
+	make_path("debian/has-unimportant-settings/$SCHEMAS");
+	touch("debian/has-unimportant-settings/$SCHEMAS/com.example.HasUnimportantSettings.xml");
+	touch("debian/no-settings.substvars");
+	ok(run_dh_tool('dh_installgsettings', '-phas-settings'), 'run for has-settings');
+	ok(run_dh_tool('dh_installgsettings', '-phas-unimportant-settings', '--field=Recommends'),
+		'run for has-unimportant-settings');
+	ok(run_dh_tool('dh_installgsettings', '-pno-settings'), 'run for no-settings');
+	remove_tree(qw(debian/has-settings debian/has-unimportant-settings));
+	like(slurp('debian/has-settings.substvars'),
+		qr{^misc:Depends=dconf-gsettings-backend \| gsettings-backend$}m,
+		'has-settings should depend on a backend');
+	like(slurp('debian/has-unimportant-settings.substvars'),
+		qr{^misc:Recommends=dconf-gsettings-backend \| gsettings-backend$}m,
+		'has-unimportant-settings should Recommend a backend');
+	unlike(slurp('debian/has-unimportant-settings.substvars'),
+		qr{^misc:Depends=dconf-gsettings-backend \| gsettings-backend$}m,
+		'has-unimportant-settings should not depend on a backend');
+	unlike(slurp('debian/no-settings.substvars'),
+		qr{^misc:Depends=dconf-gsettings-backend \| gsettings-backend$}m,
+		'no-settings should not depend on a backend');
+};
+
+done_testing;
-- 
2.23.0.rc1

Reply via email to