]> git.vpit.fr Git - perl/modules/CPANPLUS-Dist-Gentoo.git/blobdiff - lib/CPANPLUS/Dist/Gentoo.pm
Put recursive dependencies into PDEPEND sections
[perl/modules/CPANPLUS-Dist-Gentoo.git] / lib / CPANPLUS / Dist / Gentoo.pm
index d5a7b79dd375add110e358c90717d0217ad8268c..cc57cbdab4d5f8cdb049de1036e71412e50e84e7 100644 (file)
@@ -136,6 +136,7 @@ my $default_keywords;
 my $default_distdir;
 my $main_portdir;
 
+my %dependencies;
 my %forced;
 
 my $unquote = sub {
@@ -195,7 +196,8 @@ sub init {
 
  $stat->mk_accessors(qw/name version author distribution desc uri src license
                         meta min_perl
-                        fetched_arch requires configure_requires
+                        fetched_arch
+                        requires configure_requires recursive_requires
                         ebuild_name ebuild_version ebuild_dir ebuild_file
                         portdir_overlay
                         overlay distdir keywords do_manifest header footer
@@ -218,14 +220,7 @@ my $filter_prereqs = sub {
   next unless $obj; # Not in the module tree (e.g. Config)
   next if $obj->package_is_perl_core;
 
-  my $version;
-  if ($prereqs->{$prereq}) {
-   if ($obj->installed_version && $obj->installed_version < $obj->version) {
-    $version = $obj->installed_version;
-   } else {
-    $version = $obj->package_version;
-   }
-  }
+  my $version = $prereqs->{$prereq} || undef;
 
   push @requires, [ $obj->package_name, $version ];
  }
@@ -359,7 +354,10 @@ sub prepare {
  return $FAIL->() unless $stat->prepared;
 
  my $desc = $mod->description;
- ($desc = $name) =~ s/-+/::/g unless $desc;
+ $desc    = $mod->comment                unless $desc;
+ $desc    = "$name Perl distribution (provides " . $mod->module . ')'
+                                         unless $desc;
+ $desc    = substr($desc, 0, 77) . '...' if length $desc > 80;
  $stat->desc($desc);
 
  $stat->uri('http://search.cpan.org/dist/' . $name);
@@ -372,6 +370,9 @@ sub prepare {
  my $mstat = $mod->status;
  $stat->configure_requires($int->$filter_prereqs($mstat->configure_requires));
  $stat->requires($int->$filter_prereqs($mstat->requires));
+ $stat->recursive_requires([ ]);
+
+ $dependencies{$name} = [ map $_->[0], @{ $stat->requires } ];
 
  my $meta = $self->meta;
  $stat->min_perl(CPANPLUS::Dist::Gentoo::Maps::perl_version_c2g(
@@ -558,19 +559,58 @@ Returns the source of the ebuild for the current dist object, or C<undef> when o
 
 =cut
 
+my $dep_tree_contains;
+{
+ my %seen;
+
+ $dep_tree_contains = sub {
+  my ($dist, $target) = @_;
+
+  return 0 if $seen{$dist};
+  local $seen{$dist} = 1;
+
+  for my $kid (@{ $dependencies{$dist} }) {
+   return 1 if $kid eq $target
+            or $dep_tree_contains->($kid, $target);
+  }
+
+  return 0;
+ }
+}
+
 sub ebuild_source {
  my $self = shift;
  my $stat = $self->status;
 
+ {
+  my $name = $stat->name;
+  my %recursive_kids = map { $_ => 1 }
+                        grep $dep_tree_contains->($_, $name),
+                         @{ $dependencies{$name} };
+  if (%recursive_kids) {
+   my (@requires, @recursive_requires);
+   for (@{ $stat->requires }) {
+    if ($recursive_kids{$_->[0]}) {
+     push @recursive_requires, $_;
+    } else {
+     push @requires, $_;
+    }
+   }
+   $stat->requires(\@requires);
+   $stat->recursive_requires(\@recursive_requires);
+  }
+ }
+
  # We must resolve the deps now and not inside prepare because _cpan2portage
  # has to see the ebuilds already generated for the dependencies of the current
  # dist.
 
- my (@configure_requires, @requires);
+ my (@configure_requires, @requires, @recursive_requires);
 
  my @phases = (
   [ configure_requires => \@configure_requires ],
   [ requires           => \@requires           ],
+  [ recursive_requires => \@recursive_requires ],
  );
 
  push @requires, CPANPLUS::Dist::Gentoo::Atom->new(
@@ -607,7 +647,9 @@ sub ebuild_source {
  $d   .= "SLOT=\"0\"\n";
  $d   .= 'LICENSE="|| ( ' . join(' ', sort @{$stat->license}) . " )\"\n";
  $d   .= 'KEYWORDS="' . join(' ', sort @{$stat->keywords}) . "\"\n";
- $d   .= 'RDEPEND="' . join("\n", sort @requires) . "\"\n";
+ $d   .= 'RDEPEND="' . join("\n", sort @requires) . "\"\n" if @requires;
+ $d   .= 'PDEPEND="' . join("\n", sort @recursive_requires) . "\"\n"
+                                                         if @recursive_requires;
  $d   .= 'DEPEND="' . join("\n", '${RDEPEND}', sort @configure_requires) . "\"\n";
  $d   .= "SRC_TEST=\"do\"\n";
  $d   .= $stat->footer;