On Sunday 21 September 2008, you wrote: > On Sun, Sep 21, 2008 at 01:33:54PM -0500, Raphael Geissert wrote: > > Forwarding a patch I sent in gahf9p$lps$3@ger.gmane.org to the BTS, so it > > is noticed. > > This one is currently on my 2.1.0 TODO list. Which should not keep > anyone else from picking it up earlier of course ;) I'm not really sure, but I think you sent me an email about this and the patch no longer applying in master. I can't confirm that you actually said that because I haven't found any email stating such a thing but well... Attached is the output of git diff origin/master -- checks/debhelper*; IOW: if the previous patch does no longer apply just don't apply those modifying checks/debhelper* and apply the one attached in this email. And since I haven't found where I sent the script that takes care of updating the data files I'm also attaching it. I hope this isn't a confusion on my side. > > Gruesse, Cheers, -- Raphael Geissert - Debian Maintainer www.debian.org - get.debian.net
diff --git a/checks/debhelper b/checks/debhelper
index 6dc81b5..0cdfb5c 100644
--- a/checks/debhelper
+++ b/checks/debhelper
@@ -25,6 +25,7 @@ use lib "$ENV{'LINTIAN_ROOT'}/lib";
use Dep;
use Tags;
use Util;
+use Lintian::Data;
# If there is no debian/compat file present but cdbs is being used, cdbs will
# create one automatically. Currently it always uses compatibility level 5.
@@ -33,38 +34,9 @@ use Util;
my $cdbscompat = 5;
-# Parse the debian/rules file, and try to figure out if debhelper commands
-# are run in it that like to modify maintainer scripts. Those debhelper
-# commands can be found by "grep -l autoscript /usr/bin/dh_*", but I'll
-# hardcode them here.
-
-my %commands;
-map { $commands{$_}=1 } qw(dh_desktop
- dh_gconf
- dh_icons
- dh_installcatalogs
- dh_installdebconf
- dh_installdefoma
- dh_installdocs
- dh_installemacsen
- dh_installinfo
- dh_installinit
- dh_installmenu
- dh_installmime
- dh_installmodules
- dh_installtex
- dh_installudev
- dh_installwm
- dh_installxfonts
- dh_installxmlcatalogs
- dh_makeshlibs
- dh_pycentral
- dh_pysupport
- dh_python
- dh_scrollkeeper
- dh_suidregister
- dh_usrlocal
- );
+my $maint_commands = Lintian::Data->new ('debhelper/maint_commands');
+my $miscDeps_commands = Lintian::Data->new ('debhelper/miscDepends_commands');
+my $dh_commands_depends = Lintian::Data->new ('debhelper/dh_commands', '=');
# The version at which debhelper commands were introduced. Packages that use
# one of these commands must have a dependency on that version of debhelper or
@@ -91,12 +63,14 @@ my $compat = '';
my $usescdbs = '';
my $seendhpython = '';
my $usescdbspython = '';
+my $needmiscdepends = 0;
+my %missingbdeps;
open(RULES, '<', "debfiles/rules") or fail("cannot read debian/rules: $!");
my $dhcompatvalue;
my @versioncheck;
while (<RULES>) {
- if (m/^\s+(dh_\w+)/) {
+ if (m/^\s+-?(dh_\w+)/) {
my $dhcommand = $1;
if ($dhcommand =~ /dh_testversion(?:\s+(.+))?/) {
$needversiondepends = $1 if ($1);
@@ -109,9 +83,16 @@ while (<RULES>) {
tag "dh_suidregister-is-obsolete", "";
}
# if command is passed -n, it does not modify the scripts
- if ($commands{$dhcommand} and not m/\s+\-n\s+/) {
+ if ($maint_commands->known($dhcommand) and not m/\s+\-n\s+/) {
$needtomodifyscripts = 1;
}
+ if ($miscDeps_commands->known($dhcommand)) {
+ $needmiscdepends = 1;
+ }
+ if ($dh_commands_depends->known($dhcommand)) {
+ my $dep = $dh_commands_depends->value($dhcommand);
+ $missingbdeps{$dep} = $dhcommand;
+ }
if ($versions{$dhcommand}) {
push (@versioncheck, $dhcommand);
}
@@ -120,11 +101,13 @@ while (<RULES>) {
} elsif (m,^\s+dh\s+,) {
$seencommand = 1;
$needbuilddepends = 1;
+ $needmiscdepends = 1;
push (@versioncheck, 'dh');
} elsif (m,^include\s+/usr/share/cdbs/1/rules/debhelper.mk,) {
$seencommand = 1;
$needbuilddepends = 1;
$needtomodifyscripts = 1;
+ $needmiscdepends = 1;
# CDBS sets DH_COMPAT but doesn't export it. It does, however, create
# a debian/compat file if none was found; that logic is handled later.
@@ -150,10 +133,23 @@ return unless $seencommand;
my $pkgs = $info->binaries;
my $single_pkg = keys(%$pkgs) == 1 ? $pkgs->{(keys(%$pkgs))[0]} : '';
+for my $binpkg (keys %$pkgs) {
+ my $depends = '';
+
+ if (open DEPENDS, '<', "control/$binpkg/depends") {
+ chomp ($depends = <DEPENDS>);
+ close(DEPENDS);
+ }
+
+ tag 'debhelper-but-no-miscDepends', $binpkg
+ if ($needmiscdepends and $depends !~ m/\$\{misc:Depends\}/
+ and $pkgs->{$binpkg} eq 'deb');
+}
+
# If we got this far, they need to have #DEBHELPER# in their scripts. Search
# for scripts that look like maintainer scripts. Also collect dependency
# information from debian/control and check compatibility level.
-my $depends;
+my $bdepends;
opendir(DEBIAN, 'debfiles')
or fail("Can't open debfiles directory.");
while (defined(my $file=readdir(DEBIAN))) {
@@ -194,16 +190,21 @@ while (defined(my $file=readdir(DEBIAN))) {
}
} elsif ($file =~ m/^control$/) {
my ($control) = read_dpkg_control("debfiles/$file");
- $depends = '';
+ $bdepends = '';
for my $field ('build-depends', 'build-depends-indep') {
next unless $control->{$field};
- $depends .= ', ' if $depends;
- $depends .= $control->{$field};
+ $bdepends .= ', ' if $bdepends;
+ $bdepends .= $control->{$field};
}
- $depends = Dep::parse($depends);
- if ($needbuilddepends && ! Dep::implies($depends, Dep::parse('debhelper'))) {
+ $bdepends = Dep::parse($bdepends);
+ if ($needbuilddepends && ! Dep::implies($bdepends, Dep::parse('debhelper'))) {
tag "package-uses-debhelper-but-lacks-build-depends", "";
}
+ for my $dep (keys %missingbdeps) {
+ my $command = $missingbdeps{$dep};
+ tag 'missing-build-dependency-for-dh_-command', "$command=$dep"
+ unless (Dep::implies($bdepends, Dep::parse($dep)));
+ }
} elsif ($file =~ m/^ex\.|\.ex$/i) {
tag "dh-make-template-in-source", "debian/$file";
}
@@ -230,13 +231,13 @@ if ($usescdbs and not $needversiondepends) {
$needversiondepends ||= 1;
if ($needversiondepends < 4) {
tag "package-uses-deprecated-debhelper-compat-version", $needversiondepends;
-} elsif ($needversiondepends > 5 and ! Dep::implies($depends, Dep::parse("debhelper (>= $needversiondepends)"))) {
+} elsif ($needversiondepends > 5 and ! Dep::implies($bdepends, Dep::parse("debhelper (>= $needversiondepends)"))) {
tag "package-lacks-versioned-build-depends-on-debhelper", $needversiondepends;
} elsif (@versioncheck) {
for my $program (@versioncheck) {
my $required = $versions{$program};
tag 'debhelper-script-needs-versioned-build-depends', $program, "(>= $required)"
- unless Dep::implies($depends, Dep::parse("debhelper (>= $required)"));
+ unless Dep::implies($bdepends, Dep::parse("debhelper (>= $required)"));
}
}
diff --git a/checks/debhelper.desc b/checks/debhelper.desc
index 603eae4..383c868 100644
--- a/checks/debhelper.desc
+++ b/checks/debhelper.desc
@@ -105,6 +105,24 @@ Info: This package uses dh_python but apparently does not tell it to use
may mean that the package has not been converted to the current Python
policy, in which case it probably should be.
+Tag: debhelper-but-no-miscDepends
+Type: warning
+Severity: normal
+Certainty: certain
+Ref: debhelper(7)
+Info: The source package uses debhelper but it does not have ${misc:Depends} on
+ the given binary package debian/control entry. This is required so the
+ dependencies are set correctly in case the result of a call to any of the dh_
+ commands cause the package to depend on another package.
+
+Tag: missing-build-dependency-for-dh_-command
+Type: error
+Severity: important
+Certainty: possible
+Info: The source package appears to be using a dh_ command but doesn't build
+ depend on the package that actually provides it. If it uses it, it must
+ build depend on it.
+
Tag: debhelper-script-needs-versioned-build-depends
Severity: normal
Certainty: certain
Attachment:
refresh-debhelper-data
Description: application/shellscript