explain to the engine how to install stuff when it's ready (no error

checks though).

new -I option to do that.
change -C option to be more useful.
This commit is contained in:
espie 2011-11-14 21:57:47 +00:00
parent 5ffb1d6f17
commit 2f6111d127
5 changed files with 145 additions and 17 deletions

View File

@ -1,7 +1,7 @@
#! /usr/bin/perl
# ex:ts=8 sw=4:
# $OpenBSD: dpb,v 1.28 2011/11/09 08:28:55 espie Exp $
# $OpenBSD: dpb,v 1.29 2011/11/14 21:57:47 espie Exp $
#
# Copyright (c) 2010 Marc Espie <espie@openbsd.org>
#
@ -55,6 +55,7 @@ sub init
sub handle_options
{
my $state = shift;
$state->{dontclean} = {};
$state->{opt} = {
a => sub {
$state->{all} = 1;
@ -81,6 +82,29 @@ sub handle_options
push @main::ARGV, $_;
}
},
I => sub {
my $file = shift;
open my $fh, '<', $file or die "Can't open $file\n";
my $_;
while (<$fh>) {
chomp;
next if m/^\#/;
my $p = DPB::PkgPath->new($_);
$p->{wantinstall} = 1;
push @main::ARGV, $_;
}
},
C => sub {
my $file = shift;
open my $fh, '<', $file or die "Can't open $file\n";
my $_;
while (<$fh>) {
chomp;
next if m/^\#/;
s/\,.*//;
$state->{dontclean}{$_} = 1;
}
},
b => sub {
push(@{$state->{build_files}}, shift);
},
@ -89,9 +113,10 @@ sub handle_options
},
};
$state->SUPER::handle_options('acCeqrRstuUvh:xA:f:F:j:m:P:b:L:S:',
"[-acCerRsuUvx] [-A arch] [-f N] [-F N][-j N] [-P plist] [-h hosts]",
"[-L logdir] [-b log] [-t ctimeout] [-m threshold] [path ...]");
$state->SUPER::handle_options('aceqrRstuUvh:xA:C:f:F:I:j:m:P:b:L:S:',
"[-acerRsuUvx] [-A arch] [-C plist] [-f N] [-F N] [-I plist] [-j N]",
"[-P plist] [-h hosts] [-L logdir] [-b log] [-t ctimeout] [-m threshold]",
"[path ...]");
$state->{fullrepo} = join("/", $state->{repo}, $state->arch, "all");
$state->{logdir} //= $ENV{LOGDIR} //
join("/", $state->ports, "logs", $state->arch);

View File

@ -1,5 +1,5 @@
# ex:ts=8 sw=4:
# $OpenBSD: Engine.pm,v 1.35 2011/11/13 22:18:04 espie Exp $
# $OpenBSD: Engine.pm,v 1.36 2011/11/14 21:57:47 espie Exp $
#
# Copyright (c) 2010 Marc Espie <espie@openbsd.org>
#
@ -78,6 +78,11 @@ sub already_done
{
}
sub start_install
{
return 0;
}
sub start
{
my $self = shift;
@ -86,6 +91,9 @@ sub start
$self->{engine}->rebuild_info($core);
return;
}
if ($self->start_install($core)) {
return $core;
}
my $o = $self->sorted($core);
while (my $v = $o->next) {
$self->remove($v);
@ -153,9 +161,34 @@ sub new
my ($class, $engine, $builder) = @_;
my $o = $class->SUPER::new($engine);
$o->{builder} = $builder;
$o->{toinstall} = [];
return $o;
}
sub will_install
{
my ($self, $v) = @_;
push(@{$self->{toinstall}}, $v);
}
sub start_install
{
my ($self, $core) = @_;
return 0 unless $core->is_local;
if (my $v = pop @{$self->{toinstall}}) {
$self->{builder}->install($v, $core);
return 1;
} else {
return 0;
}
}
sub non_empty
{
my $self = shift;
return $self->SUPER::non_empty || @{$self->{toinstall}} > 0;
}
sub new_queue
{
my ($class, $engine) = @_;
@ -480,6 +513,9 @@ sub check_buildable
if ($self->adjust($v, 'RDEPENDS') == 0) {
delete $self->{built}{$v};
$self->{installable}{$v} = $v;
if ($v->{wantinstall}) {
$self->{buildable}->will_install($v);
}
$self->log_no_ts('I', $v);
$changes++;
} elsif (my $d = $self->should_ignore($v,

View File

@ -1,5 +1,5 @@
# ex:ts=8 sw=4:
# $OpenBSD: Port.pm,v 1.15 2011/11/12 13:19:26 espie Exp $
# $OpenBSD: Port.pm,v 1.16 2011/11/14 21:57:47 espie Exp $
#
# Copyright (c) 2010 Marc Espie <espie@openbsd.org>
#
@ -195,6 +195,39 @@ sub finalize
return 1;
}
package DPB::Task::Port::Install;
our @ISA=qw(DPB::Task::Port::NoTime);
sub run
{
my ($self, $core) = @_;
my $job = $core->job;
my $v = $job->{v};
my $sudo = OpenBSD::Paths->sudo;
$self->redirect($job->{log});
my @cmd = ('/usr/sbin/pkg_add');
if ($job->{builder}->{update}) {
push(@cmd, "-rqU", "-Dupdate", "-Dupdatedepends");
}
if ($job->{builder}->{forceupdate}) {
push(@cmd, "-Dinstalled");
}
print join(' ', @cmd, $v->fullpkgname, "\n");
my $path = $job->{builder}->{fullrepo}.'/';
$ENV{PKG_PATH} = $path;
exec{$sudo}($sudo, @cmd, $v->fullpkgname);
exit(1);
}
sub finalize
{
my ($self, $core) = @_;
$self->SUPER::finalize($core);
$core->{status} = 0;
return 1;
}
package DPB::Task::Port::ShowSize;
our @ISA = qw(DPB::Task::Port);
@ -330,14 +363,14 @@ sub new
push(@{$job->{tasks}},
DPB::Task::Port::Signature->new('signature'));
} else {
$job->add_normal_tasks;
$job->add_normal_tasks($builder->{dontclean}{$v->pkgpath});
}
return $job;
}
sub add_normal_tasks
{
my $self = shift;
my ($self, $dontclean) = @_;
my @todo;
my $builder = $self->{builder};
@ -358,7 +391,7 @@ sub add_normal_tasks
if ($builder->{size}) {
push @todo, 'show-fake-size';
}
if (!$builder->{dontclean}) {
if (!$dontclean) {
push @todo, 'clean';
}
$self->add_tasks(map {DPB::Port::TaskFactory->create($_)} @todo);
@ -485,5 +518,23 @@ sub really_watch
}
return 0;
}
package DPB::Job::Port::Install;
our @ISA = qw(DPB::Job::Port);
sub new
{
my ($class, $log, $v, $builder, $e) = @_;
my $job = bless {
tasks => [],
log => $log, v => $v,
builder => $builder, endcode => $e},
$class;
push(@{$job->{tasks}},
DPB::Task::Port::Install->new('install'));
return $job;
}
1;

View File

@ -1,5 +1,5 @@
# ex:ts=8 sw=4:
# $OpenBSD: PortBuilder.pm,v 1.13 2011/11/12 13:19:26 espie Exp $
# $OpenBSD: PortBuilder.pm,v 1.14 2011/11/14 21:57:47 espie Exp $
#
# Copyright (c) 2010 Marc Espie <espie@openbsd.org>
#
@ -31,7 +31,7 @@ sub new
my $self = bless {
state => $state,
clean => $state->opt('c'),
dontclean => $state->opt('C'),
dontclean => $state->{dontclean},
fetch => $state->opt('f'),
size => $state->opt('s'),
rebuild => $state->opt('R'),
@ -180,4 +180,14 @@ sub build
return $core;
}
sub install
{
my ($self, $v, $core) = @_;
my $log = $self->{logger}->make_logs($v);
my $job = DPB::Job::Port::Install->new($log, $v, $self,
sub {$core->mark_ready; });
$core->start_job($job, $v);
return $core;
}
1;

View File

@ -1,4 +1,4 @@
.\" $OpenBSD: dpb.1,v 1.17 2011/11/06 15:42:39 espie Exp $
.\" $OpenBSD: dpb.1,v 1.18 2011/11/14 21:57:47 espie Exp $
.\"
.\" Copyright (c) 2010 Marc Espie <espie@openbsd.org>
.\"
@ -14,7 +14,7 @@
.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
.\"
.Dd $Mdocdate: November 6 2011 $
.Dd $Mdocdate: November 14 2011 $
.Dt DPB 1
.Os
.Sh NAME
@ -23,12 +23,14 @@
.Sh SYNOPSIS
.Nm dpb
.Bk -words
.Op Fl acCeqrRsuUx
.Op Fl aceqrRsuUx
.Op Fl A Ar arch
.Op Fl b Ar logfile
.Op Fl C Ar pathlist
.Op Fl D Ar PARAM Ns = Ns Ar value
.Op Fl f Ar m
.Op Fl h Ar hosts
.Op Fl I Ar subdirlist
.Op Fl j Ar n
.Op Fl L Ar logdir
.Op Fl m Ar threshold
@ -72,9 +74,10 @@ Prime the heuristics module with a previous build log, so that packages that
take a long time to build will happen earlier.
.It Fl c
Clean port working directory and log before each build.
.It Fl C
Don't clean port working directory after build.
Warning: requires insane amounts of diskspace for a full build.
.It Fl C Ar pathlist
Don't clean port working directories after build.
Use a list of simple pkgpaths, as this does not take multi and flavors into
account.
.It Fl D Ar PARAM Ns = Ns Ar value
Set defined parameter to value.
Known parameters are as follows:
@ -151,6 +154,9 @@ file can also define a start-up script, as
STARTUP=path
.Ed
which will be run at start-up on each machine.
.It Fl I Ar subdirlist
List of pkgpaths to install, on the local box.
This will also add them to the list of things to build.
.It Fl j Ar n
Number of concurrent local jobs to run (defaults to hw.ncpu if no hosts file).
.It Fl L Ar logdir