X-Git-Url: http://git.vpit.fr/?a=blobdiff_plain;f=lib%2FCPANPLUS%2FDist%2FGentoo.pm;h=cc57cbdab4d5f8cdb049de1036e71412e50e84e7;hb=4a91012c4ecca558dfb145019d834b4c53746f51;hp=d5a7b79dd375add110e358c90717d0217ad8268c;hpb=5af07d69e53872ebe1bdea02e0e880141eacd862;p=perl%2Fmodules%2FCPANPLUS-Dist-Gentoo.git diff --git a/lib/CPANPLUS/Dist/Gentoo.pm b/lib/CPANPLUS/Dist/Gentoo.pm index d5a7b79..cc57cbd 100644 --- a/lib/CPANPLUS/Dist/Gentoo.pm +++ b/lib/CPANPLUS/Dist/Gentoo.pm @@ -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 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;