diff options
author | Marc Espie <espie@cvs.openbsd.org> | 2007-05-30 14:04:52 +0000 |
---|---|---|
committer | Marc Espie <espie@cvs.openbsd.org> | 2007-05-30 14:04:52 +0000 |
commit | e56a906b41f6a38ce9beeb3f0208dc449668f3ba (patch) | |
tree | 3380608fede29f19c94479b8dfbd94ad45d9dfdc /usr.sbin/pkg_add | |
parent | ba627c41a7bc412d55590a52ed12eab5be412606 (diff) |
simplify really_add to use real visitors for extraction and installation.
Just do one single try {} catchall {} per-method, as this is enough.
New methods: extract_and_progress, install_and_progress, that catch
interrupts (die) deal with fake, and handle the progress meter.
One single method: mark_progress, can be used for extraction, installation
and deletion.
Diffstat (limited to 'usr.sbin/pkg_add')
-rw-r--r-- | usr.sbin/pkg_add/OpenBSD/Add.pm | 30 | ||||
-rw-r--r-- | usr.sbin/pkg_add/OpenBSD/Delete.pm | 7 | ||||
-rw-r--r-- | usr.sbin/pkg_add/OpenBSD/Replace.pm | 27 | ||||
-rw-r--r-- | usr.sbin/pkg_add/OpenBSD/Vstat.pm | 17 | ||||
-rw-r--r-- | usr.sbin/pkg_add/pkg_add | 73 |
5 files changed, 83 insertions, 71 deletions
diff --git a/usr.sbin/pkg_add/OpenBSD/Add.pm b/usr.sbin/pkg_add/OpenBSD/Add.pm index a8917d706b8..98075c365b9 100644 --- a/usr.sbin/pkg_add/OpenBSD/Add.pm +++ b/usr.sbin/pkg_add/OpenBSD/Add.pm @@ -1,5 +1,5 @@ # ex:ts=8 sw=4: -# $OpenBSD: Add.pm,v 1.64 2007/05/30 13:03:54 espie Exp $ +# $OpenBSD: Add.pm,v 1.65 2007/05/30 14:04:51 espie Exp $ # # Copyright (c) 2003-2007 Marc Espie <espie@openbsd.org> # @@ -98,6 +98,22 @@ sub record_partial_installation return $borked; } +sub perform_installation +{ + my ($handle, $state) = @_; + + my $totsize = $handle->{totsize}; + $state->{archive} = $handle->{location}; + my $donesize = 0; + $state->{end_faked} = 0; + if (!defined $handle->{partial}) { + $handle->{partial} = {}; + } + $state->{partial} = $handle->{partial}; + $handle->{plist}->install_and_progress($state, \$donesize, $totsize); + $handle->{location}->finish_and_close; +} + # used by newuser/newgroup to deal with options. package OpenBSD::PackingElement; use OpenBSD::Error; @@ -108,6 +124,18 @@ sub prepare_for_addition { } +sub install_and_progress +{ + my ($self, $state, $donesize, $totsize) = @_; + unless ($state->{do_faked} && $state->{end_faked}) { + $self->install($state); + } + if ($state->{interrupted}) { + die "Interrupted"; + } + $self->mark_progress($donesize, $totsize); +} + sub install { my ($self, $state) = @_; diff --git a/usr.sbin/pkg_add/OpenBSD/Delete.pm b/usr.sbin/pkg_add/OpenBSD/Delete.pm index fa919e3cb7a..378b525dc87 100644 --- a/usr.sbin/pkg_add/OpenBSD/Delete.pm +++ b/usr.sbin/pkg_add/OpenBSD/Delete.pm @@ -1,5 +1,5 @@ # ex:ts=8 sw=4: -# $OpenBSD: Delete.pm,v 1.52 2007/05/30 12:30:15 espie Exp $ +# $OpenBSD: Delete.pm,v 1.53 2007/05/30 14:04:51 espie Exp $ # # Copyright (c) 2003-2007 Marc Espie <espie@openbsd.org> # @@ -145,10 +145,7 @@ sub delete_plist my $donesize = 0; for my $item (@{$plist->{groups}}, @{$plist->{users}}, @{$plist->{items}}) { $item->delete($state); - if (defined $item->{size}) { - $donesize += $item->{size}; - OpenBSD::ProgressMeter::show($donesize, $totsize); - } + $item->mark_progress(\$donesize, $totsize); } OpenBSD::ProgressMeter::next(); diff --git a/usr.sbin/pkg_add/OpenBSD/Replace.pm b/usr.sbin/pkg_add/OpenBSD/Replace.pm index 43f50f9b527..7d026bf7b25 100644 --- a/usr.sbin/pkg_add/OpenBSD/Replace.pm +++ b/usr.sbin/pkg_add/OpenBSD/Replace.pm @@ -1,5 +1,5 @@ # ex:ts=8 sw=4: -# $OpenBSD: Replace.pm,v 1.24 2007/05/30 13:03:54 espie Exp $ +# $OpenBSD: Replace.pm,v 1.25 2007/05/30 14:04:51 espie Exp $ # # Copyright (c) 2004-2006 Marc Espie <espie@openbsd.org> # @@ -54,6 +54,18 @@ sub unmark_lib { } +sub extract_and_progress +{ + require OpenBSD::ProgressMeter; + + my ($self, $state, $donesize, $totsize) = @_; + $self->extract($state); + if ($state->{interrupted}) { + die "Interrupted"; + } + $self->mark_progress($donesize, $totsize); +} + package OpenBSD::PackingElement::FileBase; use OpenBSD::Temp; @@ -212,6 +224,19 @@ use OpenBSD::PackageInfo; use OpenBSD::Error; use OpenBSD::Interactive; +sub perform_extraction +{ + my ($handle, $state) = @_; + + $handle->{partial} = {}; + $state->{partial} = $handle->{partial}; + my $totsize = $handle->{totsize}; + $state->{archive} = $handle->{location}; + my $donesize = 0; + $state->{donesize} = 0; + $handle->{plist}->extract_and_progress($state, \$donesize, $totsize); +} + sub can_do { my ($toreplace, $replacement, $state, $ignore) = @_; diff --git a/usr.sbin/pkg_add/OpenBSD/Vstat.pm b/usr.sbin/pkg_add/OpenBSD/Vstat.pm index 6ec2a02bc25..961d19c6cd0 100644 --- a/usr.sbin/pkg_add/OpenBSD/Vstat.pm +++ b/usr.sbin/pkg_add/OpenBSD/Vstat.pm @@ -1,5 +1,5 @@ # ex:ts=8 sw=4: -# $OpenBSD: Vstat.pm,v 1.29 2007/05/29 10:40:20 espie Exp $ +# $OpenBSD: Vstat.pm,v 1.30 2007/05/30 14:04:51 espie Exp $ # # Copyright (c) 2003-2007 Marc Espie <espie@openbsd.org> # @@ -398,4 +398,19 @@ sub handle } } +package OpenBSD::PackingElement; +sub mark_progress +{ +} + +package OpenBSD::PackingElement::FileBase; +sub mark_progress +{ + my ($self, $donesize, $totsize) = @_; + return unless defined $self->{size}; + require OpenBSD::ProgressMeter; + $$donesize += $self->{size}; + OpenBSD::ProgressMeter::show($$donesize, $totsize); +} + 1; diff --git a/usr.sbin/pkg_add/pkg_add b/usr.sbin/pkg_add/pkg_add index f00fd76de3a..0a63799ce94 100644 --- a/usr.sbin/pkg_add/pkg_add +++ b/usr.sbin/pkg_add/pkg_add @@ -1,7 +1,7 @@ #! /usr/bin/perl # ex:ts=8 sw=4: -# $OpenBSD: pkg_add,v 1.292 2007/05/30 12:52:06 espie Exp $ +# $OpenBSD: pkg_add,v 1.293 2007/05/30 14:04:51 espie Exp $ # # Copyright (c) 2003-2007 Marc Espie <espie@openbsd.org> # @@ -383,24 +383,14 @@ sub really_add OpenBSD::Replace::save_old_libraries($set, $state); - my $donesize = 0; - $handle->{partial} = {}; - $state->{partial} = $handle->{partial}; - my $totsize = $handle->{totsize}; - $state->{archive} = $handle->{location}; - for my $item (@{$plist->{items}}) { - try { - $item->extract($state); - } catchall { + try { + OpenBSD::Replace::perform_extraction($handle, $state); + } catchall { + unless ($state->{interrupted}) { Warn $_; $errors++; - }; - if (defined $item->{size}) { - $donesize += $item->{size}; - OpenBSD::ProgressMeter::show($donesize, $totsize); } - last if $state->{interrupted} || $errors; - } + }; OpenBSD::ProgressMeter::next(); if ($state->{interrupted} || $errors) { Fatal partial_install("Installation of $pkgname failed", @@ -439,58 +429,15 @@ sub really_add $state->set_pkgname($pkgname); } - if ($replacing) { - try { - do_script($plist, REQUIRE, $state, "INSTALL"); - do_script($plist, INSTALL, $state, "PRE-INSTALL"); - } catchall { - Warn $_; - $errors++; - }; - - if ($state->{interrupted} || $errors) { - # here we should remove links from the temp package - Fatal partial_install("Installation of $pkgname failed", - $set, $state); - } - } else { + try { do_script($plist, REQUIRE, $state, "INSTALL"); do_script($plist, INSTALL, $state, "PRE-INSTALL"); - } - - my $totsize = $handle->{totsize}; - $state->{archive} = $handle->{location}; - my $donesize = 0; - $state->{end_faked} = 0; - if (!defined $handle->{partial}) { - $handle->{partial} = {}; - } - $state->{partial} = $handle->{partial}; - for my $item (@{$plist->{groups}}, @{$plist->{users}}, @{$plist->{items}}) { - try { - $item->install($state); } - catchall { + OpenBSD::Add::perform_installation($handle, $state); + } catchall { + unless ($state->{interrupted}) { Warn $_; $errors++; - }; - last if $errors; - if (defined $item->{size}) { - $donesize += $item->{size}; - OpenBSD::ProgressMeter::show($donesize, $totsize); - } - - last if $state->{interrupted}; - # stop faked installation there... - if ($state->{do_faked} && $state->{end_faked}) { - last; } - } - - try { - $handle->{location}->finish_and_close; } - catchall { - Warn $_; - $errors++; }; OpenBSD::ProgressMeter::next(); |