[libconfig-model-dpkg-perl] 07/07: improve dual dependency and << requirement

dod at debian.org dod at debian.org
Mon Aug 21 17:54:31 UTC 2017


This is an automated email from the git hooks/post-receive script.

dod pushed a commit to branch master
in repository libconfig-model-dpkg-perl.

commit 0ffb04736130480d1e9d38adcc62d34629c266e6
Author: Dominique Dumont <dod at debian.org>
Date:   Mon Aug 21 19:53:54 2017 +0200

    improve dual dependency and << requirement
---
 lib/Config/Model/Dpkg/Dependency.pm       | 86 +++++++++++++++++++------------
 t/dependency-check.t                      | 24 +++++----
 t/model_tests.d/dpkg-control-test-conf.pl | 10 ++--
 t/model_tests.d/dpkg-test-conf.pl         |  2 +-
 4 files changed, 73 insertions(+), 49 deletions(-)

diff --git a/lib/Config/Model/Dpkg/Dependency.pm b/lib/Config/Model/Dpkg/Dependency.pm
index e949f26..b24b62c 100644
--- a/lib/Config/Model/Dpkg/Dependency.pm
+++ b/lib/Config/Model/Dpkg/Dependency.pm
@@ -505,14 +505,13 @@ sub check_perl_lib_dep {
     $logger->debug("called for $dep_name with $actual_dep with apply_fix $apply_fix");
 
     my ($old_perl_dep) = grep { $_->{name} eq 'perl' } @$input;
-    my $old_perl_versioned_op  = $old_perl_dep->{dep}[0] ;
-    my $old_perl_versioned_dep = $old_perl_dep->{dep}[1] ;
+    my $old_perl_versioned_dep = $old_perl_dep->{dep}[1] // '';
 
     # The dependency should be in the form perl (>= 5.10.1) | libtest-simple-perl (>= 0.88)".
     # cf http://pkg-perl.alioth.debian.org/policy.html#debian_control_handling
     # If the Perl version is not available in sid, the order of the dependency should be reversed
     # libcpan-meta-perl | perl (>= 5.13.10)
-    # because buildd will use the first available alternative
+    # because Debian build daemons use the first available alternative
 
     # check for dual life module, module name follows debian convention...
     my $cpan_name = $debian_map{$dep_name};
@@ -565,6 +564,7 @@ sub check_perl_lib_dep {
 		version->parse( $cpan_dep_v )
 	);
 
+    # return when module is not and was never part of core
 	return 1 unless defined $v_decimal;
 
 	my $v_normal = version->new($v_decimal)->normal;
@@ -574,45 +574,60 @@ sub check_perl_lib_dep {
 		$logger->debug("dual life $dep_str found in Perl core $v_normal (req perl is $old_perl_versioned_dep)");
 	}
 
-    if ( not defined $dep_v and $old_perl_versioned_dep ) {
+    if ( not defined $dep_v and $old_perl_versioned_dep and $old_perl_versioned_dep gt $v_decimal) {
         # when alternate lib version is not defined (because the requirement is satisfied by all
         # available versions of the lib), the actual requirement is held by the versioned dep of perl
         # hence, it must be preserved
-		$logger->debug("preserving old perl versioned dep $old_perl_versioned_dep instead of $v_normal"
-                       ." for $dep_name");
+        my $p_data = Module::CoreList->find_version($v_decimal);
+        $dep_v = $p_data->{$cpan_name};
+        $depend->{dep} = [ '>=', $dep_v ];
+        $logger->debug("preserving old perl versioned dep $old_perl_versioned_dep instead of $v_normal"
+                           ." for $dep_name (implies dep > $dep_v)");
         $v_normal = $old_perl_versioned_dep;
     }
 
-	my ($has_older_perl) = $self->check_versioned_dep( { name => 'perl', dep => ['>=', $v_normal]} );
-	if ((not defined $old_perl_versioned_op or $old_perl_versioned_op =~ />/) and not $deprecated) {
-        $ideal_perl_dep{name} = 'perl';
+
+    my ($has_older_perl) = $self->check_versioned_dep( { name => 'perl', dep => ['>=', $v_normal]} );
+    my ($has_older_lib)  = $self->check_versioned_dep( $depend );
+
+    # Perl module is being or was removed from core
+    if ($deprecated or $removed) {
         if ( $has_older_perl ) {
-            my $oper = $old_perl_versioned_op // '>=';
-            $logger->debug("Found older perl for a greater-than perl dep. Ideal perl dep is 'perl $oper $v_normal'");
-            $ideal_perl_dep{dep} = [ $oper, $v_normal ];
+            my $max_ver_normal = version->new($deprecated)->normal ;
+            $max_ver_normal =~ s/^v//;
+            $logger->debug("Found older perl for a soon to be removed lib. Using perl << $max_ver_normal dependency'");
+            $ideal_perl_dep{name} = 'perl';
+            $ideal_perl_dep{dep} = [ '<<', $max_ver_normal ];
         }
         else {
-            $logger->debug("Did no find older perl for a greater-than perl dep. Ideal perl dep is plain 'perl'");
+            # e.g. perl (<< 5.8.0) i.e. lower than obsolete perl -> remove dependency from ideal perl dep
+            $logger->debug("Did not find older perl for an obsolete module. Perl dep should be removed");
         }
-    }
 
-    if (defined $old_perl_versioned_op and $old_perl_versioned_op =~ /</) {
+        # always specify the library dependency
+        $ideal_lib_dep{name} = $dep_name;
+        $ideal_lib_dep{dep} = [ '>=', $dep_v ] if $dep_v and $has_older_lib;
+
+    }
+    else {
+        # Perl module is part of core (this was tested before)
+        $ideal_perl_dep{name} = 'perl';
         if ( $has_older_perl ) {
-            $logger->debug("Found older perl for a lower-than perl dep. Ideal perl dep is 'perl $old_perl_versioned_op $v_normal'");
-            $ideal_perl_dep{name} = 'perl';
-            $ideal_perl_dep{dep} = [ $old_perl_versioned_op, $v_normal ];
+            $logger->debug("Found older perl for a greater-than perl dep. Ideal perl dep is 'perl >= $v_normal'");
+            $ideal_perl_dep{dep} = [ '>=', $v_normal ];
         }
         else {
-            # e.g. perl (<< 5.8.0)m i.e. lower than obsolete perl -> remove dependency from ideal perl dep
-            $logger->debug("Did not find older perl for a lower-than perl dep. Perl dep should be removed");
+            $logger->debug("Did no find older perl for a greater-than perl dep. Ideal perl dep is plain 'perl'");
         }
-    }
 
-    # we assume that lib dep is always >= ...
-    if ($removed or $deprecated or $has_older_perl) {
-        my ($has_older_lib) = $self->check_versioned_dep(  $depend );
+        # we need to specify the libray dependency even this one has no
+        # version requirement and the dependency is satisfied by Perl core
+        # because dual dependency will eventually be removed. Better keep this info
         $ideal_lib_dep{name} = $dep_name;
-        $ideal_lib_dep{dep} = [ '>=', $dep_v ] if $dep_v and $has_older_lib;
+
+        if ($dep_v) {
+            $ideal_lib_dep{dep} = [ '>=', $dep_v ] if $dep_v and $has_older_lib;
+        }
     }
 
     my %perl_version =  $self->get_available_version( 'perl');
@@ -624,10 +639,13 @@ sub check_perl_lib_dep {
 		"older than perl in sid ($sid_perl_version)"
 	);
 
-	my @ordered_ideal_dep
-        = $removed || $deprecated  ? ( \%ideal_lib_dep,  \%ideal_perl_dep )
-        : $has_older_perl_in_sid   ? ( \%ideal_perl_dep, \%ideal_lib_dep  )
-        :                            ( \%ideal_lib_dep,  \%ideal_perl_dep ) ;
+    my $perl_dep_first = $has_older_perl_in_sid && ! $deprecated;
+
+	my @pre_ordered_ideal_dep
+        = $perl_dep_first   ? ( \%ideal_perl_dep, \%ideal_lib_dep  )
+        :                     ( \%ideal_lib_dep,  \%ideal_perl_dep ) ;
+
+	my @ordered_ideal_dep = grep {defined $_->{name} } @pre_ordered_ideal_dep;
 
 	my $ideal_dep = $self->struct_to_dep( @ordered_ideal_dep );
 
@@ -637,21 +655,21 @@ sub check_perl_lib_dep {
 	if ( $actual_dep ne $ideal_dep ) {
         my $msg = "Dependency of dual life package should be '$ideal_dep' not '$actual_dep'";
 		if ($apply_fix) {
-			@$input = grep {defined $_->{name} } @ordered_ideal_dep ; # notify_change called in check_value
+			@$input =  @ordered_ideal_dep ; # notify_change called in check_value
             if ($logger->is_info) {
-                $logger->info("fixed dependency with: $ideal_dep, was ". $self->struct_to_dep($depend));
+                $logger->info("fixed dependency with: '$ideal_dep', was '$actual_dep'");
             }
             push $msgs->@*, $msg;
 		}
 		else {
 			$self->{nb_of_fixes}++;
 			my $msg = "Dependency of dual life package should be '$ideal_dep' not '$actual_dep'";
+            if ($deprecated) {
+                $msg .= " (deprecated from perl $deprecated)" ;
+            }
             if ($removed) {
                 $msg .= " (removed from perl $removed)" ;
             }
-            elsif ($deprecated) {
-                $msg .= " (deprecated from perl $deprecated)" ;
-            }
 			$self->add_warning ($msg);
 			$logger->info("will warn: $msg (fix++)");
 		}
diff --git a/t/dependency-check.t b/t/dependency-check.t
index b575611..47ea1df 100644
--- a/t/dependency-check.t
+++ b/t/dependency-check.t
@@ -5,7 +5,7 @@ BEGIN {
     # of getting values through the internet
     no warnings 'once';
     %Config::Model::Dpkg::Dependency::cache = (
-        'libarchive-extract-perl' => 'jessie 0.68-1 sid 0.68-1',
+        'libarchive-extract-perl' => 'squeeze 0.65-1 jessie 0.68-1 sid 0.68-1',
         'perl-modules' => 'lenny 5.10.0-19lenny3 squeeze 5.10.1-17 sid 5.10.1-17 experimental 5.12.0-2 experimental 5.12.2-2',
         'perl' => 'squeeze 5.10.1-17 wheezy 5.14.2-21 jessie 5.18.1-3 sid 5.18.1-4',
         'debhelper' => 'etch 5.0.42 backports/etch 7.0.15~bpo40+2 lenny 7.0.15 backports/lenny 8.0.0~bpo50+2 squeeze 8.0.0 wheezy 8.1.2 sid 8.1.2',
@@ -218,19 +218,23 @@ my @chain_tests = (
     => [ { name => 'libcpan-meta-perl'}]
     => [ { name => 'perl', dep => [qw/>= 5.13.10/]} ,{ name => 'libcpan-meta-perl'}],
 
+    'libcpan-meta-perl (>= 2.101550)'
+        => [ { name => 'libcpan-meta-perl', dep => [qw/>= 2.101550/]}]
+        => [ { name => 'perl', dep => [qw/>= 5.13.10/]} ,{ name => 'libcpan-meta-perl'}],
+
     'libmodule-build-perl perl 5.10'
     => [ { name => 'perl', dep => [qw/>= 5.10/]}, { name => 'libmodule-build-perl'}]
-    => [ { name => 'libmodule-build-perl'}],
+    => [ { name => 'libmodule-build-perl'} ],
 
    'libmodule-build-perl perl-modules 5.10'
     => [ { name => 'perl-modules', dep => [qw/>= 5.10/]}, { name => 'libmodule-build-perl'}]
-    => [ { name => 'libmodule-build-perl'}],
+    => [ { name => 'libmodule-build-perl'}, { name => 'perl', dep => [qw/<< 5.19.0/]} ],
 
     # test Debian #719225
-    'libarchive-extract-perl'
+    'libarchive-extract-perl >= 0.68'
     => [ { name => 'libarchive-extract-perl', dep => [qw/>= 0.68/]} ,
-         { name => 'perl', dep => [qw/perl >= 5.17.9/]} ]
-    => [ { name => 'libarchive-extract-perl'} ,],
+         { name => 'perl', dep => [qw/<< 5.17.9/]} ]
+    => 1,
 
     'libarchive-extract-perl'
     => [ { name => 'perl', dep => [qw/>= 5.17.9/] }, { name => 'libarchive-extract-perl'} ]
@@ -239,7 +243,7 @@ my @chain_tests = (
     'libmodule-build-perl to fix'
     =>  [ { name => 'perl', dep => [qw/>= 5.11.3/]},
           { name => 'libmodule-build-perl', dep => [qw/>= 0.360000/ ]}]
-    => [ { name => 'libmodule-build-perl'} ] ,
+    => [ { name => 'libmodule-build-perl'}, { name => 'perl', dep => [qw/<< 5.19.0/]} ] ,
 
     # test that cme does not restrict needlessly the alternate Perl version
     'libmodule-metadata-perl to fix'
@@ -252,14 +256,14 @@ my @chain_tests = (
     # test for #682730
     'module removed from corelist - 1 '
         => [ { name => 'libclass-isa-perl'}, { name => 'perl', dep => [qw/<< 5.11.1-13/]} ]
-        => 1,
+        => [ { name => 'libclass-isa-perl'}, { name => 'perl', dep => [qw/<< 5.11.0/]} ],
     'module removed from corelist - 2'
         => [ { name => 'libclass-isa-perl'}, { name => 'perl', dep => [qw/<< 5.08.1-13/]} ]
         => [ { name => 'libclass-isa-perl'} ],
 
     'module part of core perl forever'
         => [ { name => 'libtest-simple-perl' } ]
-        => [ { name => 'perl' } ],
+        => [ { name => 'perl' }, { name => 'libtest-simple-perl' } ],
 
     );
 
@@ -401,7 +405,7 @@ is($perl_bdi->has_fixes,2, "test presence of fixes");
 is($perl_bdi->has_fixes,0, "test that fixes are gone");
 is($perl_bdi->has_warning,0,"check that warnings are gone");
 
-is($perl_bdi->fetch,"libmodule-build-perl","check fixed B-D-I dependency value");
+is($perl_bdi->fetch,"libmodule-build-perl | perl (<< 5.19.0)","check fixed B-D-I dependency value");
 
 print scalar $inst->list_changes,"\n" if $trace ;
 is($inst->c_count, 1,"check that fixes are tracked with notify changes") ;
diff --git a/t/model_tests.d/dpkg-control-test-conf.pl b/t/model_tests.d/dpkg-control-test-conf.pl
index 3b2d7b2..0da1651 100644
--- a/t/model_tests.d/dpkg-control-test-conf.pl
+++ b/t/model_tests.d/dpkg-control-test-conf.pl
@@ -20,10 +20,12 @@ providing the following file:
         check => {
             'source Source',          "libdist-zilla-plugins-cjm-perl",
             'source Build-Depends:0', "debhelper (>= 7)",
-            'source Build-Depends-Indep:0', "libcpan-meta-perl | perl (>= 5.13.10)",     # fixed
+            # not really happy about the versioned dep of libmeta-cpan-perl created ex-nihilo.
+            # this is a side effect of other compromises in dual dependency handling which should be harmless
+            'source Build-Depends-Indep:0', "libcpan-meta-perl (>= 2.110440) | perl (>= 5.13.10)",     # fixed
             'source Build-Depends-Indep:1', "libdist-zilla-perl",    # fixed
             'source Build-Depends-Indep:5', "libpath-class-perl",
-            'source Build-Depends-Indep:6', "libmodule-build-perl (>= 0.360000)", # fixed
+            'source Build-Depends-Indep:6', "libmodule-build-perl (>= 0.360000) | perl (<< 5.19.0)", # fixed
             'source Build-Depends-Indep:7', "udev [linux-any] | makedev [linux-any]",
             'source X-Comment' => qr/Debian #810023/,
             'binary:libdist-zilla-plugins-cjm-perl X-Comment' => qr/Debian #810023/,
@@ -135,8 +137,8 @@ providing the following file:
     {
         # test for #682730
         name => 'libclass-meta-perl',
-        load_warnings => [ ( qr/Vcs-Git/) x 2 ],
-         check => { 'source Build-Depends-Indep:1' => 'libclass-isa-perl | perl (<< 5.10.1-13)' },
+        load_warnings => [ qr/dual life/,  ( qr/Vcs-Git/) x 2, qr/dual life/ ],
+         check => { 'source Build-Depends-Indep:1' => 'libclass-isa-perl | perl (<< 5.11.0)' },
         apply_fix => 1,
     },
     {
diff --git a/t/model_tests.d/dpkg-test-conf.pl b/t/model_tests.d/dpkg-test-conf.pl
index 8bb0027..1c7adf7 100644
--- a/t/model_tests.d/dpkg-test-conf.pl
+++ b/t/model_tests.d/dpkg-test-conf.pl
@@ -74,7 +74,7 @@ sub add {
         apply_fix => 1 ,
         check => {
             'control source Build-Depends-Indep:0' => 'perl',
-            'control source Build-Depends-Indep:1' => 'perl (>= 5.9.5) | libversion-perl',
+            'control source Build-Depends-Indep:1' => 'perl (>= 5.9.5) | libversion-perl (>= 0.7203)',
             # check that duplicated dependency is removed
             'control source Build-Depends-Indep:2' => 'libdist-zilla-perl',
             'bugfiles:libversion bug-script' => qr/dummy script/,

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-perl/packages/libconfig-model-dpkg-perl.git



More information about the Pkg-perl-cvs-commits mailing list