1d186597fSespie# ex:ts=8 sw=4: 2*ecb1e57bSespie# $OpenBSD: ProgressMeter.pm,v 1.46 2015/05/18 10:25:10 espie Exp $ 3d186597fSespie# 433efc49fSespie# Copyright (c) 2010 Marc Espie <espie@openbsd.org> 5d186597fSespie# 6d186597fSespie# Permission to use, copy, modify, and distribute this software for any 7d186597fSespie# purpose with or without fee is hereby granted, provided that the above 8d186597fSespie# copyright notice and this permission notice appear in all copies. 9d186597fSespie# 10d186597fSespie# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 11d186597fSespie# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 12d186597fSespie# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 13d186597fSespie# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 14d186597fSespie# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 15d186597fSespie# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 1633efc49fSespie# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 17d186597fSespie 18d186597fSespieuse strict; 19d186597fSespieuse warnings; 20d186597fSespie 21466e8b70Sespiepackage OpenBSD::PackingElement; 22466e8b70Sespiesub compute_size 23466e8b70Sespie{ 24466e8b70Sespie my ($self, $totsize) = @_; 25466e8b70Sespie 26466e8b70Sespie $$totsize += $self->{size} if defined $self->{size}; 27466e8b70Sespie} 28466e8b70Sespie 29d186597fSespiepackage OpenBSD::ProgressMeter; 30af363cbdSespiesub new 31af363cbdSespie{ 3233efc49fSespie bless {}, "OpenBSD::ProgressMeter::Stub"; 33af363cbdSespie} 34af363cbdSespie 35466e8b70Sespiesub compute_size 36466e8b70Sespie{ 37466e8b70Sespie my ($self, $plist) = @_; 38466e8b70Sespie my $totsize = 0; 39466e8b70Sespie $plist->compute_size(\$totsize); 40466e8b70Sespie $totsize = 1 if $totsize == 0; 41466e8b70Sespie return $totsize; 42466e8b70Sespie} 43466e8b70Sespie 4433efc49fSespiesub setup 456e574fa7Sespie{ 4663313c1cSespie my ($self, $opt_x, $opt_m, $state) = @_; 47*ecb1e57bSespie $self->{state} = $state; 48a409537dSespie if ($opt_m || (!$opt_x && -t STDOUT)) { 4933efc49fSespie require OpenBSD::ProgressMeter::Term; 5033efc49fSespie bless $self, "OpenBSD::ProgressMeter::Term"; 5133efc49fSespie $self->init; 526e574fa7Sespie } 536e574fa7Sespie} 546e574fa7Sespie 55f43f2e8dSespiesub disable {} 56f43f2e8dSespie 570386587aSespiesub new_sizer 580386587aSespie{ 59*ecb1e57bSespie my ($progress, $plist) = @_; 60*ecb1e57bSespie return $progress->sizer_class->new($progress, $plist); 610386587aSespie} 620386587aSespie 63466e8b70Sespiesub sizer_class 640386587aSespie{ 65466e8b70Sespie "PureSizer" 660386587aSespie} 670386587aSespie 68f4f6c15cSespiesub for_list 69f4f6c15cSespie{ 70f4f6c15cSespie my ($self, $msg, $l, $code) = @_; 71f4f6c15cSespie if (defined $msg) { 72f4f6c15cSespie $self->set_header($msg); 73f4f6c15cSespie } 74f4f6c15cSespie my $total = scalar @$l; 75f4f6c15cSespie my $i = 0; 76f4f6c15cSespie for my $e (@$l) { 77f4f6c15cSespie $self->show(++$i, $total); 78f4f6c15cSespie &$code($e); 79f4f6c15cSespie } 80f4f6c15cSespie $self->next; 81f4f6c15cSespie} 82f4f6c15cSespie 8333efc49fSespie# stub class when no actual progressmeter that still prints out. 8433efc49fSespiepackage OpenBSD::ProgressMeter::Stub; 8533efc49fSespieour @ISA = qw(OpenBSD::ProgressMeter); 863cf81a87Sespie 8733efc49fSespiesub clear {} 8833efc49fSespie 89f43f2e8dSespie 9033efc49fSespiesub show {} 9133efc49fSespie 92ae1e9fdfSespiesub working {} 9333efc49fSespiesub message {} 9433efc49fSespie 9533efc49fSespiesub next {} 9633efc49fSespie 9733efc49fSespiesub set_header {} 98d186597fSespie 99f9ed702cSespiesub ntogo 100f9ed702cSespie{ 10133efc49fSespie return ""; 10233efc49fSespie} 10333efc49fSespie 10433efc49fSespiesub visit_with_size 10533efc49fSespie{ 106b3728a1dSespie my ($progress, $plist, $method, @r) = @_; 10733efc49fSespie $plist->$method(@r); 10833efc49fSespie} 10933efc49fSespie 11033efc49fSespiesub visit_with_count 11133efc49fSespie{ 11233efc49fSespie &OpenBSD::ProgressMeter::Stub::visit_with_size; 113f9ed702cSespie} 114f9ed702cSespie 115466e8b70Sespiepackage PureSizer; 116466e8b70Sespie 117466e8b70Sespiesub new 118466e8b70Sespie{ 119*ecb1e57bSespie my ($class, $progress, $plist) = @_; 120466e8b70Sespie $plist->{totsize} //= $progress->compute_size($plist); 121466e8b70Sespie bless { 122466e8b70Sespie progress => $progress, 123466e8b70Sespie totsize => $plist->{totsize}, 124466e8b70Sespie donesize => 0, 125466e8b70Sespie }, $class; 126466e8b70Sespie} 127466e8b70Sespie 128466e8b70Sespiesub advance 129466e8b70Sespie{ 130466e8b70Sespie my ($self, $e) = @_; 131466e8b70Sespie if (defined $e->{size}) { 132466e8b70Sespie $self->{donesize} += $e->{size}; 133466e8b70Sespie } 134466e8b70Sespie} 135466e8b70Sespie 136ac2937aeSespiesub saved 137ac2937aeSespie{ 138ac2937aeSespie my $self = shift; 139*ecb1e57bSespie $self->{progress}{state}{stats}{totsize} += $self->{totsize}; 140*ecb1e57bSespie $self->{progress}{state}{stats}{donesize} += $self->{donesize}; 141ac2937aeSespie} 142ac2937aeSespie 143d186597fSespie1; 144