This is an automated email from the git hooks/post-receive script. dmn pushed a commit to branch master in repository dh-make-perl.
commit 51f689679cc59e21650b18b907fe6929f4328952 Author: Damyan Ivanov <d...@debian.org> Date: Sat Sep 26 13:36:40 2015 +0000 Apply a patch from Andy Beverley for checking the versions of the locally available packages when doing recursive builds --- lib/Debian/Control/FromCPAN.pm | 68 +++++++++++++++++++++++++++++++++---- lib/DhMakePerl/Command/Packaging.pm | 27 +++++++++++---- lib/DhMakePerl/Command/make.pm | 14 +++----- lib/DhMakePerl/Utils.pm | 19 +++++++++++ 4 files changed, 107 insertions(+), 21 deletions(-) diff --git a/lib/Debian/Control/FromCPAN.pm b/lib/Debian/Control/FromCPAN.pm index 1749cc1..b0895e1 100644 --- a/lib/Debian/Control/FromCPAN.pm +++ b/lib/Debian/Control/FromCPAN.pm @@ -23,7 +23,7 @@ use Carp qw(croak); use base 'Debian::Control'; use CPAN (); -use DhMakePerl::Utils qw( is_core_module find_cpan_module nice_perl_ver split_version_relation ); +use DhMakePerl::Utils qw( is_core_module find_cpan_module nice_perl_ver split_version_relation apt_cache ); use File::Spec qw( catfile ); use Module::Depends (); @@ -47,6 +47,13 @@ Options: 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 +the locally available package is the required version. For example: + + my $available = DPKG::Parse::Available->new; + $available->parse; + =item dir The directory where the cpan distribution was unpacked. @@ -85,6 +92,7 @@ sub discover_dependencies { ref($opts) and ref($opts) eq 'HASH' or die 'Usage: $obj->{ [ { opts hash } ] )'; my $apt_contents = delete $opts->{apt_contents}; + my $dpkg_available = delete $opts->{dpkg_available}; my $dir = delete $opts->{dir}; my $intrusive = delete $opts->{intrusive}; my $require_deps = delete $opts->{require_deps}; @@ -163,7 +171,8 @@ sub discover_dependencies { # run-time my ( $debs, $missing ) - = $self->find_debs_for_modules( $deps->{requires}, $apt_contents, $verbose ); + = $self->find_debs_for_modules( $deps->{requires}, $apt_contents, + $verbose, $dpkg_available ); if (@$debs) { if ($verbose) { @@ -187,7 +196,8 @@ sub discover_dependencies { %{ $deps->{configure_requires} || {} } }, $apt_contents, - $verbose + $verbose, + $dpkg_available, ); if (@$b_debs) { @@ -254,7 +264,7 @@ EOF return @$missing; } -=item find_debs_for_modules I<dep hash>[, APT contents[, verbose ]] +=item find_debs_for_modules I<dep hash>[, APT contents[, verbose[, DPKG available]]] Scans the given hash of dependencies ( module => version ) and returns matching Debian package dependency specification (as an instance of @@ -262,13 +272,16 @@ 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 + =cut sub find_debs_for_modules { - my ( $self, $dep_hash, $apt_contents, $verbose ) = @_; + my ( $self, $dep_hash, $apt_contents, $verbose, $dpkg_available ) = @_; my $debs = Debian::Dependencies->new(); + my $aptpkg_cache = apt_cache(); my @missing; @@ -292,9 +305,52 @@ sub find_debs_for_modules { ? [ map { { pkg => $_, ver => $version } } @pkgs ] : ( $pkgs[0], $version ) ); + + # Check the actual version available, if we've been passed + # a DPKG::Parse::Available 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 ); + push @available, $have_pkg; + $have_pkg->satisfies($dep); + } + else { + warn qq(Unable to obtain version information for $module. You may need to ) + .qq(install and run "dselect update"); + } + } @pkgs; + unless ( @satisfied ) { + print "$module is available locally as @available, but does not satisify $version" + if $verbose; + push @missing, $module; + } + } + else { + warn "DPKG::Parse not available. Not checking version of $module."; + } } - elsif ($apt_contents) { + + if (!$dep && $apt_contents) { $dep = $apt_contents->find_perl_module_package( $module, $version ); + + # Check the actual version in APT, if we've got + # a AptPkg::Cache object to search + if ( $dep && $aptpkg_cache ) { + my $pkg = $aptpkg_cache->{$dep->pkg}; + if ( my $available = $pkg->{VersionList} ) { + for my $v ( @$available ) { + my $d = Debian::Dependency->new( $dep->pkg, '=', $v->{VerStr} ); + unless ( $d->satisfies($dep) ) + { + push @missing, $module; + print "$module package in APT ($d) does not satisfy $dep" + if $verbose; + } + } + } + } } diff --git a/lib/DhMakePerl/Command/Packaging.pm b/lib/DhMakePerl/Command/Packaging.pm index 0fce448..8d96dd9 100644 --- a/lib/DhMakePerl/Command/Packaging.pm +++ b/lib/DhMakePerl/Command/Packaging.pm @@ -1391,13 +1391,28 @@ 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."; + } + return $self->control->discover_dependencies( - { dir => $self->main_dir, - verbose => $self->cfg->verbose, - apt_contents => $self->apt_contents, - require_deps => $self->cfg->requiredeps, - wnpp_query => $wnpp_query, - intrusive => $self->cfg->intrusive, + { dir => $self->main_dir, + verbose => $self->cfg->verbose, + apt_contents => $self->apt_contents, + dpkg_available => $dpkg_available, + require_deps => $self->cfg->requiredeps, + wnpp_query => $wnpp_query, + intrusive => $self->cfg->intrusive, } ); } diff --git a/lib/DhMakePerl/Command/make.pm b/lib/DhMakePerl/Command/make.pm index c2c9fa6..22bb318 100644 --- a/lib/DhMakePerl/Command/make.pm +++ b/lib/DhMakePerl/Command/make.pm @@ -6,6 +6,7 @@ our $VERSION = '0.84'; use 5.010; # we use smart matching use base 'DhMakePerl::Command::Packaging'; +use DhMakePerl::Utils qw(apt_cache); __PACKAGE__->mk_accessors( qw( @@ -38,7 +39,6 @@ TO BE FILLED =cut -use AptPkg::Cache (); use CPAN (); use Cwd qw( realpath ); use Debian::Dependencies (); @@ -600,14 +600,10 @@ sub package_already_exists { my( $self, $apt_contents ) = @_; my $found; - - eval { - my $apt_cache = AptPkg::Cache->new; - $found = $apt_cache->packages->lookup( $self->pkgname ) - if $apt_cache; - }; - - warn "Error initializing AptPkg::Cache: $@" if $@; + if (my $apt_cache = apt_cache()) + { + $found = $apt_cache->packages->lookup( $self->pkgname ); + } if ($found) { warn "**********\n"; diff --git a/lib/DhMakePerl/Utils.pm b/lib/DhMakePerl/Utils.pm index 53b0cd2..607fccb 100644 --- a/lib/DhMakePerl/Utils.pm +++ b/lib/DhMakePerl/Utils.pm @@ -20,6 +20,7 @@ DhMakePerl::Utils - helper routines for dh-make-perl and alike our @EXPORT_OK = qw( find_core_perl_dependency + apt_cache find_cpan_module find_cpan_distribution is_core_module nice_perl_ver @@ -30,6 +31,7 @@ use base 'Exporter'; use 5.10.0; +use AptPkg::Cache; use Module::CoreList (); use Debian::Dependency; @@ -39,6 +41,23 @@ None of he following functions is exported by default. =over +=item apt_cache + +Evaluate the creation of an AptPkg::Cache, and return it on success + +=cut + +sub apt_cache { + my $apt_cache; + + eval { + $apt_cache = AptPkg::Cache->new; + }; + + warn "Error initializing AptPkg::Cache: $@" if $@; + $apt_cache; +} + =item find_cpan_module Returns CPAN::Module object that corresponds to the supplied argument. Returns -- Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-perl/packages/dh-make-perl.git _______________________________________________ Pkg-perl-cvs-commits mailing list Pkg-perl-cvs-commits@lists.alioth.debian.org http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pkg-perl-cvs-commits