]> git.ipfire.org Git - thirdparty/bugzilla.git/commitdiff
Bug 1174695: The cpanfile created by checksetup.pl defines the same feature multiple...
authorEd Morley <emorley@mozilla.com>
Fri, 19 Jun 2015 19:00:15 +0000 (19:00 +0000)
committerDavid Lawrence <dkl@mozilla.com>
Fri, 19 Jun 2015 19:00:27 +0000 (19:00 +0000)
r=dkl,a=glob

Bugzilla/Install/Requirements.pm

index bbf7d1037a4f2e154ecd0944adeb8ec942945342..b48487c31c91a5cd68c755f75ab268a03d488683 100644 (file)
@@ -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";