Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
94 changes: 83 additions & 11 deletions source/lib/Seco/Multipkg.pm
Original file line number Diff line number Diff line change
Expand Up @@ -162,6 +162,14 @@ sub _init {
$self->{_rules} = [ $self->get_file_rules ];
}

sub need_build_require {
warn "WARN: Don't know how to install build requires."
." Please install yourself.\n";
0;
}

sub install_build_require { 1 }

sub setrelease {
my $self = shift;

Expand Down Expand Up @@ -303,9 +311,9 @@ sub install_gemspec {

my $geminstalldir = [$self->runcmd("gem environment gemdir")]->[0];
return $self->error("Can't run: $@") if($@);

chomp $geminstalldir;
my $fullinstalldir = $geminstalldir . "/gems/" .
my $fullinstalldir = $geminstalldir . "/gems/" .
$self->info->data->{name} . "-" .
$self->info->data->{version};
foreach ($self->listdir("$installdir/$fullinstalldir")) {
Expand All @@ -320,7 +328,7 @@ sub install_gemspec {

my $name = $self->info->data->{'name'};
my $version = $self->info->data->{'version'};

$self->runcmd("mkdir -p $installdir/$geminstalldir/specifications");
$self->template_file($self->info->confdir . "/templates/gemspec.template",
"$installdir/$geminstalldir/specifications/" .
Expand Down Expand Up @@ -383,6 +391,23 @@ sub listdir {
return @ret;
}

sub sudo {
# this procedure is modified from Seco::sudo
my $self = shift;
my $who = shift;
my $uid = getpwnam($who);

return system(@_) if ($> == $uid);

my $whoami = getpwuid($>);
warn "$whoami: This operation needs '$who' privileges. Invoking sudo.\n";

foreach my $sudo (qw(/usr/local/bin/sudo /usr/bin/sudo)) {
next unless -x $sudo;
return system($sudo, '-u', $who, @_);
}
}

# XXX: maybe keep a "global log of all command output" in the builder object,
# so we can toss that into the generated package too for tracability?
sub runcmd {
Expand Down Expand Up @@ -449,6 +474,13 @@ sub build {

}

# check and install buildrequire
foreach(@{$self->info->data->{buildrequires}}) {
$self->infomsg("INSTALLING $_");
$self->install_build_require( $_ )
if $self->need_build_require( $_ );
}

# build the source if there is any
if ( $self->info->data->{sourcedir} and -d $self->info->data->{sourcedir} ) {
$self->infomsg( "Building from " . $self->info->data->{sourcedir} );
Expand Down Expand Up @@ -504,7 +536,7 @@ sub build {
$self->info->scripts->{gembuild}) {
# FATAL ON ERRORS
$self->runcmd( "PERL=$perl INSTALLROOT=$destdir DESTDIR=$destdir "
. "PREFIX=$prefix PKGVERID="
. "PREFIX=$prefix PKGVERID="
. $self->pkgverid . " "
. "PACKAGEVERSION=" . $self->info->data->{version} . " "
. "PACKAGENAME=" . $self->info->data->{name} . " "
Expand All @@ -513,7 +545,7 @@ sub build {
} else {
# FATAL ON ERRORS
$self->runcmd( "PERL=$perl INSTALLROOT=$destdir DESTDIR=$destdir "
. "PREFIX=$prefix PKGVERID="
. "PREFIX=$prefix PKGVERID="
. $self->pkgverid . " "
. "PACKAGEVERSION=" . $self->info->data->{version} . " "
. "PACKAGENAME=" . $self->info->data->{name} . " "
Expand Down Expand Up @@ -791,6 +823,25 @@ BEGIN {
__PACKAGE__->_accessors( stagedir => undef );
}

sub need_build_require {
my $self = shift;
my $package = shift;

system('rpm', '--quiet', '-q', $package);

return ($? >> 8);
}

sub install_build_require {
my $self = shift;
my $package = shift;

$self->sudo('root', 'yum', 'install', '-y', $package);
return $self->error("Can't run yum install $package") if ($? >> 8);

1;
}

sub makepackage {
my $self = shift;

Expand All @@ -808,7 +859,7 @@ sub makepackage {
chomp $self->info->data->{arch};
}

$self->template_file( $self->info->confdir . "/templates/spec.template",
$self->template_file( $self->info->confdir . "/templates/spec.template",
$self->tmpdir . "/spec" );

open my $f, ">>" . $self->tmpdir . "/spec";
Expand All @@ -818,7 +869,7 @@ sub makepackage {
if($self->info->data->{gem}) {
$self->install_gemspec;
}

foreach ( $self->listdir($installdir) ) {
my $path = "$installdir/$_";
next if m{/\.packlist$}; # XXX: cleanup in build, not here
Expand Down Expand Up @@ -969,6 +1020,27 @@ BEGIN {

}

sub need_build_require {
my $self = shift;
my $package = shift;

my $out = qx(dpkg-query -W --showformat='\${Status}' '$package');

return 0 if $out =~ /install ok installed/;

1;
}

sub install_build_require {
my $self = shift;
my $package = shift;

$self->sudo('root', 'apt-get', '-y', 'install', $package);
return $self->error("Can't run apt-get install $package") if ($? >> 8);

1;
}

sub makepackage {
my $self = shift;

Expand Down Expand Up @@ -1036,17 +1108,17 @@ sub makepackage {
}
}
$self->info->data->{filelist} = join ",", @filelist;

# generate the gemspec file based on that
my $name = $self->info->data->{name};
my $version = $self->info->data->{version};

$self->runcmd("mkdir -p $installdir/$geminstalldir/specifications");

$self->template_file($self->info->confdir . "/templates/gemspec.template",
"$installdir/$geminstalldir/specifications/" .
"$name-$version.gemspec");

chdir($installdir . "/" . $fullinstalldir);
my $gem = undef;
my @ten = $self->runcmd("gem build $installdir/$geminstalldir/" .
Expand Down