Hi! On Mon, 2015-09-28 at 12:37:22 +0100, Andrew Beverley wrote: > On Mon, 2015-09-28 at 13:12 +0200, Guillem Jover wrote: > > On Sat, 2015-09-26 at 21:12:57 +0300, Andy Beverley wrote: > > > Package: wnpp > > > Owner: Andy Beverley <a...@andybev.com> > > > Severity: wishlist > > > X-Debbugs-CC: debian-de...@lists.debian.org, > > > debian-p...@lists.debian.org > > > > > > * Package name : libdpkg-parse-perl > > > > What's the advantage of this over the various modules in libdpkg-perl? > > I think it's the only way to retrieve version information. It's a long time > since I wrote my original patch for dh-make-perl, but I seem to remember > that DPKG::Parse was the only module that provided certain information I > needed (see https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=774074). > > I certainly tried to do it with other modules already packaged, but I > couldn't gain all the required information.
The attached untested patch should in principle do it. In any case the available file is only ever up-to-date when using dselect. If it's too slow, this should be fixed in libdpkg-perl anyway as that would benefit every caller. Thanks, Guillem
From 30408bf2dd2cd7da3a794a1a5869a4cdcf1c8332 Mon Sep 17 00:00:00 2001 From: Guillem Jover <guil...@debian.org> Date: Tue, 29 Sep 2015 15:06:34 +0200 Subject: [PATCH] Switch from libdpkg-parse-perl to libdpkg-perl modules --- Build.PL | 3 ++- debian/control | 1 - lib/Debian/Control/FromCPAN.pm | 18 ++++++++---------- lib/DhMakePerl/Command/Packaging.pm | 16 +++++----------- 4 files changed, 15 insertions(+), 23 deletions(-) diff --git a/Build.PL b/Build.PL index cc3ae8b..e2eaf31 100644 --- a/Build.PL +++ b/Build.PL @@ -7,7 +7,6 @@ my $builder = My::Builder->new( module_name => 'DhMakePerl', license => 'gpl', recommends => { - 'DPKG::Parse' => 0.02, 'Git' => 0, 'IO::Dir' => 0, }, @@ -24,6 +23,8 @@ my $builder = My::Builder->new( 'CPAN::Meta' => 0, 'Cwd' => 0, 'Dpkg' => 0, + 'Dpkg::Index' => 0, + 'Dpkg::Control::Types' => 0, 'Dpkg::Source::Package' => 0, 'Email::Address' => 0, 'Email::Date::Format' => 0, diff --git a/debian/control b/debian/control index f02f170..2de9da9 100644 --- a/debian/control +++ b/debian/control @@ -78,7 +78,6 @@ Depends: debhelper (>= 8), ${perl:Depends} Recommends: apt-file (>= 2.5.0), git, - libdpkg-parse-perl, pristine-tar Description: helper for creating Debian packages from perl modules dh-make-perl will create the files required to build a Debian source diff --git a/lib/Debian/Control/FromCPAN.pm b/lib/Debian/Control/FromCPAN.pm index b0895e1..f4d5d48 100644 --- a/lib/Debian/Control/FromCPAN.pm +++ b/lib/Debian/Control/FromCPAN.pm @@ -48,11 +48,12 @@ An instance of L<Debian::AptContents> to be used when locating to which package a required module belongs. =item dpkg_available -An instance of L<DPKG::Parse::Available> to be used when checking whether + +An instance of L<Dpkg::Index> to be used when checking whether the locally available package is the required version. For example: - my $available = DPKG::Parse::Available->new; - $available->parse; + my $available = Dpkg::Index->new(type => CTRL_INFO_PKG); + $available->load("$Dpkg::ADMINDIR/available"); =item dir @@ -272,7 +273,7 @@ L<Debian::Dependencies> class) and a list of missing modules. Perl core is searched first, then installed packages, then the APT contents. -If a DPKG::Parse::Available object is passed, also check the available package version +If a Dpkg::Index object is passed, also check the available package version. =cut @@ -307,12 +308,12 @@ sub find_debs_for_modules { ); # Check the actual version available, if we've been passed - # a DPKG::Parse::Available object + # a Dpkg::Index object if ( $dpkg_available ) { my @available; my @satisfied = grep { - if ( my $pkg = $dpkg_available->get_package('name' => $_) ) { - my $have_pkg = Debian::Dependency->new( $_, '=', $pkg->version ); + if ( my $pkg = $dpkg_available->get_by_key($_) ) { + my $have_pkg = Debian::Dependency->new( $_, '=', $pkg->{Version} ); push @available, $have_pkg; $have_pkg->satisfies($dep); } @@ -327,9 +328,6 @@ sub find_debs_for_modules { push @missing, $module; } } - else { - warn "DPKG::Parse not available. Not checking version of $module."; - } } if (!$dep && $apt_contents) { diff --git a/lib/DhMakePerl/Command/Packaging.pm b/lib/DhMakePerl/Command/Packaging.pm index 8d96dd9..6f9117b 100644 --- a/lib/DhMakePerl/Command/Packaging.pm +++ b/lib/DhMakePerl/Command/Packaging.pm @@ -31,6 +31,9 @@ use Config::INI::Reader (); use CPAN (); use CPAN::Meta; use Cwd qw( getcwd ); +use Dpkg; +use Dpkg::Index; +use Dpkg::Control::Types; use Debian::Control::FromCPAN; use Debian::Dependencies; use Debian::Rules; @@ -1391,19 +1394,10 @@ sub discover_dependencies { # control->discover_dependencies needs configured CPAN $self->configure_cpan; - # Attempt to get an instance of DPKG::Parse::Available. If this - # isn't available, warn the user, as versions of packages cannot - # be checked. # Don't cache this in case we've built and installed a # module in this instance. - my $dpkg_available; - if ( eval { require DPKG::Parse::Available } && DPKG::Parse->VERSION >= 0.02 ) { - $dpkg_available = DPKG::Parse::Available->new; - $dpkg_available->parse; - } else { - warn "DPKG::Parse v0.02 or higher not found."; - warn "Versions of required packages will not be checked."; - } + my $dpkg_available = Dpkg::Index->new(type => CTRL_INFO_PKG); + $dpkg_available->load("$Dpkg::ADMINDIR/available"); return $self->control->discover_dependencies( { dir => $self->main_dir, -- 2.6.0.rc2.230.g3dd15c0