From e85aa1b9584edce2f7f095c5fbeff4da13a1c2d1 Mon Sep 17 00:00:00 2001 From: Ed Morley Date: Fri, 19 Jun 2015 19:00:15 +0000 Subject: Bug 1174695: The cpanfile created by checksetup.pl defines the same feature multiple times, breaking cpanm r=dkl,a=glob --- Bugzilla/Install/Requirements.pm | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) (limited to 'Bugzilla/Install/Requirements.pm') diff --git a/Bugzilla/Install/Requirements.pm b/Bugzilla/Install/Requirements.pm index bbf7d1037..b48487c31 100644 --- a/Bugzilla/Install/Requirements.pm +++ b/Bugzilla/Install/Requirements.pm @@ -887,28 +887,43 @@ sub export_cpanfile { $cpanfile .= $requires; } # Recommended modules + $cpanfile .= "\n# Optional\n"; + my %features; foreach my $module (@{ OPTIONAL_MODULES() }) { - my $recommends = ""; if (exists $module->{feature}) { foreach my $feature (@{ $module->{feature} }) { - $recommends .= "feature '" . $feature . "', '" . $module->{package} . "' => sub {\n"; - $recommends .= " recommends '" . $module->{module} . "'"; - $recommends .= ", '" . $module->{version} . "'" if $module->{version}; - $recommends .= ";\n};\n"; + # cpanm requires that each feature only be defined in the cpanfile + # once, so we use an intermediate hash to consolidate/de-dupe the + # modules associated with each feature. + $features{$feature}{$module->{module}} = $module->{version}; } } else { + my $recommends = ""; $recommends .= "recommends '" . $module->{module} . "'"; $recommends .= ", '" . $module->{version} . "'" if $module->{version}; $recommends .= ";\n"; + $cpanfile .= $recommends; + } + } + foreach my $feature (sort keys %features) { + my $recommends = ""; + $recommends .= "feature '" . $feature . "' => sub {\n"; + foreach my $module (sort keys %{ $features{$feature} }) { + my $version = $features{$feature}{$module}; + $recommends .= " recommends '" . $module . "'"; + $recommends .= ", '$version'" if $version; + $recommends .= ";\n"; } + $recommends .= "};\n"; $cpanfile .= $recommends; } # Database modules + $cpanfile .= "\n# Database support\n"; foreach my $db (keys %{ DB_MODULE() }) { next if !exists DB_MODULE->{$db}->{dbd}; my $dbd = DB_MODULE->{$db}->{dbd}; - my $recommends .= "feature '$db', '" . $dbd->{package} . "' => sub {\n"; + my $recommends .= "feature '$db' => sub {\n"; $recommends .= " recommends '" . $dbd->{module} . "'"; $recommends .= ", '" . $dbd->{version} . "'" if $dbd->{version}; $recommends .= ";\n};\n"; -- cgit v1.2.3-24-g4f1b