X-Git-Url: http://git.vpit.fr/?a=blobdiff_plain;f=lib%2FCPANPLUS%2FDist%2FGentoo.pm;h=8e1809ccfe7f2598e014cc510374aa6cb1f7fa75;hb=037d26d9eaf3e61639651a8903524e9644f9d067;hp=25adfd351a6439ebe825eb3dd8c97378eef3a70f;hpb=da021514290fa95b8aafe23cc13ad2060a97a607;p=perl%2Fmodules%2FCPANPLUS-Dist-Gentoo.git diff --git a/lib/CPANPLUS/Dist/Gentoo.pm b/lib/CPANPLUS/Dist/Gentoo.pm index 25adfd3..8e1809c 100644 --- a/lib/CPANPLUS/Dist/Gentoo.pm +++ b/lib/CPANPLUS/Dist/Gentoo.pm @@ -39,7 +39,7 @@ our $VERSION = '0.04'; =head1 DESCRPITON -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). You also need to specify the correct keyword for your architecture if it differs from the default C. +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. @@ -55,6 +55,17 @@ All the methods are inherited from L. Please refer to its use constant CATEGORY => 'perl-gcpanp'; +my $overlays; +my $default_keywords; +my $default_distdir; + +sub _unquote { + my $s = shift; + $s =~ s/^["']*//; + $s =~ s/["']*$//; + return $s; +} + sub format_available { for my $prog (qw/emerge ebuild/) { unless (can_run($prog)) { @@ -62,6 +73,30 @@ sub format_available { return 0; } } + + if (IPC::Cmd->can_capture_buffer) { + my ($success, $errmsg, $output) = run command => [ qw/emerge --info/ ], + verbose => 0; + if ($success) { + for (@{$output || []}) { + if (/^PORTDIR_OVERLAY=(.*)$/m) { + $overlays = [ map abs_path($_), split ' ', _unquote($1) ]; + } + if (/^ACCEPT_KEYWORDS=(.*)$/m) { + $default_keywords = [ split ' ', _unquote($1) ]; + } + if (/^DISTDIR=(.*)$/m) { + $default_distdir = abs_path(_unquote($1)); + } + } + } else { + error $errmsg; + } + } + + $default_keywords = [ 'x86' ] unless defined $default_keywords; + $default_distdir = '/usr/portage/distfiles' unless defined $default_distdir; + return 1; } @@ -70,8 +105,9 @@ sub init { my $stat = $self->status; my $conf = $self->parent->parent->configure_object; - $stat->mk_accessors(qw/name version author dist desc uri src license deps - eb_name eb_version eb_dir eb_file fetched_arch + $stat->mk_accessors(qw/name version author distribution desc uri license + deps eb_name eb_version eb_dir eb_file fetched_arch + portdir_overlay overlay distdir keywords do_manifest header footer force verbose/); @@ -81,17 +117,78 @@ sub init { return 1; } -my %gentooism = ( - 'Crypt-RSA' => 'crypt-rsa', - 'Digest' => 'digest-base', - 'Locale-Maketext' => 'locale-maketext', - 'Math-Pari' => 'math-pari', - 'Net-Ping' => 'net-ping', - 'PathTools' => 'File-Spec', - 'PodParser' => 'Pod-Parser', - 'Set-Scalar' => 'set-scalar', - 'Tie-EncryptedHash' => 'tie-encryptedhash', - 'YAML' => 'yaml', +our %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 { @@ -103,9 +200,14 @@ sub prepare { my %opts = @_; + $stat->prepared(0); + my $keywords = delete $opts{'keywords'}; - $keywords = 'x86' unless defined $keywords; - $keywords = [ split ' ', $keywords ]; + if (defined $keywords) { + $keywords = [ split ' ', $keywords ]; + } else { + $keywords = $default_keywords; + } $stat->keywords($keywords); my $manifest = delete $opts{'manifest'}; @@ -135,7 +237,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) { @@ -144,6 +246,17 @@ sub prepare { } $stat->fetched_arch($mod->status->fetch); + my $cur = File::Spec::Functions::curdir(); + my $portdir_overlay; + for (@$overlays) { + if ($_ eq $overlay or File::Spec::Functions::abs2rel($overlay, $_) eq $cur) { + $portdir_overlay = [ @$overlays ]; + last; + } + } + $portdir_overlay = [ @$overlays, $overlay ] unless $portdir_overlay; + $stat->portdir_overlay($portdir_overlay); + my $name = $mod->package_name; $stat->name($name); @@ -153,7 +266,7 @@ sub prepare { my $author = $mod->author->cpanid; $stat->author($author); - $stat->dist($name . '-' . $version); + $stat->distribution($name . '-' . $version); $version =~ s/[^\d._]+//g; $version =~ s/^[._]*//; @@ -172,6 +285,8 @@ sub prepare { my $file = catfile($stat->eb_dir, $stat->eb_name . '-' . $stat->eb_version . '.ebuild'); + $stat->eb_file($file); + if (-e $file) { my $skip = 1; if ($stat->force) { @@ -182,35 +297,29 @@ sub prepare { error "Can't force rewriting of $file -- skipping"; } } else { - msg 'Ebuild already generated for ' . $stat->dist . ' -- skipping'; + msg 'Ebuild already generated for ' . $stat->distribution . ' -- skipping'; } if ($skip) { $stat->prepared(1); $stat->created(1); + $stat->dist($file); return 1; } } - $stat->eb_file($file); $self->SUPER::prepare(%opts); + $stat->prepared(0); + my $desc = $mod->description; ($desc = $name) =~ s/-+/::/g unless $desc; $stat->desc($desc); $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; - $prereqs = { map { ($gentooism{$_} || $_) => $prereqs->{$_} } keys %$prereqs }; my @depends; for my $prereq (sort keys %$prereqs) { next if $prereq =~ /^perl(?:-|\z)/; @@ -234,6 +343,7 @@ sub prepare { } $stat->deps(\@depends); + $stat->prepared(1); return 1; } @@ -242,17 +352,26 @@ sub create { my $stat = $self->status; unless ($stat->prepared) { - error 'Can\'t create ' . $stat->dist . ' since it was never prepared -- aborting'; + error 'Can\'t create ' . $stat->distribution . ' since it was never prepared -- aborting'; + $stat->created(0); + $stat->dist(undef); return 0; } if ($stat->created) { - msg $stat->dist . ' was already created -- skipping'; + msg $stat->distribution . ' was already created -- skipping'; + $stat->dist($stat->eb_file); 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 }; @@ -265,10 +384,8 @@ sub create { 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->dist . "\"\n"; $d .= 'DESCRIPTION="' . $stat->desc . "\"\n"; - $d .= 'HOMEPAGE="' . $stat->uri . "\"\n"; - $d .= 'SRC_URI="' . $stat->src . "\"\n"; + $d .= 'HOMEPAGE="' . $stat->uri . "\"\n\n"; $d .= "SLOT=\"0\"\n"; $d .= 'LICENSE="|| ( ' . join(' ', sort @{$stat->license}) . " )\"\n"; $d .= 'KEYWORDS="' . join(' ', sort @{$stat->keywords}) . "\"\n"; @@ -276,6 +393,7 @@ sub create { 'dev-lang/perl', map { my $a = $_->[0]->package_name; + $a = $gentooism{$a} || $a; my $x = ''; if (defined $_->[1]) { $x = '>='; @@ -304,13 +422,15 @@ sub create { return 0; } - msg 'Adding Manifest entry for ' . $stat->dist; + msg 'Adding Manifest entry for ' . $stat->distribution; unless ($self->_run([ 'ebuild', $file, 'manifest' ], 0)) { 1 while unlink $file; return 0; } } + $stat->created(1); + $stat->dist($file); return 1; } @@ -323,7 +443,10 @@ sub install { my @cmd = ('emerge', '=' . $stat->eb_name . '-' . $stat->eb_version); unshift @cmd, $sudo if $sudo; - return $self->_run(\@cmd, 1); + my $success = $self->_run(\@cmd, 1); + $stat->installed($success); + + return $success; } sub uninstall { @@ -335,7 +458,10 @@ sub uninstall { my @cmd = ('emerge', '-C', '=' . $stat->eb_name . '-' . $stat->eb_version); unshift @cmd, $sudo if $sudo; - return $self->_run(\@cmd, 1); + my $success = $self->_run(\@cmd, 1); + $stat->uninstalled($success); + + return $success; } sub _run { @@ -343,7 +469,7 @@ sub _run { my $stat = $self->status; my ($success, $errmsg, $output) = do { - local $ENV{PORTDIR_OVERLAY} = $stat->overlay; + local $ENV{PORTDIR_OVERLAY} = join ' ', @{$stat->portdir_overlay}; local $ENV{PORTAGE_RO_DISTDIRS} = $stat->distdir; run command => $cmd, verbose => $verbose; };