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: