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