Package: debhelper
Version: 11.2.1
Severity: minor
Tags: patch

Hi,

Thanks for maintaining and extending debhelper!

When trying to test the new B-D: debhelper-compat (= 11) mechanism on
my mdk and mdk-doc packages, I stumbled upon a minor issue: if this
dependency is the first one listed, and it's on a separate line (there
are no package names on the "Build-Depends:" line itself), then it is
not recognized because the regular expression used will not match
the whitespace before the "debhelper-compat" token.

Attached is a trivial patch.  Well, actually the trivial patch is in
the second commit; the first one adds some debhelper-compat tests and
the third one adds a test for the bug fixed by the second one.
Of course, if you feel that adding test-only functions to the Dh_Lib
module is not really proper, it's your call whether to accept just
the fix itself without the tests.

Thanks again for taking care of debhelper!

Best regards,
Peter

-- System Information:
Debian Release: buster/sid
  APT prefers testing-debug
  APT policy: (500, 'testing-debug'), (500, 'testing')
Architecture: amd64 (x86_64)
Foreign Architectures: i386

Kernel: Linux 4.15.0-3-amd64 (SMP w/4 CPU cores)
Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8), 
LANGUAGE=en_US.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/bash
Init: systemd (via /run/systemd/system)

Versions of packages debhelper depends on:
ii  autotools-dev            20180224.1
ii  dh-autoreconf            17
ii  dh-strip-nondeterminism  0.041-1
ii  dpkg                     1.19.0.5
ii  dpkg-dev                 1.19.0.5
ii  file                     1:5.32-2
ii  libdpkg-perl             1.19.0.5
ii  man-db                   2.8.3-2
ii  perl                     5.26.2-3
ii  po-debconf               1.0.20

debhelper recommends no packages.

Versions of packages debhelper suggests:
ii  dh-make  2.201701
pn  dwz      <none>

-- no debconf information
From 4680d18a5125ce6a46afa846e9b4866df0ce7a72 Mon Sep 17 00:00:00 2001
From: Peter Pentchev <r...@ringlet.net>
Date: Fri, 4 May 2018 23:59:04 +0300
Subject: [PATCH 1/3] Lay the groundwork for testing debhelper-compat.

Move the enumeration of the supported compat levels from gen-provides to
the Dh_Lib module's compat_levels() function.
Add the resetcompat() and resetpackages() testing aids to Dh_Lib.
Silence the "debhelper-compat is experimental" warning during testing.
Add the debhelper-compat/syntax.t test.
---
 debian/gen-provides               |  6 +--
 lib/Debian/Debhelper/Dh_Lib.pm    | 28 ++++++++++-
 t/debhelper-compat/debian/control | 12 +++++
 t/debhelper-compat/syntax.t       | 78 +++++++++++++++++++++++++++++++
 4 files changed, 117 insertions(+), 7 deletions(-)
 create mode 100644 t/debhelper-compat/debian/control
 create mode 100755 t/debhelper-compat/syntax.t

diff --git a/debian/gen-provides b/debian/gen-provides
index 5efd5a98..714401f1 100644
--- a/debian/gen-provides
+++ b/debian/gen-provides
@@ -2,14 +2,10 @@
 
 use strict;
 use warnings;
-use Debian::Debhelper::Dh_Version;
 use Debian::Debhelper::Dh_Lib ();
 
 my @provides;
-my $version = $Debian::Debhelper::Dh_Version::version;
-$version =~ s/~.*//; # Drop backports marker
-$version =~ s/^\d+\K\..*//;
-for (my $i = Debian::Debhelper::Dh_Lib::LOWEST_NON_DEPRECATED_COMPAT_LEVEL ; 
$i <= $version ; $i++) {
+for my $i (Debian::Debhelper::Dh_Lib::compat_levels) {
     push(@provides, "debhelper-compat (= $i)");
 }
 print "dh:CompatLevels=" . join(", ", @provides) . "\n";
diff --git a/lib/Debian/Debhelper/Dh_Lib.pm b/lib/Debian/Debhelper/Dh_Lib.pm
index 9c829f0f..9666b7ad 100644
--- a/lib/Debian/Debhelper/Dh_Lib.pm
+++ b/lib/Debian/Debhelper/Dh_Lib.pm
@@ -63,7 +63,7 @@ our (@EXPORT, %dh);
            &compute_doc_main_package &is_so_or_exec_elf_file &hostarch
            &assert_opt_is_known_package &dbgsym_tmpdir &find_hardlinks
            &should_use_root &gain_root_cmd DEFAULT_PACKAGE_TYPE
-           DBGSYM_PACKAGE_TYPE
+           DBGSYM_PACKAGE_TYPE &compat_levels &resetcompat &resetpackages
 );
 
 # The Makefile changes this if debhelper is installed in a PREFIX.
@@ -691,6 +691,12 @@ my $compat_from_bd;
        my $warned_compat = $ENV{DH_INTERNAL_TESTSUITE_SILENT_WARNINGS} ? 1 : 0;
        my $c;
 
+       # Used mainly for testing
+       sub resetcompat {
+               undef $c;
+               undef $compat_from_bd;
+       }
+
        sub compat {
                my $num=shift;
                my $nowarn=shift;
@@ -1388,6 +1394,13 @@ sub is_cross_compiling {
 my (%package_types, %package_arches, %package_multiarches, %packages_by_type,
     %package_sections, $sourcepackage, %package_cross_type);
 
+# Resets the arrays; used mostly for testing
+sub resetpackages {
+       undef $sourcepackage;
+       %package_types = %package_arches = %package_multiarches =
+           %packages_by_type = %package_sections = %package_cross_type = ();
+}
+
 # Returns source package name
 sub sourcepackage {
        getpackages() if not defined($sourcepackage);
@@ -1489,7 +1502,7 @@ sub getpackages {
                                }
                        }
                }
-               if (defined($final_level)) {
+               if (defined($final_level) && 
!$ENV{DH_INTERNAL_TESTSUITE_SILENT_WARNINGS}) {
                        warning("The use of \"debhelper-compat (= 
${final_level})\" is experimental and may change (or be retired) without 
notice");
                }
                $compat_from_bd = $final_level // -1;
@@ -2386,4 +2399,15 @@ sub dbgsym_tmpdir {
        }
 }
 
+sub compat_levels {
+       my $version;
+       eval {
+               require Debian::Debhelper::Dh_Version;
+               $version = $Debian::Debhelper::Dh_Version::version;
+       };
+       $version =~ s/~.*//; # Drop backports marker
+       $version =~ s/^\d+\K\..*//;
+       return (LOWEST_NON_DEPRECATED_COMPAT_LEVEL..$version);
+}
+
 1
diff --git a/t/debhelper-compat/debian/control 
b/t/debhelper-compat/debian/control
new file mode 100644
index 00000000..1f18f4db
--- /dev/null
+++ b/t/debhelper-compat/debian/control
@@ -0,0 +1,12 @@
+Source: foo
+Section: misc
+Priority: optional
+Build-Depends: BUILD_DEPENDS
+Maintainer: Test <testing@nowhere>
+Rules-Requires-Root: no
+Standards-Version: 3.9.8
+
+Package: foo
+Architecture: all
+Description: package foo
+ Package foo
diff --git a/t/debhelper-compat/syntax.t b/t/debhelper-compat/syntax.t
new file mode 100755
index 00000000..0f711f5f
--- /dev/null
+++ b/t/debhelper-compat/syntax.t
@@ -0,0 +1,78 @@
+#!/usr/bin/perl
+use strict;
+use warnings;
+use Test::More;
+
+use File::Basename qw(dirname);
+use lib dirname(dirname(__FILE__));
+use Test::DH;
+
+use Debian::Debhelper::Dh_Lib qw(!dirname);
+
+my $TEST_DIR = dirname(__FILE__);
+
+sub test_build_depends {
+       my ($level, $build_depends) = @_;
+       my $dir = Test::DH::tempdir(CLEANUP => 1);
+       if (not mkdir("$dir/debian", 0777)) {
+                       error("mkdir $dir/debian failed: $!");
+       }
+       open my $in, '<', "$TEST_DIR/debian/control" or
+           error("open $TEST_DIR/debian/control failed: $!");
+       open my $out, '>', "$dir/debian/control" or
+           error("open $dir/debian/control failed: $!");
+       while (<$in>) {
+               s/BUILD_DEPENDS/$build_depends/;
+               print $out $_ or
+                   error("write to $dir/debian/control failed: $!");
+       }
+       close($out) or
+           error("close $dir/debian/control failed: $!");
+       close($in);
+
+       my $start_dir = Test::DH::cwd();
+        chdir($dir) or error("chdir($dir): $!");
+
+       plan(tests => 5);
+
+       local $ENV{DH_INTERNAL_TESTSUITE_SILENT_WARNINGS} = 1;
+       resetpackages;
+       resetcompat;
+       my @pkgs = getpackages;
+       ok(scalar @pkgs == 1);
+       ok($pkgs[0] eq 'foo');
+
+       ok(compat($level));
+       ok(compat($level + 1));
+       ok(!compat($level - 1));
+
+       chdir($start_dir) or
+           error("chdir($start_dir): $!");
+}
+
+my @levels = compat_levels;
+plan(tests => scalar @levels);
+
+for my $level (@levels) {
+       subtest "compat $level" => sub {
+               plan(tests => 6);
+               subtest 'only' => sub {
+                       test_build_depends($level, "debhelper-compat (= 
$level)");
+               };
+               subtest 'first' => sub {
+                       test_build_depends($level, "debhelper-compat (= 
$level), bar");
+               };
+               subtest 'second' => sub {
+                       test_build_depends($level, "bar, debhelper-compat (= 
$level)");
+               };
+               subtest 'first-nl' => sub {
+                       test_build_depends($level, "debhelper-compat (= 
$level),\n bar");
+               };
+               subtest 'second-nl' => sub {
+                       test_build_depends($level, "bar,\n debhelper-compat (= 
$level)");
+               };
+               subtest 'nl-second' => sub {
+                       test_build_depends($level, "\n bar,\n debhelper-compat 
(= $level)");
+               };
+       };
+}
-- 
2.17.0

From 8cc0086067b77be6f3ac130a50e375c6c379e212 Mon Sep 17 00:00:00 2001
From: Peter Pentchev <r...@ringlet.net>
Date: Sat, 5 May 2018 00:09:08 +0300
Subject: [PATCH 2/3] Allow whitespace before the debhelper-compat B-D.

This allows a newline before the debhelper-compat dependency, e.g.
when all the dependencies are listed on separate rows.
---
 lib/Debian/Debhelper/Dh_Lib.pm | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/lib/Debian/Debhelper/Dh_Lib.pm b/lib/Debian/Debhelper/Dh_Lib.pm
index 9666b7ad..dffd2fad 100644
--- a/lib/Debian/Debhelper/Dh_Lib.pm
+++ b/lib/Debian/Debhelper/Dh_Lib.pm
@@ -1467,7 +1467,7 @@ sub getpackages {
                        my $value = join(' ', @{$bd_fields{$field}});
                        $value =~ s/\s*,\s*$//;
                        for my $dep (split(/\s*,\s*/, $value)) {
-                               if ($dep =~ 
m/^debhelper-compat\s*[(]\s*=\s*(${PKGVERSION_REGEX})\s*[)]$/) {
+                               if ($dep =~ 
m/^\s*debhelper-compat\s*[(]\s*=\s*(${PKGVERSION_REGEX})\s*[)]$/) {
                                        my $version = $1;
                                        if ($version =~m/^(\d+)\D.*$/) {
                                                my $guessed_compat = $1;
@@ -1483,7 +1483,7 @@ sub getpackages {
                                        error("The debhelper-compat 
build-dependency must be in the Build-Depends field (not $field)")
                                                if $field ne 'build-depends';
                                        $dh_compat_bd = $dep;
-                               } elsif ($dep =~ 
m/^debhelper-compat\s*(?:\S.*)?$/) {
+                               } elsif ($dep =~ 
m/^\s*debhelper-compat\s*(?:\S.*)?$/) {
                                        my $clevel = "${\MAX_COMPAT_LEVEL}";
                                        eval {
                                                require 
Debian::Debhelper::Dh_Version;
-- 
2.17.0

From dc869bf7e5e249b097da5f358a4535a2231b5a68 Mon Sep 17 00:00:00 2001
From: Peter Pentchev <r...@ringlet.net>
Date: Sat, 5 May 2018 00:10:38 +0300
Subject: [PATCH 3/3] Test the "whitespace before debhelper-compat" case.

---
 t/debhelper-compat/syntax.t | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/t/debhelper-compat/syntax.t b/t/debhelper-compat/syntax.t
index 0f711f5f..aaf37ccd 100755
--- a/t/debhelper-compat/syntax.t
+++ b/t/debhelper-compat/syntax.t
@@ -55,7 +55,7 @@ plan(tests => scalar @levels);
 
 for my $level (@levels) {
        subtest "compat $level" => sub {
-               plan(tests => 6);
+               plan(tests => 7);
                subtest 'only' => sub {
                        test_build_depends($level, "debhelper-compat (= 
$level)");
                };
@@ -71,6 +71,9 @@ for my $level (@levels) {
                subtest 'second-nl' => sub {
                        test_build_depends($level, "bar,\n debhelper-compat (= 
$level)");
                };
+               subtest 'nl-first' => sub {
+                       test_build_depends($level, "\n debhelper-compat (= 
$level),\n bar");
+               };
                subtest 'nl-second' => sub {
                        test_build_depends($level, "\n bar,\n debhelper-compat 
(= $level)");
                };
-- 
2.17.0

Attachment: signature.asc
Description: PGP signature

Reply via email to