1 package Packaging
::Tools
::Plugin
::pkgsrc
;
7 use Carp
qw(carp croak);
8 use Carp
::Assert
qw(affirm);
10 use File
::Basename
qw();
12 use File
::Find
::Rule
qw(find);
14 use IO
::CaptureOutput
qw(capture_exec);
16 # make it optional - with cache only ...
18 use File
::Find
::Rule
::Age
;
23 extends
qw(Packaging::Tools::Plugin);
27 Packaging::Tools::Plugin::pkgsrc - Support tools packagers packaging Perl 5 modules
31 our $VERSION = '0.001';
35 =head1 SUBROUTINES/METHODS
44 has
'pkg_info_cmd' => (
52 builder
=> '_find_pkgsrc_dir'
57 defined( $ENV{PKGSRCDIR
} ) and return $ENV{PKGSRCDIR
};
60 foreach my $dir (qw(. .. ../.. /usr/pkgsrc))
63 and -f File
::Spec
->catfile( $dir, "mk", "bsd.pkg.mk" )
64 and return $self->{pkgsrcdir
} = Cwd
::abs_path
($dir);
72 my ( $self, $pkg_loc, @varnames ) = @_;
73 my $varnames = join( " ", @varnames );
74 my $last_dir = pushd
($pkg_loc);
75 my ( $stdout, $stderr, $success, $exit_code ) =
76 capture_exec
( $self->{MAKE
}, "show-vars", "VARNAMES=$varnames" );
77 if ( $success and 0 == $exit_code )
80 my @vals = split( "\n", $stdout );
87 =head2 find_installed_packages
91 sub find_installed_packages
95 -x
$self->pkg_info_cmd or croak
( "Can't exec " . $self->pkg_info_cmd . ": $!" );
96 my ( $stdout, $stderr, $success, $exit_code ) = capture_exec
( $self->pkg_info_cmd );
97 $success or croak
( "Error running " . $self->pkg_info_cmd . ": $stderr" );
100 map { $_ =~ m/^(.*)-(v?[0-9].*?)$/ ?
( $1 => $2 ) : ( $_ => 0E0
) }
101 map { ( split( m/\s+/, $_ ) )[0] } grep { 0 == index( $_, 'p5-' ) } split( "\n", $stdout );
106 =head2 _find_packaged_modules
110 sub _find_packaged_modules
112 my ( $self, $last_state ) = @_;
113 my $pkgsrc_base = $self->pkgsrcdir();
114 -d
$pkgsrc_base or return; # XXX die?
120 my $duration = $now - $last_state;
121 %age_args = ( age
=> [ newer
=> "${duration}s" ] );
124 my @p5_pkg_dirs = find
(
125 directory
=> name
=> "p5-*",
130 return map { $_ => $self->_fetch_full_pkg_details($_) } @p5_pkg_dirs;
133 =head2 _get_pkg_details
139 my ( $self, $pkg_loc, @var_names ) = @_;
141 $self->_pkg_details->{$pkg_loc} //= $self->_fetch_full_pkg_details($pkg_loc);
143 return @
{ $self->_pkg_details->{$pkg_loc} }{@var_names};
146 has
'_pkg_var_names' => (
148 isa
=> 'ArrayRef[Str]',
151 qw(DISTNAME DISTFILES EXTRACT_SUFX),
152 qw(PKGNAME PKGVERSION MAINTAINER),
153 qw(HOMEPAGE LICENSE MASTER_SITES)
160 sub _fetch_full_pkg_details
162 my ( $self, $pkg_loc ) = @_;
165 $distname, $distfiles, $suffix, $pkgname, $pkgver,
166 $maintainer, $homepage, $license, $master_sites
167 ) = $self->_get_pkg_vars( $pkg_loc, $self->_pkg_var_names() );
170 if ( $distname =~ m/^(.*)-(v?[0-9].*?)$/ )
176 my $pkgsrcdir = $self->_find_pkgsrc_dir();
179 $pkg_details{DIST_NAME
} = $distname;
180 $pkg_details{DIST_VERSION
} = $distver;
181 $pkg_details{DIST_FILE
} = $distfiles;
182 $pkg_details{PKG_NAME
} = $pkgname;
183 defined($pkgname) and defined($pkgver) and $pkg_details{PKG_NAME
} =~ s/-$pkgver//;
184 $pkg_details{PKG_VERSION
} = $pkgver;
185 $pkg_details{PKG_MAINTAINER
} = $maintainer;
186 $pkg_details{PKG_INSTALLED
} =
187 defined( $self->{installed_packages
}->{ $pkg_details{PKG_NAME
} } );
188 ( $pkg_details{PKG_LOCATION
} = $pkg_loc ) =~ s
|$pkgsrcdir/||;
189 $pkg_details{PKG_HOMEPAGE
} = $homepage;
190 $pkg_details{PKG_LICENSE
} = $license;
191 $pkg_details{PKG_MASTER_SITES
} = $master_sites;
193 return \
%pkg_details;
198 Jens Rehsack, C<< <rehsack at cpan.org> >>
204 1; # End of Packaging::Tools::Plugin::pkgsrc