package JIB::Source;
use strict;
use warnings;
use JIB::Meta;
use JIB::Config;
use JIB::Utils;
use JIB::Package;
use File::chdir;
use File::Basename qw[basename];
use File::Temp qw[tempdir];
use Params::Check qw[check];
use Log::Message::Simple qw[:STD];
use base 'Object::Accessor';
=head1 ACCESSORS
=over 4
=item dir
=item meta
=item config
=back
=head1 METHODS
=head2 $src = JIB::Source->new( dir => /path/to/source )
=cut
sub new {
my $class = shift;
my %hash = @_;
my $dir;
my $tmpl = {
dir => { required => 1, allow => sub { -d shift() },
store => \$dir },
};
my $args = check( $tmpl, \%hash )
or ( error( Params::Check->last_error), return );
my $obj = $class->SUPER::new;
### XXX add allow handlers
$obj->mk_accessors( qw[meta config dir] );
### get a config and the meta object
{ my $config = JIB::Config->new;
my $meta = JIB::Meta->new(
file => File::Spec->catfile(
$dir, $config->jib_dir, $config->meta_file )
) or return;
$obj->config( $config );
$obj->meta( $meta );
$obj->dir( $dir );
}
return $obj;
}
=head2 $pkg = $src->build( ... )
=cut
### XXX need some good path manipulation tools.. this is too much work :(
#
# ### clean out the builddir
# { if( -d $builddir ) {
# JIB::Utils->_rmdir( dir => $builddir )
# or error( "Could not clean out '$builddir'" ), return;
# }
# JIB::Utils->_mkdir( dir => $builddir )
# or error( "Could not create clean '$builddir'" ), return;
# }
#
# ### XXX do this in one go
# { my $tmpdir = tempdir( CLEANUP => 1 );
# my $dirname = basename( $self->dir );
# my $tmpsrc = File::Spec->catdir( $tmpdir, $dirname );
#
#
# ### copy over sources to a temp dir
# JIB::Utils->_copy( file => $self->dir, to => $tmpdir )
# or error( "Could not copy sources to '$tmpdir'" ), return;
#
# ### toss out the meta dir
# JIB::Utils->_rmdir(
# dir => File::Spec->catfile( $tmpsrc, $self->config->build_dir ) )
# or error( "Could not remove metadir from '$tmpdir" ), return;
#
# ### copy these sources to a build dir
# JIB::Utils->_copy( file => $tmpsrc, to => $builddir )
# or error( "Could not copy sources to '$builddir'" ), return;
# }
#
# my $cwd = JIB::Utils->_chdir( dir => $builddir )
# or error( "Could not chdir to '$builddir'" ), return;
### XXX perl-ify
sub build {
my $self = shift;
my $conf = $self->config;
### XXX move to builddir under pkg_dir/_jib/build
my $path = $self->meta->package;
my $builddir = Path::Class::dir( $conf->build_dir . $path );
my $srcdir = $self->dir;
{ ### copy all the stuff over to another dir
### toss out old stuff
system( qq[ rm -rf $builddir ] ) and error($?), return;
### XXX instead of cp -R, we can read manifest/metafile
system( qq[mkdir -p $builddir] ) and error($?), return;
system( qq[mkdir -p $builddir/$path] ) and error($?), return;
system( qq[ cp -R $srcdir/* $builddir/$path ] ) and error($?), return;
}
### XXX make me more robust
local $CWD = $builddir;
### XXX invoke build code here
### build an archive file
my $archive = $path . $conf->archive_ext;
{ my $data = $conf->archive_data;
my $control = $conf->archive_control;
my $jibdir = $conf->jib_dir;
### XXX hardcoded .svn exclusion! we should fix this proper!
system( qq[tar --exclude $jibdir --exclude .svn -czf $data $path] )
and error($?), return;
system( qq[tar -f $control --exclude .svn -C $path/$jibdir -cz .] )
and error($?), return;
system( qq[tar -czf $archive $control $data] ) and error($?), return;
1 while unlink $data;
1 while unlink $control
}
### XXX clean up the builddir?
#system( qq[rm -rf $builddir] ) and error($?), return;
return JIB::Package->new(
file => File::Spec->rel2abs( $archive ),
meta => $self->meta,
);
}
1;
# Local variables:
# c-indentation-style: bsd
# c-basic-offset: 4
# indent-tabs-mode: nil
# End:
# vim: expandtab shiftwidth=4: