X-Git-Url: http://git.vpit.fr/?a=blobdiff_plain;f=lib%2FCPANPLUS%2FDist%2FGentoo.pm;h=7aa5da9e8dc08819af955348a6c0942a06657cab;hb=b3ea084ff7dcd01c3aa4440b4148c8c4ed14b944;hp=bcdc7282fb46c5267aba7b4ca37c8ad18cee84e9;hpb=94d4cd2d24e105bf0d2c8117e2b5d469ccd13581;p=perl%2Fmodules%2FCPANPLUS-Dist-Gentoo.git diff --git a/lib/CPANPLUS/Dist/Gentoo.pm b/lib/CPANPLUS/Dist/Gentoo.pm index bcdc728..7aa5da9 100644 --- a/lib/CPANPLUS/Dist/Gentoo.pm +++ b/lib/CPANPLUS/Dist/Gentoo.pm @@ -14,17 +14,19 @@ use CPANPLUS::Error; use base qw/CPANPLUS::Dist::Base/; +use CPANPLUS::Dist::Gentoo::Maps; + =head1 NAME CPANPLUS::Dist::Gentoo - CPANPLUS backend generating Gentoo ebuilds. =head1 VERSION -Version 0.04 +Version 0.06 =cut -our $VERSION = '0.04'; +our $VERSION = '0.06'; =head1 SYNOPSIS @@ -41,7 +43,7 @@ our $VERSION = '0.04'; This module is a CPANPLUS backend that recursively generates Gentoo ebuilds for a given package in the specified overlay (defaults to F), updates the manifest, and even emerges it (together with its dependencies) if the user requires it. You need write permissions on the directory where Gentoo fetches its source files (usually F). The valid C for the generated ebuilds are by default those given in C, but you can specify your own with the C dist-option. -The generated ebuilds are placed into the C category. They favour depending on C, C or C (in that order) rather than C. +The generated ebuilds are placed into the C category. They favour depending on a C, on C, C or C (in that order) rather than C. =head1 INSTALLATION @@ -57,12 +59,27 @@ use constant CATEGORY => 'perl-gcpanp'; my $overlays; my $default_keywords; +my $default_distdir; +my $main_portdir; + +my %forced; + +sub _unquote { + my $s = shift; + $s =~ s/^["']*//; + $s =~ s/["']*$//; + return $s; +} + +my $format_available; sub format_available { + return $format_available if defined $format_available; + for my $prog (qw/emerge ebuild/) { unless (can_run($prog)) { error "$prog is required to write ebuilds -- aborting"; - return 0; + return $format_available = 0; } } @@ -72,16 +89,16 @@ sub format_available { if ($success) { for (@{$output || []}) { if (/^PORTDIR_OVERLAY=(.*)$/m) { - my $o = $1; - $o =~ s/^["']*//; - $o =~ s/["']*$//; - $overlays = [ map abs_path($_), grep length, split /:/, $o ]; + $overlays = [ map abs_path($_), split ' ', _unquote($1) ]; } if (/^ACCEPT_KEYWORDS=(.*)$/m) { - my $k = $1; - $k =~ s/^["']*//; - $k =~ s/["']*$//; - $default_keywords = [ split ' ', $k ]; + $default_keywords = [ split ' ', _unquote($1) ]; + } + if (/^DISTDIR=(.*)$/m) { + $default_distdir = abs_path(_unquote($1)); + } + if (/^PORTDIR=(.*)$/m) { + $main_portdir = abs_path(_unquote($1)); } } } else { @@ -90,8 +107,9 @@ sub format_available { } $default_keywords = [ 'x86' ] unless defined $default_keywords; + $default_distdir = '/usr/portage/distfiles' unless defined $default_distdir; - return 1; + return $format_available = 1; } sub init { @@ -99,7 +117,7 @@ sub init { my $stat = $self->status; my $conf = $self->parent->parent->configure_object; - $stat->mk_accessors(qw/name version author distribution desc uri license + $stat->mk_accessors(qw/name version author distribution desc uri src license deps eb_name eb_version eb_dir eb_file fetched_arch portdir_overlay overlay distdir keywords do_manifest header footer @@ -111,80 +129,6 @@ sub init { return 1; } -my %gentooism = ( - 'ANSIColor' => 'Term-ANSIColor', - 'Audio-CD' => 'Audio-CD-disc-cover', - 'CGI-Simple' => 'Cgi-Simple', - 'Cache-Mmap' => 'cache-mmap', - 'Class-Loader' => 'class-loader', - 'Class-ReturnValue' => 'class-returnvalue', - 'Config-General' => 'config-general', - 'Convert-ASCII-Armour' => 'convert-ascii-armour', - 'Convert-PEM' => 'convert-pem', - 'Crypt-CBC' => 'crypt-cbc', - 'Crypt-DES_EDE3' => 'crypt-des-ede3', - 'Crypt-DH' => 'crypt-dh', - 'Crypt-DSA' => 'crypt-dsa', - 'Crypt-IDEA' => 'crypt-idea', - 'Crypt-Primes' => 'crypt-primes', - 'Crypt-RSA' => 'crypt-rsa', - 'Crypt-Random' => 'crypt-random', - 'DBIx-SearchBuilder' => 'dbix-searchbuilder', - 'Data-Buffer' => 'data-buffer', - 'Digest' => 'digest-base', - 'Digest-BubbleBabble' => 'digest-bubblebabble', - 'Digest-MD2' => 'digest-md2', - 'ExtUtils-Depends' => 'extutils-depends', - 'ExtUtils-PkgConfig' => 'extutils-pkgconfig', - 'Frontier-RPC' => 'frontier-rpc', - 'Gimp' => 'gimp-perl', - 'Glib' => 'glib-perl', - 'Gnome2-Canvas' => 'gnome2-canvas', - 'Gnome2-GConf' => 'gnome2-gconf', - 'Gnome2-Print' => 'gnome2-print', - 'Gnome2-VFS' => 'gnome2-vfs-perl', - 'Gnome2-Wnck' => 'gnome2-wnck', - 'Gtk2' => 'gtk2-perl', - 'Gtk2-Ex-FormFactory' => 'gtk2-ex-formfactory', - 'Gtk2-GladeXML' => 'gtk2-gladexml', - 'Gtk2-Spell' => 'gtk2-spell', - 'Gtk2-TrayIcon' => 'gtk2-trayicon', - 'Gtk2-TrayManager' => 'gtk2-traymanager', - 'Gtk2Fu' => 'gtk2-fu', - 'I18N-LangTags' => 'i18n-langtags', - 'Image-Info' => 'ImageInfo', - 'Image-Size' => 'ImageSize', - 'Inline-Files' => 'inline-files', - 'Locale-Maketext' => 'locale-maketext', - 'Locale-Maketext-Fuzzy' => 'locale-maketext-fuzzy', - 'Locale-Maketext-Lexicon' => 'locale-maketext-lexicon', - 'Log-Dispatch' => 'log-dispatch', - 'Math-Pari' => 'math-pari', - 'Module-Info' => 'module-info', - 'Net-Ping' => 'net-ping', - 'Net-SFTP' => 'net-sftp', - 'Net-SSH-Perl' => 'net-ssh-perl', - 'Net-Server' => 'net-server', - 'OLE-Storage_Lite' => 'OLE-StorageLite', - 'Ogg-Vorbis-Header' => 'ogg-vorbis-header', - 'PathTools' => 'File-Spec', - 'Pod-Parser' => 'PodParser', - 'Regexp-Common' => 'regexp-common', - 'SDL_Perl' => 'sdl-perl', - 'Set-Scalar' => 'set-scalar', - 'String-CRC32' => 'string-crc32', - 'Text-Autoformat' => 'text-autoformat', - 'Text-Reform' => 'text-reform', - 'Text-Template' => 'text-template', - 'Text-Wrapper' => 'text-wrapper', - 'Tie-EncryptedHash' => 'tie-encryptedhash', - 'Tk' => 'perl-tk', - 'Wx' => 'wxperl', - 'YAML' => 'yaml', - 'gettext' => 'Locale-gettext', - 'txt2html' => 'TextToHTML', -); - sub prepare { my $self = shift; my $mod = $self->parent; @@ -231,7 +175,7 @@ sub prepare { $stat->overlay($overlay); my $distdir = delete $opts{'distdir'}; - $distdir = (defined $distdir) ? abs_path $distdir : '/usr/portage/distfiles'; + $distdir = (defined $distdir) ? abs_path $distdir : $default_distdir; $stat->distdir($distdir); if ($stat->do_manifest && !-w $stat->distdir) { @@ -244,12 +188,11 @@ sub prepare { my $portdir_overlay; for (@$overlays) { if ($_ eq $overlay or File::Spec::Functions::abs2rel($overlay, $_) eq $cur) { - $portdir_overlay = join ':', @$overlays; + $portdir_overlay = [ @$overlays ]; last; } } - $portdir_overlay = join ':', @$overlays, $overlay - unless defined $portdir_overlay; + $portdir_overlay = [ @$overlays, $overlay ] unless $portdir_overlay; $stat->portdir_overlay($portdir_overlay); my $name = $mod->package_name; @@ -263,18 +206,9 @@ sub prepare { $stat->distribution($name . '-' . $version); - $version =~ s/[^\d._]+//g; - $version =~ s/^[._]*//; - $version =~ s/[._]*$//; - $version =~ s/[._]*_[._]*/_/g; - { - ($version, my $patch, my @rest) = split /_/, $version; - $version .= '_p' . $patch if defined $patch; - $version .= join('.', '', @rest) if @rest; - } - $stat->eb_version($version); + $stat->eb_version(CPANPLUS::Dist::Gentoo::Maps::version_c2g($version)); - $stat->eb_name($gentooism{$name} || $name); + $stat->eb_name(CPANPLUS::Dist::Gentoo::Maps::name_c2g($name)); $stat->eb_dir(catdir($stat->overlay, CATEGORY, $stat->eb_name)); @@ -284,9 +218,10 @@ sub prepare { if (-e $file) { my $skip = 1; - if ($stat->force) { + if ($stat->force and not $forced{$file}) { if (-w $file) { 1 while unlink $file; + $forced{$file} = 1; $skip = 0; } else { error "Can't force rewriting of $file -- skipping"; @@ -312,6 +247,13 @@ sub prepare { $stat->uri('http://search.cpan.org/dist/' . $name); + unless ($author =~ /^(.)(.)/) { + error 'Wrong author name -- aborting'; + return 0; + } + $stat->src("mirror://cpan/modules/by-authors/id/$1/$1$2/$author/" + . $mod->package); + $stat->license([ qw/Artistic GPL-2/ ]); my $prereqs = $mod->status->prereqs; @@ -333,7 +275,7 @@ sub prepare { $version = $obj->package_version; } } - push @depends, [ $obj , $version ]; + push @depends, [ $obj->package_name, $version ]; } } $stat->deps(\@depends); @@ -359,14 +301,6 @@ sub create { return 1; } - $stat->created(0); - $stat->dist(undef); - - $self->SUPER::create(@_); - - $stat->created(0); - $stat->dist(undef); - my $dir = $stat->eb_dir; unless (-d $dir) { eval { mkpath $dir }; @@ -376,29 +310,22 @@ sub create { } } + my %seen; + my $d = $stat->header; $d .= "# Generated by CPANPLUS::Dist::Gentoo version $VERSION\n\n"; $d .= 'MODULE_AUTHOR="' . $stat->author . "\"\ninherit perl-module\n\n"; + $d .= 'S="${WORKDIR}/' . $stat->distribution . "\"\n"; $d .= 'DESCRIPTION="' . $stat->desc . "\"\n"; - $d .= 'HOMEPAGE="' . $stat->uri . "\"\n\n"; + $d .= 'HOMEPAGE="' . $stat->uri . "\"\n"; + $d .= 'SRC_URI="' . $stat->src . "\"\n"; $d .= "SLOT=\"0\"\n"; $d .= 'LICENSE="|| ( ' . join(' ', sort @{$stat->license}) . " )\"\n"; $d .= 'KEYWORDS="' . join(' ', sort @{$stat->keywords}) . "\"\n"; - $d .= 'DEPEND="' . join "\n", - 'dev-lang/perl', - map { - my $a = $_->[0]->package_name; - $a = $gentooism{$a} || $a; - my $x = ''; - if (defined $_->[1]) { - $x = '>='; - $a .= '-' . $_->[1]; - } - '|| ( ' . join(' ', map "$x$_/$a", - qw/perl-core dev-perl perl-gcpan/, CATEGORY) - . ' )'; - } @{$stat->deps}; - $d .= "\"\n"; + $d .= 'DEPEND="' . join("\n", + sort grep !$seen{$_}++, 'dev-lang/perl', + map $self->_cpan2portage(@$_), @{$stat->deps} + ) . "\"\n"; $d .= "SRC_TEST=\"do\"\n"; $d .= $stat->footer; @@ -410,6 +337,14 @@ sub create { print $eb $d; close $eb; + $stat->created(0); + $stat->dist(undef); + + $self->SUPER::create(@_); + + $stat->created(0); + $stat->dist(undef); + if ($stat->do_manifest) { unless (copy $stat->fetched_arch, $stat->distdir) { error "Couldn\'t copy the distribution file to distdir ($!) -- aborting"; @@ -429,6 +364,41 @@ sub create { return 1; } +sub _cpan2portage { + my ($self, $name, $version) = @_; + + $name = CPANPLUS::Dist::Gentoo::Maps::name_c2g($name); + my $ver; + $ver = CPANPLUS::Dist::Gentoo::Maps::version_c2g($version) if defined $version; + + my @portdirs = ($main_portdir, @{$self->status->portdir_overlay}); + + for my $category (qw/virtual perl-core dev-perl perl-gcpan/, CATEGORY) { + my $atom = ($category eq 'virtual' ? 'perl-' : '') . $name; + + for my $portdir (@portdirs) { + my @ebuilds = glob catfile($portdir, $category, $atom,"$atom-*.ebuild"); + next unless @ebuilds; + + if (defined $ver) { # implies that $version is defined + for (@ebuilds) { + my ($eb_ver) = /\Q$atom\E-v?([\d._pr-]+).*?\.ebuild$/; + return ">=$category/$atom-$ver" + if defined $eb_ver + and CPANPLUS::Dist::Gentoo::Maps::version_gcmp($eb_ver, $ver) > 0; + } + } else { + return "$category/$atom"; + } + + } + + } + + error "Couldn't find an appropriate ebuild for $name in the portage tree -- skipping"; + return ''; +} + sub install { my $self = shift; my $stat = $self->status; @@ -464,7 +434,7 @@ sub _run { my $stat = $self->status; my ($success, $errmsg, $output) = do { - local $ENV{PORTDIR_OVERLAY} = $stat->portdir_overlay; + local $ENV{PORTDIR_OVERLAY} = join ' ', @{$stat->portdir_overlay}; local $ENV{PORTAGE_RO_DISTDIRS} = $stat->distdir; run command => $cmd, verbose => $verbose; }; @@ -487,7 +457,7 @@ Gentoo (L). L, L (core modules since 5.9.5). -L (since perl 5) L (5.001), L (5.002), L (5.00504). +L, L (since perl 5), L (5.001), L (5.002), L (5.00504). =head1 SEE ALSO @@ -519,7 +489,7 @@ Kent Fredric, for testing and suggesting improvements. =head1 COPYRIGHT & LICENSE -Copyright 2008 Vincent Pit, all rights reserved. +Copyright 2008-2009 Vincent Pit, all rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.