From d0e1642686acda8c32309d43c7dd431025ea7ed9 Mon Sep 17 00:00:00 2001 From: espie Date: Mon, 21 Jan 2013 11:27:24 +0000 Subject: [PATCH] fix -R for multi-packages situation: once we ascertain a given port is out-of-date, also check every relevant subpackage, and remove the files accordingly. tricky loop to avoid recomputing things --- infrastructure/lib/DPB/PortBuilder.pm | 42 +++++++++++++++++++-------- 1 file changed, 30 insertions(+), 12 deletions(-) diff --git a/infrastructure/lib/DPB/PortBuilder.pm b/infrastructure/lib/DPB/PortBuilder.pm index e2e0e8ee424..1ba44bcb231 100644 --- a/infrastructure/lib/DPB/PortBuilder.pm +++ b/infrastructure/lib/DPB/PortBuilder.pm @@ -1,5 +1,5 @@ # ex:ts=8 sw=4: -# $OpenBSD: PortBuilder.pm,v 1.31 2013/01/21 02:06:12 espie Exp $ +# $OpenBSD: PortBuilder.pm,v 1.32 2013/01/21 11:27:24 espie Exp $ # # Copyright (c) 2010 Marc Espie # @@ -219,29 +219,47 @@ sub init my $uptodate = {}; -sub check_signature +sub equal_signatures { my ($self, $core, $v) = @_; - my $name = $v->fullpkgname; - return 0 unless -f "$self->{fullrepo}/$name.tgz"; - if ($uptodate->{$name}) { - return 1; - } - # check the package - my $p = $self->{repository}->find("$name.tgz"); + my $p = $self->{repository}->find($v->fullpkgname.".tgz"); my $plist = $p->plist(\&OpenBSD::PackingList::UpdateInfoOnly); my $pkgsig = $plist->signature->string; # and the port my $portsig = $self->{state}->grabber->grab_signature($core, $v->fullpkgpath); - if ($portsig eq $pkgsig) { + return $portsig eq $pkgsig; +} + +sub check_signature +{ + my ($self, $core, $v) = @_; + my $name = $v->fullpkgname; + if ($uptodate->{$name}) { + return 1; + } + if (-f "$self->{fullrepo}/$name.tgz" && + $self->equal_signatures($core, $v)) { $uptodate->{$name} = 1; print {$self->{logrebuild}} "$name: uptodate\n"; return 1; } else { + # XXX clean this first, so we skip over it in the loop + $self->{state}->grabber->clean_packages($core, $v->fullpkgpath); print {$self->{logrebuild}} "$name: rebuild\n"; - $self->{state}->grabber->clean_packages($core, - $v->fullpkgpath); + for my $w ($v->build_path_list) { + $name = $w->fullpkgname; + next unless -f "$self->{fullrepo}/$name.tgz"; + next if $uptodate->{$name}; + if ($self->equal_signatures($core, $w)) { + $uptodate->{$name} = 1; + print {$self->{logrebuild}} "$name: uptodate\n"; + next; + } + print {$self->{logrebuild}} "$name: rebuild\n"; + $self->{state}->grabber->clean_packages($core, + $w->fullpkgpath); + } return 0; } }