package JIB::Package::Source; use strict; use warnings; use base 'JIB::Package'; use JIB::Constants; use JIB::Config; use JIB::Installation; use File::Spec; use File::Basename qw[basename]; use Params::Check qw[check]; use Log::Message::Simple qw[:STD]; use YAML qw[LoadFile]; use Path::Class (); use Data::Dumper; $Data::Dumper::Indent = 1; ### only called from JIB::Package sub new { my $self = shift; my %hash = @_; my $file; my $meta; my $tmpl = { file => { required => 1, allow => FILE_EXISTS, store => \$file }, meta => { store => \$meta, allow => ISA_JIB_META }, }; my $args = check( $tmpl, \%hash ) or error( Params::Check->last_error ), return; ### make it a P::C item $args->{file} = Path::Class::file( $file ); while( my($acc,$val) = each %$args ) { $self->$acc( $val ); } unless( $meta or $meta = $self->extract_meta_object ) { return; } $self->package( $self->meta->package ); return $self; } =head2 $path = $pkg->file Location of the source package =head2 $meta = $pkg->meta The JIB::Meta object associated with this package =head2 $pkg->install( installation => INSTALLATION_OBJECT ) =cut ### XXX perl-ify sub install { my $self = shift; my $conf = $self->config; my %hash = @_; my $inst; my $tmpl = { installation => { required => 1, store => \$inst, allow => sub { UNIVERSAL::isa( shift(), 'JIB::Installation' ) } }, }; check( $tmpl, \%hash ) or error( Params::Check->last_error ), return; ### install check if( $inst->is_installed( package => $self ) ) { error("Package '". $self->package ."' is already installed --skipping"); return 1; } ### install the archive my $inst_pkg; { ### extract to a temp dir my $my_tmp_dir = File::Spec->catdir( $conf->temp_dir . "$$" ); system( qq[mkdir -p $my_tmp_dir] ) and die $?; ### extract the archive to the temp dir system( qq[tar -f ] . $self->file . qq[ -C $my_tmp_dir -xz]) and die $?; my $meta_dir = $inst->control_dir( $self->package ); my $data = $conf->archive_data; my $control = $conf->archive_control; ### extract the meta info ### XXX extract to $Builddir first, THEN copy later if all goes well { my $packlist = $inst->files_list( $self->package ); system( qq[mkdir -p $meta_dir] ) and die $?; ### XXX need status dir like dpkg system( qq[tar -f $my_tmp_dir/$control -C $meta_dir -xz] ) and die $?; ### write a .packlist equiv system( qq[tar -f $my_tmp_dir/$data -C $meta_dir -tz |] . qq[xargs -I % echo ] . $inst->dir . qq[/%] . qq[ >> $packlist] ) and die $?; } =begin comment { ### dependencies satisfied? my $info = LoadFile( File::Spec->catdir( $meta_dir, $config->meta_file ) ); my %avail = map { $_->{package} => $_ } LoadFile( $Available ); for my $depends ( list_dependencies( $info ) ) { ### XXX split depends: lines and objectified dependencies ### for better diagnostics die "Dependency '$depends->{package}' not satisfied " . "for '$path'" unless $avail{ $depends->{package} }; } } =cut ### extract the code { ### XXX we should *build* things here too system( qq[tar -f $my_tmp_dir/$data -C ] . $conf->compile_dir . q[ -xz] ); ### preinst hook my $preinst = $meta_dir->file( $conf->preinst ); if( -e $preinst && -s _ ) { system( qq[ $^X $preinst ] ) and die $?; } ### XXX we should build a binary package here, instead of ### just doing a cp -R my $src = $conf->compile_dir->subdir( $self->package ); system( qq[cp -R $src ]. $inst->dir ) and die $?; ### register the installation ### do this AFTER installing, duh! $inst_pkg = $inst->register( package => $self ) or error("Could not register package"), return; my $postinst = $meta_dir->file( $conf->postinst ); if( -e $postinst && -s _ ) { system( qq[ $^X $postinst ] ) and die $?; } ### clean up the builddir system( qq[rm -rf $src] ) and die $?; } ### clean up the temp dir system( qq[rm -rf $my_tmp_dir] ) and die $?; } return $inst_pkg; } 1; # Local variables: # c-indentation-style: bsd # c-basic-offset: 4 # indent-tabs-mode: nil # End: # vim: expandtab shiftwidth=4: