X-Git-Url: http://git.vpit.fr/?a=blobdiff_plain;f=lib%2FCPANPLUS%2FDist%2FGentoo.pm;h=ee6c6129386951200413a8c96b260e1f9fabd863;hb=1ec3b5093e827a15cfd2cf15562affc9f0c28654;hp=945095428f563c4ea6b50ddc4935ea7180c5af32;hpb=012a8ae10e8fc6e70ff1b0f90c470196417c0bf1;p=perl%2Fmodules%2FCPANPLUS-Dist-Gentoo.git diff --git a/lib/CPANPLUS/Dist/Gentoo.pm b/lib/CPANPLUS/Dist/Gentoo.pm index 9450954..ee6c612 100644 --- a/lib/CPANPLUS/Dist/Gentoo.pm +++ b/lib/CPANPLUS/Dist/Gentoo.pm @@ -19,11 +19,11 @@ CPANPLUS::Dist::Gentoo - CPANPLUS backend generating Gentoo ebuilds. =head1 VERSION -Version 0.01 +Version 0.04 =cut -our $VERSION = '0.01'; +our $VERSION = '0.04'; =head1 SYNOPSIS @@ -31,20 +31,29 @@ our $VERSION = '0.01'; --dist-opts overlay=/usr/local/portage \ --dist-opts distdir=/usr/portage/distfiles \ --dist-opts manifest=yes \ + --dist-opts keywords=x86 \ + --dist-opts header="# Copyright 1999-2008 Gentoo Foundation" \ + --dist-opts footer="# End" \ Any::Module You::Like =head1 DESCRPITON -This module is a CPANPLUS backend that recursively generates Gentoo ebuilds for a given package in the specified overlay (defaults to C), update the manifest, and even emerge it (together with its dependencies) if the user requires it. You need write permissions on the directory where Gentoo fetches its source files (usually 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). You also need to specify the correct keyword for your architecture if it differs from the default C. -The generated ebuilds are placed into the section C. They favour depending on C or C rather than C. +The generated ebuilds are placed into the C category. They favour depending on C, C or C (in that order) rather than C. + +=head1 INSTALLATION + +After installing this module, you should append C to your F file. =head1 METHODS -All the methods are inherited from L. Please refer to its perldoc for precise information on what's done at each step. +All the methods are inherited from L. Please refer to its documentation for precise information on what's done at each step. =cut +use constant CATEGORY => 'perl-gcpanp'; + sub format_available { for my $prog (qw/emerge ebuild/) { unless (can_run($prog)) { @@ -55,24 +64,30 @@ sub format_available { return 1; } -my $overlay; - sub init { my ($self) = @_; my $stat = $self->status; - $stat->mk_accessors(qw/name version dist desc uri src license deps - eb_name eb_version eb_dir eb_file distdir fetched_arch - do_manifest/); + 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 + overlay distdir keywords do_manifest header footer + force verbose/); + + $stat->force($conf->get_conf('force')); + $stat->verbose($conf->get_conf('verbose')); return 1; } my %gentooism = ( - 'Digest' => 'digest-base', - 'Locale-Maketext' => 'locale-maketext', - 'Net-Ping' => 'net-ping', - 'PathTools' => 'File-Spec', - 'PodParser' => 'Pod-Parser', + 'Digest' => 'digest-base', + 'Locale-Maketext' => 'locale-maketext', + 'Net-Ping' => 'net-ping', + 'PathTools' => 'File-Spec', + 'PodParser' => 'Pod-Parser', + 'Set-Scalar' => 'set-scalar', + 'Tie-EncryptedHash' => 'tie-encryptedhash', ); sub prepare { @@ -84,12 +99,37 @@ sub prepare { my %opts = @_; - my $manifest = delete($opts{'manifest'}); - $manifest = 0 if not defined $manifest or $manifest =~ /^\s*no?\s*$/i; + my $keywords = delete $opts{'keywords'}; + $keywords = 'x86' unless defined $keywords; + $keywords = [ split ' ', $keywords ]; + $stat->keywords($keywords); + + my $manifest = delete $opts{'manifest'}; + $manifest = 1 unless defined $manifest; + $manifest = 0 if $manifest =~ /^\s*no?\s*$/i; $stat->do_manifest($manifest); - my $overlay = catdir(delete($opts{'overlay'}) || '/usr/local/portage', - 'perl-cpanp'); + + my $header = delete $opts{'header'}; + if (defined $header) { + 1 while chomp $header; + $header .= "\n\n"; + } else { + $header = ''; + } + $stat->header($header); + + my $footer = delete $opts{'footer'}; + if (defined $footer) { + $footer = "\n" . $footer; + } else { + $footer = ''; + } + $stat->footer($footer); + + $stat->overlay(delete($opts{'overlay'}) || '/usr/local/portage'); + $stat->distdir(delete($opts{'distdir'}) || '/usr/portage/distfiles'); + if ($stat->do_manifest && !-w $stat->distdir) { error 'distdir isn\'t writable -- aborting'; return 0; @@ -101,39 +141,71 @@ sub prepare { my $version = $mod->package_version; $stat->version($version); + + my $author = $mod->author->cpanid; + $stat->author($author); + $stat->dist($name . '-' . $version); - my $f = 1; - $version =~ s/_+/$f ? do { $f = 0; '_p' } : ''/ge; - 1 while $version =~ s/(_p[^.]*)\.+/$1/; + + $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_name($gentooism{$stat->name} || $stat->name); - $stat->eb_dir(catdir($overlay, $stat->eb_name)); - $stat->eb_file(catfile($stat->eb_dir, - $stat->eb_name . '-' . $stat->eb_version . '.ebuild')); - if (-r $stat->eb_file) { - msg 'Ebuild already generated for ' . $stat->dist . ' -- skipping'; - $stat->prepared(1); - $stat->created(1); - return 1; + $stat->eb_name($gentooism{$name} || $name); + + $stat->eb_dir(catdir($stat->overlay, CATEGORY, $stat->eb_name)); + + my $file = catfile($stat->eb_dir, + $stat->eb_name . '-' . $stat->eb_version . '.ebuild'); + if (-e $file) { + my $skip = 1; + if ($stat->force) { + if (-w $file) { + 1 while unlink $file; + $skip = 0; + } else { + error "Can't force rewriting of $file -- skipping"; + } + } else { + msg 'Ebuild already generated for ' . $stat->dist . ' -- skipping'; + } + if ($skip) { + $stat->prepared(1); + $stat->created(1); + return 1; + } } + $stat->eb_file($file); $self->SUPER::prepare(%opts); my $desc = $mod->description; ($desc = $name) =~ s/-+/::/g unless $desc; $stat->desc($desc); + $stat->uri('http://search.cpan.org/dist/' . $name); - unless ($name =~ /^([^-]+)/) { - error 'Wrong distribution name -- aborting'; + + unless ($author =~ /^(.)(.)/) { + error 'Wrong author name -- aborting'; return 0; } - $stat->src('mirror://cpan/modules/by-module/' . $1 . '/' . $mod->package); + $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)/; my $obj = $int->module_tree($prereq); unless ($obj) { error 'Wrong module object -- aborting'; @@ -174,7 +246,6 @@ sub create { $self->SUPER::create(@_); my $dir = $stat->eb_dir; - print STDERR "@@@ mkdir $dir\n"; unless (-d $dir) { eval { mkpath $dir }; if ($@) { @@ -183,13 +254,16 @@ sub create { } } - my $d = "# Generated by CPANPLUS::Dist::Gentoo\n\ninherit perl-module\n\n"; + 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 .= "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 { @@ -200,10 +274,12 @@ sub create { $a .= '-' . $_->[1]; } '|| ( ' . join(' ', map "$x$_/$a", - qw/perl-core dev-perl perl-cpanp/) # perl-gcpan ? + qw/perl-core dev-perl perl-gcpan/, CATEGORY) . ' )'; } @{$stat->deps}; $d .= "\"\n"; + $d .= "SRC_TEST=\"do\"\n"; + $d .= $stat->footer; my $file = $stat->eb_file; open my $eb, '>', $file or do { @@ -221,8 +297,7 @@ sub create { } msg 'Adding Manifest entry for ' . $stat->dist; - unless (scalar run command => [ 'ebuild', $file, 'manifest' ], verbose => 0) { - error 'ebuild manifest failed -- aborting'; + unless ($self->_run([ 'ebuild', $file, 'manifest' ], 0)) { 1 while unlink $file; return 0; } @@ -237,15 +312,10 @@ sub install { my $conf = $self->parent->parent->configure_object; my $sudo = $conf->get_program('sudo'); - my @cmd = 'emerge', '=' . $stat->eb_name . '-' . $stat->eb_version; + my @cmd = ('emerge', '=' . $stat->eb_name . '-' . $stat->eb_version); unshift @cmd, $sudo if $sudo; - unless (run command => \@cmd, verbose => 1) { - error 'emerge failed -- aborting'; - return 0; - } - - return 1; + return $self->_run(\@cmd, 1); } sub uninstall { @@ -254,15 +324,32 @@ sub uninstall { my $conf = $self->parent->parent->configure_object; my $sudo = $conf->get_program('sudo'); - my @cmd = 'emerge', '=' . $stat->eb_name . '-' . $stat->eb_version; + my @cmd = ('emerge', '-C', '=' . $stat->eb_name . '-' . $stat->eb_version); unshift @cmd, $sudo if $sudo; - unless (run command => \@cmd, verbose => 1) { - error 'emerge -C failed -- aborting'; - return 0; + return $self->_run(\@cmd, 1); +} + +sub _run { + my ($self, $cmd, $verbose) = @_; + my $stat = $self->status; + + my ($success, $errmsg, $output) = do { + local $ENV{PORTDIR_OVERLAY} = $stat->overlay; + local $ENV{PORTAGE_RO_DISTDIRS} = $stat->distdir; + run command => $cmd, verbose => $verbose; + }; + + unless ($success) { + error "$errmsg -- aborting"; + if (not $verbose and defined $output and $self->status->verbose) { + my $msg = join '', @$output; + 1 while chomp $msg; + error $msg; + } } - return 1; + return $success; } =head1 DEPENDENCIES @@ -283,6 +370,8 @@ L, L, L. Vincent Pit, C<< >>, L. +You can contact me by mail or on C (vincent). + =head1 BUGS Please report any bugs or feature requests to C, or through the web interface at L. I will be notified, and then you'll automatically be notified of progress on your bug as I make changes. @@ -297,6 +386,8 @@ You can find documentation for this module with the perldoc command. The module is to some extend cargo-culted from L and L. +Kent Fredric, for testing and suggesting improvements. + =head1 COPYRIGHT & LICENSE Copyright 2008 Vincent Pit, all rights reserved.