xref: /openbsd-src/usr.sbin/pkg_add/OpenBSD/ProgressMeter.pm (revision f2da64fbbbf1b03f09f390ab01267c93dfd77c4c)
1# ex:ts=8 sw=4:
2# $OpenBSD: ProgressMeter.pm,v 1.49 2016/06/23 16:11:23 espie Exp $
3#
4# Copyright (c) 2010 Marc Espie <espie@openbsd.org>
5#
6# Permission to use, copy, modify, and distribute this software for any
7# purpose with or without fee is hereby granted, provided that the above
8# copyright notice and this permission notice appear in all copies.
9#
10# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17
18use strict;
19use warnings;
20
21package OpenBSD::PackingElement;
22sub compute_size
23{
24	my ($self, $totsize) = @_;
25
26	$$totsize += $self->{size} if defined $self->{size};
27}
28
29package OpenBSD::ProgressMeter;
30sub new
31{
32	bless {}, "OpenBSD::ProgressMeter::Stub";
33}
34
35sub compute_size
36{
37	my ($self, $plist) = @_;
38	my $totsize = 0;
39	$plist->compute_size(\$totsize);
40	$totsize = 1 if $totsize == 0;
41	return $totsize;
42}
43
44sub setup
45{
46	my ($self, $opt_x, $opt_m, $state) = @_;
47	$self->{state} = $state;
48	if ($opt_m || (!$opt_x && -t STDOUT)) {
49		require OpenBSD::ProgressMeter::Term;
50		bless $self, "OpenBSD::ProgressMeter::Term";
51		$self->init;
52	}
53}
54
55sub disable {}
56
57sub new_sizer
58{
59	my ($progress, $plist) = @_;
60	return $progress->sizer_class->new($progress, $plist);
61}
62
63sub sizer_class
64{
65	"PureSizer"
66}
67
68sub for_list
69{
70	my ($self, $msg, $l, $code) = @_;
71	if (defined $msg) {
72		$self->set_header($msg);
73	}
74	my $total = scalar @$l;
75	my $i = 0;
76	for my $e (@$l) {
77		$self->show(++$i, $total);
78		&$code($e);
79	}
80	$self->next;
81}
82
83sub compute_playfield
84{
85}
86
87# stub class when no actual progressmeter that still prints out.
88package OpenBSD::ProgressMeter::Stub;
89our @ISA = qw(OpenBSD::ProgressMeter);
90
91sub forked {}
92
93sub clear {}
94
95
96sub show {}
97
98sub working {}
99sub message {}
100
101sub next {}
102
103sub set_header {}
104
105sub ntogo
106{
107	return "";
108}
109
110sub visit_with_size
111{
112	my ($progress, $plist, $method, @r) = @_;
113	$plist->$method($progress->{state}, @r);
114}
115
116sub visit_with_count
117{
118	&OpenBSD::ProgressMeter::Stub::visit_with_size;
119}
120
121package PureSizer;
122
123sub new
124{
125	my ($class, $progress, $plist) = @_;
126	$plist->{totsize} //= $progress->compute_size($plist);
127	bless {
128	    progress => $progress,
129	    totsize => $plist->{totsize},
130	    donesize => 0,
131	    }, $class;
132}
133
134sub advance
135{
136	my ($self, $e) = @_;
137	if (defined $e->{size}) {
138		$self->{donesize} += $e->{size};
139	}
140}
141
142sub saved
143{
144	my $self = shift;
145	$self->{progress}{state}{stats}{totsize} += $self->{totsize};
146	$self->{progress}{state}{stats}{donesize} += $self->{donesize};
147}
148
1491;
150