+
+ for my $prog (qw<emerge ebuild>) {
+ unless (IPC::Cmd::can_run($prog)) {
+ __PACKAGE__->_abort("$prog is required to write ebuilds");
+ return $format_available = 0;
+ }
+ }
+
+ {
+ my $buffers;
+ my ($success, $errmsg) = IPC::Cmd::run(
+ command => [ qw<emerge --info> ],
+ verbose => 0,
+ buffer => \$buffers,
+ );
+ if ($success) {
+ if ($buffers =~ /^PORTDIR_OVERLAY=(.*)$/m) {
+ $overlays = [ map Cwd::abs_path($_), split ' ', $unquote->($1) ];
+ }
+ if ($buffers =~ /^ACCEPT_KEYWORDS=(.*)$/m) {
+ $default_keywords = [ split ' ', $unquote->($1) ];
+ }
+ if ($buffers =~ /^DISTDIR=(.*)$/m) {
+ $default_distdir = Cwd::abs_path($unquote->($1));
+ }
+ if ($buffers =~ /^PORTDIR=(.*)$/m) {
+ $main_portdir = Cwd::abs_path($unquote->($1));
+ }
+ } else {
+ __PACKAGE__->_abort($errmsg);
+ return $format_available = 0;
+ }
+ }
+
+ $default_keywords = [ 'x86' ] unless defined $default_keywords;
+ $default_distdir = '/usr/portage/distfiles' unless defined $default_distdir;
+
+ my $timestamp = CPANPLUS::Dist::Gentoo::Maps::get_portage_timestamp(
+ $main_portdir
+ );
+ if (defined $timestamp) {
+ __PACKAGE__->_notify("Portage tree $main_portdir dates back from UNIX timestamp $timestamp");
+ } else {
+ __PACKAGE__->_notify("Unable to get timestamp for portage tree $main_portdir, using gmtime instead");
+ $timestamp = POSIX::mktime(gmtime);
+ }
+ if ($timestamp < CPANPLUS::Dist::Gentoo::Maps::TIMESTAMP) {
+ __PACKAGE__->_abort("Portage tree too old (please run emerge --sync and retry)");
+ return $format_available = 0;
+ }
+
+ return $format_available = 1;