xref: /openbsd-src/usr.sbin/pkg_add/OpenBSD/AddCreateDelete.pm (revision 7de4ceff6d75a53aa3604ecbc838df34f56ada0d)
1a409537dSespie# ex:ts=8 sw=4:
2*7de4ceffSespie# $OpenBSD: AddCreateDelete.pm,v 1.57 2023/10/23 08:38:14 espie Exp $
3a409537dSespie#
445019a4aSespie# Copyright (c) 2007-2014 Marc Espie <espie@openbsd.org>
5a409537dSespie#
6a409537dSespie# Permission to use, copy, modify, and distribute this software for any
7a409537dSespie# purpose with or without fee is hereby granted, provided that the above
8a409537dSespie# copyright notice and this permission notice appear in all copies.
9a409537dSespie#
10a409537dSespie# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11a409537dSespie# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12a409537dSespie# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13a409537dSespie# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14a409537dSespie# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15a409537dSespie# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16a409537dSespie# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17a409537dSespie#
18a409537dSespie
19039cbdaaSespieuse v5.36;
20a409537dSespie
2137ce49d1Sespie# common behavior to pkg_add, pkg_delete, pkg_create
22a409537dSespie
23a409537dSespiepackage OpenBSD::AddCreateDelete::State;
247e83eca3Sespieour @ISA = qw(OpenBSD::State);
25a409537dSespie
267e83eca3Sespieuse OpenBSD::State;
277e83eca3Sespieuse OpenBSD::ProgressMeter;
28a409537dSespie
29039cbdaaSespiesub init($self, @p)
30a409537dSespie{
31a409537dSespie	$self->{progressmeter} = OpenBSD::ProgressMeter->new;
32a409537dSespie	$self->{bad} = 0;
33039cbdaaSespie	$self->SUPER::init(@p);
34a7d81fe1Sespie	$self->{export_level}++;
35a409537dSespie}
36a409537dSespie
37039cbdaaSespiesub progress($self)
38a409537dSespie{
39a409537dSespie	return $self->{progressmeter};
40a409537dSespie}
41a409537dSespie
42039cbdaaSespiesub not($self)
43a409537dSespie{
44a409537dSespie	return $self->{not};
45a409537dSespie}
46a409537dSespie
47039cbdaaSespiesub sync_display($self)
48a409537dSespie{
49bcdcc372Sespie	$self->progress->clear;
50a409537dSespie}
51a409537dSespie
52039cbdaaSespiesub add_interactive_options($self)
533f0a1a28Sespie{
543f0a1a28Sespie	$self->{has_interactive_options} = 1;
553f0a1a28Sespie	return $self;
563f0a1a28Sespie}
573f0a1a28Sespie
58ab20c635Sespiemy $setup = {
59badb2f8dSespie	nowantlib => q'
60ab20c635Sespie	    	use OpenBSD::Dependencies::SolverBase;
61ab20c635Sespie		no warnings qw(redefine);
62ab20c635Sespie		package OpenBSD::Dependencies::SolverBase;
63ab20c635Sespie		sub solve_wantlibs($, $) { 1 }
64badb2f8dSespie	    ',
65badb2f8dSespie	nosystemwantlib => q'
66bb20767bSespie	    	use OpenBSD::LibSpec;
67bb20767bSespie		package OpenBSD::Library::System;
68bb20767bSespie		sub no_match_dispatch($library, $spec, $base)
69bb20767bSespie		{
70bb20767bSespie			return $spec->no_match_name($library, $base);
71bb20767bSespie		}
72badb2f8dSespie	    ',
73badb2f8dSespie	norun => q'
74ab20c635Sespie		package OpenBSD::State;
75ab20c635Sespie		sub _system(@) { 0 }
76badb2f8dSespie	    ',
77ab20c635Sespie};
78ab20c635Sespie
79ab20c635Sespie
80039cbdaaSespiesub handle_options($state, $opt_string, @usage)
8137ce49d1Sespie{
823f0a1a28Sespie	my $i;
833f0a1a28Sespie
843f0a1a28Sespie	if ($state->{has_interactive_options}) {
853f0a1a28Sespie		$opt_string .= 'iI';
86039cbdaaSespie		$state->{opt}{i} = sub() {
873f0a1a28Sespie			$i++;
883f0a1a28Sespie		};
893f0a1a28Sespie	};
903f0a1a28Sespie
9163043f32Sespie	$state->SUPER::handle_options($opt_string.'L:mnx', @usage);
921b7dc0e4Sespie
9363313c1cSespie	$state->progress->setup($state->opt('x'), $state->opt('m'), $state);
941b7dc0e4Sespie	$state->{not} = $state->opt('n');
953f0a1a28Sespie	if ($state->{has_interactive_options}) {
963f0a1a28Sespie		if ($state->opt('I')) {
973f0a1a28Sespie			$i = 0;
983f0a1a28Sespie		} elsif (!defined $i) {
993f0a1a28Sespie			$i = -t STDIN;
1003f0a1a28Sespie		}
1013f0a1a28Sespie	}
10237ce49d1Sespie	$state->{interactive} = $state->interactive_class($i)->new($state, $i);
103db2ddd1aSespie	if ($state->defines('REGRESSION_TESTING')) {
104*7de4ceffSespie		for my $i (split(/[,\s]/,
105*7de4ceffSespie		    $state->defines('REGRESSION_TESTING'))) {
106db2ddd1aSespie			$state->{regression}{$i} = 1;
107ab20c635Sespie			if (defined $setup->{$i}) {
108badb2f8dSespie				eval "$setup->{$i}";
109badb2f8dSespie				if ($@) {
110badb2f8dSespie					$state->fatal(
111badb2f8dSespie					    "Regression testing #1: #2",
112badb2f8dSespie					    $i, $@);
113badb2f8dSespie				}
114ab20c635Sespie			}
115db2ddd1aSespie		}
116db2ddd1aSespie	}
117eb8b7390Sespie}
118eb8b7390Sespie
119039cbdaaSespiesub interactive_class($, $i)
120eb8b7390Sespie{
121039cbdaaSespie	if ($i) {
122039cbdaaSespie		require OpenBSD::Interactive;
123039cbdaaSespie		return 'OpenBSD::Interactive';
124039cbdaaSespie	} else {
125039cbdaaSespie		return 'OpenBSD::InteractiveStub';
126039cbdaaSespie	}
127eb8b7390Sespie}
128eb8b7390Sespie
129039cbdaaSespiesub is_interactive($self)
130645b31caSespie{
131039cbdaaSespie	return $self->{interactive}->is_interactive;
132039cbdaaSespie}
133039cbdaaSespie
134039cbdaaSespiesub find_window_size($state)
135039cbdaaSespie{
1367d6f6caeSespie	$state->SUPER::find_window_size;
137ef1b7bf1Sespie	$state->{progressmeter}->compute_playfield;
138ef1b7bf1Sespie}
139ef1b7bf1Sespie
140039cbdaaSespiesub handle_continue($state)
141ef1b7bf1Sespie{
1425e02c82dSespie	$state->SUPER::handle_continue;
143ef1b7bf1Sespie	$state->{progressmeter}->handle_continue;
144645b31caSespie}
145645b31caSespie
146039cbdaaSespiesub confirm_defaults_to_no($self, @p)
147eb8b7390Sespie{
148039cbdaaSespie	return $self->{interactive}->confirm($self->f(@p), 0);
149eb8b7390Sespie}
150eb8b7390Sespie
151039cbdaaSespiesub confirm_defaults_to_yes($self, @p)
152549f66e1Sespie{
153039cbdaaSespie	return $self->{interactive}->confirm($self->f(@p), 1);
154549f66e1Sespie}
155fb75580aSespie
156039cbdaaSespiesub ask_list($self, @p)
157eb8b7390Sespie{
158039cbdaaSespie	return $self->{interactive}->ask_list(@p);
1591b7dc0e4Sespie}
1601b7dc0e4Sespie
161039cbdaaSespiesub vsystem($self, @p)
16250a759b5Sespie{
163101180a9Sespie	if ($self->verbose < 2) {
164039cbdaaSespie		$self->system(@p);
165101180a9Sespie	} else {
166039cbdaaSespie		$self->verbose_system(@p);
16750a759b5Sespie	}
16850a759b5Sespie}
16950a759b5Sespie
170039cbdaaSespiesub system($self, @p)
171101180a9Sespie{
172039cbdaaSespie	$self->SUPER::system(@p);
173101180a9Sespie}
174101180a9Sespie
175039cbdaaSespiesub run_makewhatis($state, $opts, $l)
176101180a9Sespie{
177039cbdaaSespie	my $braindead = sub() { chdir('/'); };
178101180a9Sespie	while (@$l > 1000) {
179101180a9Sespie		my @b = splice(@$l, 0, 1000);
180e86ad7feSespie		$state->vsystem($braindead,
181e86ad7feSespie		    OpenBSD::Paths->makewhatis, @$opts, '--', @b);
182101180a9Sespie	}
183e86ad7feSespie	$state->vsystem($braindead,
184e86ad7feSespie	    OpenBSD::Paths->makewhatis, @$opts, '--', @$l);
185e86ad7feSespie}
186101180a9Sespie
187039cbdaaSespie# TODO this stuff is definitely not as clear as it could be
188039cbdaaSespiesub ntogo($self, $offset = 0)
1893b15eb69Sespie{
1903b15eb69Sespie	return $self->{wantntogo} ?
1913b15eb69Sespie	    $self->progress->ntogo($self, $offset) :
1923b15eb69Sespie	    $self->f("ok");
1933b15eb69Sespie}
1943b15eb69Sespie
195039cbdaaSespiesub ntogo_string($self, $offset = 0)
1963b15eb69Sespie{
1972d4feb81Sespie	return $self->{wantntogo} ?
198039cbdaaSespie	    $self->f(" (#1)", $self->ntodo($offset)) :
1992d4feb81Sespie	    $self->f("");
2003b15eb69Sespie}
2013b15eb69Sespie
202039cbdaaSespiesub solve_dependency($self, $solver, $dep, $package)
2036b05aa91Sespie{
2046b05aa91Sespie	return $solver->really_solve_dependency($self, $dep, $package);
2056b05aa91Sespie}
2066b05aa91Sespie
207a409537dSespiepackage OpenBSD::AddCreateDelete;
208a409537dSespieuse OpenBSD::Error;
209a409537dSespie
210039cbdaaSespiesub handle_options($self, $opt_string, $state, @usage)
211a409537dSespie{
2121b7dc0e4Sespie	$state->handle_options($opt_string, $self, @usage);
213a409537dSespie}
214a409537dSespie
215039cbdaaSespiesub try_and_run_command($self, $state)
2165a69ed8cSespie{
2173c025a5eSespie	if ($state->defines('pkg-debug')) {
2185a69ed8cSespie		$self->run_command($state);
2195a69ed8cSespie	} else {
2205a69ed8cSespie		try {
2215a69ed8cSespie			$self->run_command($state);
2225a69ed8cSespie		} catch {
2235a69ed8cSespie			$state->errsay("#1: #2", $state->{cmd}, $_);
2245a69ed8cSespie			OpenBSD::Handler->reset;
2255a69ed8cSespie			if ($_ =~ m/^Caught SIG(\w+)/o) {
2265a69ed8cSespie				kill $1, $$;
2275a69ed8cSespie			}
2285a69ed8cSespie			$state->{bad}++;
2295a69ed8cSespie		};
2305a69ed8cSespie	}
2315a69ed8cSespie}
2325a69ed8cSespie
233eb8b7390Sespiepackage OpenBSD::InteractiveStub;
234039cbdaaSespiesub new($class, $, $)
235eb8b7390Sespie{
236eb8b7390Sespie	bless {}, $class;
237eb8b7390Sespie}
238eb8b7390Sespie
239039cbdaaSespiesub ask_list($, $, @values)
240eb8b7390Sespie{
241eb8b7390Sespie	return $values[0];
242eb8b7390Sespie}
243eb8b7390Sespie
244039cbdaaSespiesub confirm($, $, $yesno)
245eb8b7390Sespie{
246eb8b7390Sespie	return $yesno;
247eb8b7390Sespie}
248eb8b7390Sespie
249039cbdaaSespiesub is_interactive($)
250eb8b7390Sespie{
251eb8b7390Sespie	return 0;
252eb8b7390Sespie}
253a409537dSespie1;
254