X-Git-Url: http://git.vpit.fr/?a=blobdiff_plain;f=lib%2FCPANPLUS%2FDist%2FGentoo.pm;h=196683b03e06a7b6315d211911e41d7cfafb52f9;hb=2da3a2ee3000a7d24d7e112ea569dbed18d0d8cb;hp=962d60f7ff31b9d7ed8637429ba15ddd89aa0e9f;hpb=ab555439f607d3b694d56458b5aac851c544a993;p=perl%2Fmodules%2FCPANPLUS-Dist-Gentoo.git diff --git a/lib/CPANPLUS/Dist/Gentoo.pm b/lib/CPANPLUS/Dist/Gentoo.pm index 962d60f..196683b 100644 --- a/lib/CPANPLUS/Dist/Gentoo.pm +++ b/lib/CPANPLUS/Dist/Gentoo.pm @@ -65,9 +65,15 @@ sub format_available { sub init { my ($self) = @_; my $stat = $self->status; + my $conf = $self->parent->parent->configure_object; + $stat->mk_accessors(qw/name version dist desc uri src license deps - eb_name eb_version eb_dir eb_file distdir fetched_arch - keywords do_manifest/); + eb_name eb_version eb_dir eb_file fetched_arch + overlay distdir keywords do_manifest + force verbose/); + + $stat->force($conf->get_conf('force')); + $stat->verbose($conf->get_conf('verbose')); return 1; } @@ -101,10 +107,10 @@ sub prepare { $manifest = 0 if $manifest =~ /^\s*no?\s*$/i; $stat->do_manifest($manifest); - my $overlay = catdir(delete($opts{'overlay'}) || '/usr/local/portage', - CATEGORY); + $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; @@ -116,34 +122,60 @@ sub prepare { my $version = $mod->package_version; $stat->version($version); + $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'; return 0; } $stat->src('mirror://cpan/modules/by-module/' . $1 . '/' . $mod->package); + $stat->license([ qw/Artistic GPL-2/ ]); my $prereqs = $mod->status->prereqs; @@ -177,7 +209,6 @@ sub prepare { sub create { my $self = shift; my $stat = $self->status; - my $conf = $self->parent->parent->configure_object; unless ($stat->prepared) { error 'Can\'t create ' . $stat->dist . ' since it was never prepared -- aborting'; @@ -239,16 +270,7 @@ sub create { } msg 'Adding Manifest entry for ' . $stat->dist; - my ($success, $errmsg, $output) = run - command => [ 'ebuild', $file, 'manifest' ], - verbose => 0; - unless ($success) { - error "$errmsg -- aborting"; - if (defined $output and $conf->get_conf('verbose')) { - my $msg = join '', @$output; - 1 while chomp $msg; - error $msg; - } + unless ($self->_run([ 'ebuild', $file, 'manifest' ], 0)) { 1 while unlink $file; return 0; } @@ -266,14 +288,7 @@ sub install { my @cmd = ('emerge', '=' . $stat->eb_name . '-' . $stat->eb_version); unshift @cmd, $sudo if $sudo; - my ($success, $errmsg) = run command => \@cmd, - verbose => 1; - unless ($success) { - error "$errmsg -- aborting"; - return 0; - } - - return 1; + return $self->_run(\@cmd, 1); } sub uninstall { @@ -285,14 +300,29 @@ sub uninstall { my @cmd = ('emerge', '-C', '=' . $stat->eb_name . '-' . $stat->eb_version); unshift @cmd, $sudo if $sudo; - my ($success, $errmsg) = run command => \@cmd, - verbose => 1; + 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"; - return 0; + 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