[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#708178: lintian: Improve the version information of packages bundled with the Perl core



Package: lintian
Version: 2.5.10.5 
Tags: patch
X-Debbugs-Cc: perl@packages.debian.org

#708020 made me curious about why the
libjavascript-minifier-xs-perl_0.09-1 source package doesn't trigger the
'versioned-dependency-satisfied-by-perl' tag.

It turns out that private/refresh-perl-provides is rather simple minded
about the mapping between CPAN and Debian version numbers. I expect this
has caused a number of false negatives.

We've since tackled very similar issues in the maintainer tests of the
perl source package, where we check that the versioned Breaks of the
binary packages make sense. The meat of the attached patch set is based
on this work.

Please consider these patches for Lintian.
-- 
Niko Tyni   ntyni@debian.org
>From 3c0cb4b01f15e46f13677c79a2f4e3e4a68c1f1c Mon Sep 17 00:00:00 2001
From: Niko Tyni <ntyni@debian.org>
Date: Sun, 12 May 2013 22:33:24 +0300
Subject: [PATCH 1/5] Update the test suite to reflect libfile-temp-perl
 removal

libfile-temp-perl is not currently in Debian unstable, so
refreshing data/fields/perl-provides causes a test failure.
Use libthreads-shared-perl instead in the hope it will stay
separately packaged.
---
 t/tests/fields-depends-general/debian/debian/control.in |    2 +-
 t/tests/fields-depends-general/tags                     |    2 +-
 testset/relations/debian/control                        |    2 +-
 testset/tags.relations                                  |    2 +-
 4 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/t/tests/fields-depends-general/debian/debian/control.in b/t/tests/fields-depends-general/debian/debian/control.in
index 7f78bfd..40fd0c9 100644
--- a/t/tests/fields-depends-general/debian/debian/control.in
+++ b/t/tests/fields-depends-general/debian/debian/control.in
@@ -9,7 +9,7 @@ Package: {$srcpkg}
 Architecture: {$architecture}
 Depends: $\{shlibs:Depends\}, $\{misc:Depends\}, xorg, bash,
  conflict-dep, gawk | awk, new-package | xbase-clients, {$srcpkg},
- gaim, emacs21, emacs22, makedev, libfile-temp-perl (>= 0.18),
+ gaim, emacs21, emacs22, makedev, libthreads-shared-perl (>= 1.29),
  packaging-dev, xfont-a
 Breaks: package-without-version, {$srcpkg} (<< 0.1),
  replaced-wo-version
diff --git a/t/tests/fields-depends-general/tags b/t/tests/fields-depends-general/tags
index fedbc28..8d0f243 100644
--- a/t/tests/fields-depends-general/tags
+++ b/t/tests/fields-depends-general/tags
@@ -16,5 +16,5 @@ W: fields-depends-general: depends-on-old-emacs depends: emacs21
 W: fields-depends-general: depends-on-old-emacs depends: emacs22
 W: fields-depends-general: depends-on-packaging-dev depends
 W: fields-depends-general: package-relation-with-self breaks: fields-depends-general (<< 0.1)
-W: fields-depends-general: versioned-dependency-satisfied-by-perl depends: libfile-temp-perl (>= 0.18)
+W: fields-depends-general: versioned-dependency-satisfied-by-perl depends: libthreads-shared-perl (>= 1.29)
 W: libfields-depends-general: lib-recommends-documentation recommends: debconf-doc
diff --git a/testset/relations/debian/control b/testset/relations/debian/control
index 4d226c7..a4c4834 100644
--- a/testset/relations/debian/control
+++ b/testset/relations/debian/control
@@ -17,7 +17,7 @@ Package: relations
 Architecture: all
 Section: contrib/misc
 Pre-Depends: awk|gawk
-Depends: relations(<< 3), dpkg, bash (>> 2.0 ), mail-transport-agent, gawk | awk, foo (>> 2.0), foo (<< 2.2), coreutils, ,null (>= 0), ${misc:Depends}, makedev, libfile-temp-perl (>= 0.18)
+Depends: relations(<< 3), dpkg, bash (>> 2.0 ), mail-transport-agent, gawk | awk, foo (>> 2.0), foo (<< 2.2), coreutils, ,null (>= 0), ${misc:Depends}, makedev, libthreads-shared-perl (>= 1.29)
 Provides: mail-reader
 Replaces: relations
 Conflicts: foobar (<< 5+5), foo, relations,
diff --git a/testset/tags.relations b/testset/tags.relations
index aee95e4..6813270 100644
--- a/testset/tags.relations
+++ b/testset/tags.relations
@@ -62,6 +62,6 @@ W: relations: depends-on-old-emacs recommends: emacs21
 W: relations: package-relation-with-self depends: relations (<< 3)
 W: relations: redundant-bugs-field
 W: relations: redundant-origin-field
-W: relations: versioned-dependency-satisfied-by-perl depends: libfile-temp-perl (>= 0.18)
+W: relations: versioned-dependency-satisfied-by-perl depends: libthreads-shared-perl (>= 1.29)
 W: relations: virtual-package-depends-without-real-package-depends depends: mail-transport-agent
 W: relations: virtual-package-depends-without-real-package-depends pre-depends: awk
-- 
1.7.10.4

>From fac81188d9225b288818be5c44532a1a0df95476 Mon Sep 17 00:00:00 2001
From: Niko Tyni <ntyni@debian.org>
Date: Sun, 12 May 2013 22:38:01 +0300
Subject: [PATCH 2/5] Refreshed perl-provides against current unstable

---
 data/fields/perl-provides |   10 ++--------
 1 file changed, 2 insertions(+), 8 deletions(-)

diff --git a/data/fields/perl-provides b/data/fields/perl-provides
index 530f760..6464a66 100644
--- a/data/fields/perl-provides
+++ b/data/fields/perl-provides
@@ -8,11 +8,12 @@
 # in the lintian source tree
 #
 # last updated for PERL_VERSION=5.014002
-libtime-piece-perl 1.20.01
+libsocket-perl 1.94
 libthreads-shared-perl 1.37
 libthreads-perl 1.83
 libsys-syslog-perl 0.27
 libio-compress-perl 2.033
+libio-compress-base-perl 2.033
 libencode-perl 2.42.01
 libdigest-sha-perl 5.61
 libdevel-dprof-perl 20110228.00
@@ -21,7 +22,6 @@ libcompress-raw-bzip2-perl 2.033
 libversion-requirements-perl 0.101020
 libversion-perl 0.88
 libunicode-collate-perl 0.73
-libtime-local-perl 1.2000
 libthread-queue-perl 2.12
 libtest-simple-perl 0.98
 libtest-harness-perl 3.23
@@ -29,22 +29,16 @@ libshell-perl 0.72.01
 libpod-simple-perl 3.16
 libperl-ostype-perl 1.002
 libparse-cpan-meta-perl 1.4401
-libparent-perl 0.225
-libmodule-pluggable-perl 3.9
 libmodule-metadata-perl 1.000004
 libmodule-load-conditional-perl 0.44
 libmodule-corelist-perl 2.49.02
 libmodule-build-perl 0.3800
 libmath-complex-perl 1.56
 libmath-bigint-perl 1.994
-liblocale-maketext-simple-perl 0.21
 libjson-pp-perl 2.27105
 libhttp-tiny-perl 0.012
-libfile-temp-perl 0.22
 libfile-spec-perl 3.33
-libfile-path-perl 2.08.01
 libextutils-parsexs-perl 2.2210
-libextutils-command-perl 1.17
 libextutils-cbuilder-perl 0.280203
 libdigest-perl 1.16
 libcpan-meta-yaml-perl 0.003
-- 
1.7.10.4

>From 6e12ed0474c249d7a7a2a9635b446be728b2e084 Mon Sep 17 00:00:00 2001
From: Niko Tyni <ntyni@debian.org>
Date: Sun, 12 May 2013 22:01:36 +0300
Subject: [PATCH 3/5] Improve the version information of packages bundled with
 the Perl core

There are various incompatibilities with the CPAN and Debian versioning
schemes. Try to be smarter about deriving Debian version numbers from
Module::CoreList data, taking epochs and varying number of decimal digits
into account.

Most of this code is reused from the Debian maintainer tests of the
Perl package (debian/t/control.t in the 'perl' source package, 5.14.2-21
or so at the time of this writing.)
---
 private/refresh-perl-provides |   74 +++++++++++++++++++++++++++++++++++++----
 1 file changed, 67 insertions(+), 7 deletions(-)

diff --git a/private/refresh-perl-provides b/private/refresh-perl-provides
index a31d53b..b995292 100755
--- a/private/refresh-perl-provides
+++ b/private/refresh-perl-provides
@@ -85,17 +85,25 @@ for my $pkg (@core_packages) {
         my $name = $provides->{Name};
         # skip virtual-only packages
         next if (!$cache->{$name}{VersionList});
-        my $version = find_core_version($name);
-        next if !$version;
+        my $cpan_version = find_core_version($name);
 
-        # the underscore notates a CPAN development version;
-        # these may need special casing with some packages
-        $version =~ s/_/./g;
-        print "$name $version\n";
+        next if !$cpan_version;
+
+        # the number of digits is a pain
+        #  we use the current version in the Debian archive to determine
+        #  how many we need
+        # the epoch is easier, we just copy it
+
+        my ($epoch, $digits) = epoch_and_digits($name);
+        my $debian_version = cpan_version_to_deb($cpan_version, $epoch, $digits);
+
+        next if !$debian_version;
+
+        print "$name $debian_version\n";
     }
 }
 
-# look up the version of a package in the core
+# look up the CPAN version of a package in the core
 sub find_core_version {
     my $module = shift;
     my $ret;
@@ -118,6 +126,58 @@ sub find_core_version {
     return $ret;
 }
 
+sub cpan_version_to_deb {
+        my $cpan_version = shift;
+        my $epoch = shift || '';
+        my $digits = shift;
+
+        # cpan_version
+        #         digits
+        #                result
+        # 1.15_02,  2 => 1.15.02
+        # 1.15_02,  4 => 1.1502
+        # 1.15_02,  0 => 1.15.02
+        # 
+        # 1.15_021, 2 => 1.15.021
+        # 1.15_021, 4 => 1.1500.021
+        # 1.15_021, 0 => 1.15.021
+        #
+        # 1.15,     1 => 1.15
+        # 1.15,     2 => 1.15
+        # 1.15,     4 => 1.1500
+        # 1.15,     0 => 1.15
+
+        # split 1.15_02 to (1, 15, 02)
+        my ($major, $prefix, $suffix) = ($cpan_version =~ /^(\d+\.)(\d+)(?:_(\d+))?$/);
+        die("no match with $cpan_version?") if !$major;
+
+        $suffix ||= '';
+        if (length($suffix) + length($prefix) == $digits) {
+                $prefix .= $suffix;
+                $suffix = '';
+        }
+        if (length($suffix) + length($prefix) < $digits) {
+                $prefix .= '0' while length($prefix) < $digits;
+        }
+        $suffix = ".$suffix" if $suffix ne '';
+        $epoch.$major.$prefix.$suffix;
+}
+
+# Given a Debian binary package name, look up its latest version
+# and return its epoch (including the colon) if available, and
+# the number of digits in its decimal part
+sub epoch_and_digits {
+    my $p = shift;
+    return (0, 0) if !exists $cache->{$p};
+    return (0, 0) if !exists $cache->{$p}{VersionList}; # virtual package
+    my $latest = bin_latest($cache->{$p});
+    my $v = $latest->{VerStr};
+    $v =~ s/\+dfsg//;
+    my ($epoch, $major, $prefix, $suffix, $revision) =
+        ($v =~ /^(?:(\d+:))?((?:\d+\.))+(\d+)(?:_(\d+))?(-[^-]+)$/);
+    return ($epoch, length $prefix);
+}
+
 sub bin_latest {
     my $p = shift;
     return (sort bin_byversion @{$p->{VersionList}})[-1];
-- 
1.7.10.4

>From a673455a1ac93f27a175020b02d8efd3d9f1770a Mon Sep 17 00:00:00 2001
From: Niko Tyni <ntyni@debian.org>
Date: Sun, 12 May 2013 22:39:03 +0300
Subject: [PATCH 4/5] Refreshed perl-provides with the improved versioning
 logic

---
 data/fields/perl-provides |   10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/data/fields/perl-provides b/data/fields/perl-provides
index 6464a66..710c465 100644
--- a/data/fields/perl-provides
+++ b/data/fields/perl-provides
@@ -8,7 +8,7 @@
 # in the lintian source tree
 #
 # last updated for PERL_VERSION=5.014002
-libsocket-perl 1.94
+libsocket-perl 1.940
 libthreads-shared-perl 1.37
 libthreads-perl 1.83
 libsys-syslog-perl 0.27
@@ -20,7 +20,7 @@ libdevel-dprof-perl 20110228.00
 libcompress-raw-zlib-perl 2.033
 libcompress-raw-bzip2-perl 2.033
 libversion-requirements-perl 0.101020
-libversion-perl 0.88
+libversion-perl 1:0.8800
 libunicode-collate-perl 0.73
 libthread-queue-perl 2.12
 libtest-simple-perl 0.98
@@ -32,13 +32,13 @@ libparse-cpan-meta-perl 1.4401
 libmodule-metadata-perl 1.000004
 libmodule-load-conditional-perl 0.44
 libmodule-corelist-perl 2.49.02
-libmodule-build-perl 0.3800
+libmodule-build-perl 0.380000
 libmath-complex-perl 1.56
 libmath-bigint-perl 1.994
 libjson-pp-perl 2.27105
 libhttp-tiny-perl 0.012
-libfile-spec-perl 3.33
-libextutils-parsexs-perl 2.2210
+libfile-spec-perl 3.3300
+libextutils-parsexs-perl 2.221000
 libextutils-cbuilder-perl 0.280203
 libdigest-perl 1.16
 libcpan-meta-yaml-perl 0.003
-- 
1.7.10.4

>From 2d5359968951ac2ebc3caa3af06025d150cf04b3 Mon Sep 17 00:00:00 2001
From: Niko Tyni <ntyni@debian.org>
Date: Mon, 13 May 2013 20:40:19 +0300
Subject: [PATCH 5/5] Augment the test suite for the improved perl-provides
 logic

libmodule-build-perl in squeeze was 0.360700, but the old versioning
logic erroneously compared against 0.3607, resulting in a false
negative.
---
 t/tests/fields-depends-general/debian/debian/control.in |    2 +-
 t/tests/fields-depends-general/tags                     |    1 +
 2 files changed, 2 insertions(+), 1 deletion(-)

diff --git a/t/tests/fields-depends-general/debian/debian/control.in b/t/tests/fields-depends-general/debian/debian/control.in
index 40fd0c9..74f7980 100644
--- a/t/tests/fields-depends-general/debian/debian/control.in
+++ b/t/tests/fields-depends-general/debian/debian/control.in
@@ -3,7 +3,7 @@ Priority: extra
 Section: {$section}
 Maintainer: {$author}
 Standards-Version: {$standards_version}
-Build-Depends: debhelper (>= 9)
+Build-Depends: debhelper (>= 9), libmodule-build-perl (>= 0.360700)
 
 Package: {$srcpkg}
 Architecture: {$architecture}
diff --git a/t/tests/fields-depends-general/tags b/t/tests/fields-depends-general/tags
index 8d0f243..87f38fd 100644
--- a/t/tests/fields-depends-general/tags
+++ b/t/tests/fields-depends-general/tags
@@ -9,6 +9,7 @@ E: py-fields-depends-general: depends-on-python-minimal depends
 I: fields-depends-general: conflicts-with-version package-with-version (<< 3.0)
 I: fields-depends-general: ored-depends-on-obsolete-package depends: xbase-clients
 W: fields-depends-general source: package-depends-on-itself fields-depends-general depends
+W: fields-depends-general source: versioned-dependency-satisfied-by-perl build-depends: libmodule-build-perl (>= 0.360700)
 W: fields-depends-general-doc: doc-package-depends-on-main-package depends
 W: fields-depends-general: breaks-without-version package-without-version
 W: fields-depends-general: depends-exclusively-on-makedev depends
-- 
1.7.10.4


Reply to: