← Index
NYTProf Performance Profile   « line view »
For /usr/sbin/pkg_info
  Run on Fri Aug 4 10:15:59 2017
Reported on Fri Aug 4 10:16:18 2017

Filename/usr/libdata/perl5/OpenBSD/PkgInfo.pm
StatementsExecuted 70 statements in 4.09ms
Subroutines
Calls P F Exclusive
Time
Inclusive
Time
Subroutine
1112.83ms10.0msmain::::BEGIN@22 main::BEGIN@22
1112.04ms12.0sOpenBSD::PkgInfo::::parse_and_run OpenBSD::PkgInfo::parse_and_run
1111.32ms10.3msOpenBSD::PkgInfo::State::::BEGIN@65 OpenBSD::PkgInfo::State::BEGIN@65
111567µs701µsOpenBSD::PkgInfo::::BEGIN@179 OpenBSD::PkgInfo::BEGIN@179
11150µs75µsOpenBSD::PkgInfo::State::::hasanyopt OpenBSD::PkgInfo::State::hasanyopt
41147µs47µsmain::::CORE:regcomp main::CORE:regcomp (opcode)
11143µs43µsOpenBSD::PkgInfo::::CORE:sort OpenBSD::PkgInfo::CORE:sort (opcode)
11117µs21µsmain::::BEGIN@19.1 main::BEGIN@19.1
11116µs105µsOpenBSD::PkgInfo::State::::lock OpenBSD::PkgInfo::State::lock
41114µs14µsmain::::CORE:match main::CORE:match (opcode)
11112µs141µsOpenBSD::PkgInfo::::BEGIN@177 OpenBSD::PkgInfo::BEGIN@177
11111µs74µsOpenBSD::PkgInfo::::BEGIN@180 OpenBSD::PkgInfo::BEGIN@180
1119µs16µsmain::::BEGIN@20.2 main::BEGIN@20.2
1117µs7µsOpenBSD::PkgInfo::::BEGIN@178 OpenBSD::PkgInfo::BEGIN@178
1117µs7µsOpenBSD::PkgInfo::State::::setopts OpenBSD::PkgInfo::State::setopts
0000s0sOpenBSD::PackingElement::FileBase::::dump_file OpenBSD::PackingElement::FileBase::dump_file
0000s0sOpenBSD::PackingElement::FileObject::::hunt_fileOpenBSD::PackingElement::FileObject::hunt_file
0000s0sOpenBSD::PackingElement::::dump_file OpenBSD::PackingElement::dump_file
0000s0sOpenBSD::PackingElement::::hunt_file OpenBSD::PackingElement::hunt_file
0000s0sOpenBSD::PackingElement::::sum_up OpenBSD::PackingElement::sum_up
0000s0sOpenBSD::PkgInfo::State::::banner OpenBSD::PkgInfo::State::banner
0000s0sOpenBSD::PkgInfo::State::::footer OpenBSD::PkgInfo::State::footer
0000s0sOpenBSD::PkgInfo::State::::header OpenBSD::PkgInfo::State::header
0000s0sOpenBSD::PkgInfo::State::::log OpenBSD::PkgInfo::State::log
0000s0sOpenBSD::PkgInfo::State::::print_description OpenBSD::PkgInfo::State::print_description
0000s0sOpenBSD::PkgInfo::State::::printfile OpenBSD::PkgInfo::State::printfile
0000s0sOpenBSD::PkgInfo::State::::printfile_sorted OpenBSD::PkgInfo::State::printfile_sorted
0000s0sOpenBSD::PkgInfo::::__ANON__[:320] OpenBSD::PkgInfo::__ANON__[:320]
0000s0sOpenBSD::PkgInfo::::__ANON__[:339] OpenBSD::PkgInfo::__ANON__[:339]
0000s0sOpenBSD::PkgInfo::::__ANON__[:545] OpenBSD::PkgInfo::__ANON__[:545]
0000s0sOpenBSD::PkgInfo::::__ANON__[:552] OpenBSD::PkgInfo::__ANON__[:552]
0000s0sOpenBSD::PkgInfo::::__ANON__[:663] OpenBSD::PkgInfo::__ANON__[:663]
0000s0sOpenBSD::PkgInfo::::add_to_path_info OpenBSD::PkgInfo::add_to_path_info
0000s0sOpenBSD::PkgInfo::::filter_files OpenBSD::PkgInfo::filter_files
0000s0sOpenBSD::PkgInfo::::find_by_path OpenBSD::PkgInfo::find_by_path
0000s0sOpenBSD::PkgInfo::::find_by_spec OpenBSD::PkgInfo::find_by_spec
0000s0sOpenBSD::PkgInfo::::find_pkg OpenBSD::PkgInfo::find_pkg
0000s0sOpenBSD::PkgInfo::::find_pkg_in OpenBSD::PkgInfo::find_pkg_in
0000s0sOpenBSD::PkgInfo::::get_comment OpenBSD::PkgInfo::get_comment
0000s0sOpenBSD::PkgInfo::::get_line OpenBSD::PkgInfo::get_line
0000s0sOpenBSD::PkgInfo::::manual_filter OpenBSD::PkgInfo::manual_filter
0000s0sOpenBSD::PkgInfo::::print_info OpenBSD::PkgInfo::print_info
0000s0smain::::RUNTIME main::RUNTIME
Call graph for these subroutines as a Graphviz dot language file.
Line State
ments
Time
on line
Calls Time
in subs
Code
1#! /usr/bin/perl
2# ex:ts=8 sw=4:
3# $OpenBSD: PkgInfo.pm,v 1.44 2017/01/25 14:10:46 espie Exp $
4#
5# Copyright (c) 2003-2014 Marc Espie <espie@openbsd.org>
6#
7# Permission to use, copy, modify, and distribute this software for any
8# purpose with or without fee is hereby granted, provided that the above
9# copyright notice and this permission notice appear in all copies.
10#
11# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18
19229µs225µs
# spent 21µs (17+4) within main::BEGIN@19.1 which was called: # once (17µs+4µs) by main::run at line 19
use strict;
# spent 21µs making 1 call to main::BEGIN@19.1 # spent 4µs making 1 call to strict::import
20224µs224µs
# spent 16µs (9+7) within main::BEGIN@20.2 which was called: # once (9µs+7µs) by main::run at line 20
use warnings;
# spent 16µs making 1 call to main::BEGIN@20.2 # spent 7µs making 1 call to warnings::import
21
222281µs210.1ms
# spent 10.0ms (2.83+7.21) within main::BEGIN@22 which was called: # once (2.83ms+7.21ms) by main::run at line 22
use OpenBSD::State;
# spent 10.0ms making 1 call to main::BEGIN@22 # spent 24µs making 1 call to Exporter::import
23
24package OpenBSD::PackingElement;
25sub dump_file
26{
27}
28
29sub hunt_file
30{
31}
32
33sub sum_up
34{
35 my ($self, $rsize) = @_;
36 if (defined $self->{size}) {
37 $$rsize += $self->{size};
38 }
39}
40
41package OpenBSD::PackingElement::FileBase;
42sub dump_file
43{
44 my ($item, $opt_K) = @_;
45 if ($opt_K) {
46 print '@', $item->keyword, " ";
47 }
48 print $item->fullname, "\n";
49}
50
51package OpenBSD::PackingElement::FileObject;
52sub hunt_file
53{
54 my ($item, $h, $pkgname, $l) = @_;
55 my $fname = $item->fullname;
56 if (defined $h->{$fname}) {
57 push(@{$h->{$fname}}, $pkgname);
58 push(@$l, $pkgname);
59 }
60}
61
62package OpenBSD::PkgInfo::State;
6319µsour @ISA = qw(OpenBSD::State);
64
652704µs210.5ms
# spent 10.3ms (1.32+9.02) within OpenBSD::PkgInfo::State::BEGIN@65 which was called: # once (1.32ms+9.02ms) by main::run at line 65
use OpenBSD::PackageInfo;
# spent 10.3ms making 1 call to OpenBSD::PkgInfo::State::BEGIN@65 # spent 127µs making 1 call to Exporter::import
66
67sub lock
68
# spent 105µs (16+89) within OpenBSD::PkgInfo::State::lock which was called: # once (16µs+89µs) by OpenBSD::PkgInfo::parse_and_run at line 584
{
691800ns my $state = shift;
701800ns return if $state->{locked};
7112µs12µs return if $state->{subst}->value('nolock');
# spent 2µs making 1 call to OpenBSD::Subst::value
7214µs287µs lock_db(1, $state->opt('q') ? undef : $state);
# spent 84µs making 1 call to OpenBSD::PackageInfo::lock_db # spent 2µs making 1 call to OpenBSD::State::opt
7314µs $state->{locked} = 1;
74}
75
76sub banner
77{
78 my ($state, @args) = @_;
79 return if $state->opt('q');
80 $state->print("#1", $state->opt('l')) if $state->opt('l');
81 $state->say(@args);
82}
83
84sub header
85{
86 my ($state, $handle) = @_;
87 return if $state->{terse} || $state->opt('q');
88 my $url = $handle->url;
89 return if $state->{header_done}{$url};
90 $state->{header_done}{$url} = 1;
91 $state->banner("Information for #1\n", $url);
92}
93
94sub footer
95{
96 my ($state, $handle) = @_;
97 return if $state->opt('q') || $state->{terse};
98 return unless $state->{header_done}{$handle->url};
99 if ($state->opt('l')) {
100 $state->say("#1", $state->opt('l'));
101 } else {
102 $state->say;
103 }
104}
105
106sub printfile
107{
108 my ($state, $filename) = @_;
109
110 open my $fh, '<', $filename or return;
111 while(<$fh>) {
112 chomp;
113 $state->say("#1", $_);
114 }
115 close $fh;
116 $state->say;
117}
118
119sub printfile_sorted
120{
121 my ($state, $filename) = @_;
122
123 open my $fh, '<', $filename or return;
124 my @lines = (<$fh>);
125 close $fh;
126 foreach my $line (sort @lines) {
127 chomp $line;
128 $state->say("#1", $line);
129 }
130 $state->say;
131}
132
133sub print_description
134{
135 my ($state, $dir) = @_;
136
137 open my $fh, '<', $dir.DESC or return;
138 $_ = <$fh>; # zap COMMENT
139 while(<$fh>) {
140 chomp;
141 $state->say("#1", $_);
142 }
143 close $fh;
144 $state->say;
145}
146
147sub hasanyopt
148
# spent 75µs (50+25) within OpenBSD::PkgInfo::State::hasanyopt which was called: # once (50µs+25µs) by OpenBSD::PkgInfo::parse_and_run at line 588
{
1491900ns my ($self, $string) = @_;
15016µs for my $i (split //, $string) {
1511132µs1125µs if ($self->opt($i)) {
# spent 25µs making 11 calls to OpenBSD::State::opt, avg 2µs/call
152 return 1;
153 }
154 }
15514µs return 0;
156}
157
158sub setopts
159
# spent 7µs within OpenBSD::PkgInfo::State::setopts which was called: # once (7µs+0s) by OpenBSD::PkgInfo::parse_and_run at line 588
{
1601800ns my ($self, $string) = @_;
16115µs for my $i (split //, $string) {
16223µs $self->{opt}{$i} = 1;
163 }
164}
165
166sub log
167{
168 my $self = shift;
169 if (@_ == 0) {
170 return $self;
171 } else {
172 $self->say(@_);
173 }
174}
175
176package OpenBSD::PkgInfo;
177231µs2270µs
# spent 141µs (12+129) within OpenBSD::PkgInfo::BEGIN@177 which was called: # once (12µs+129µs) by main::run at line 177
use OpenBSD::PackageInfo;
# spent 141µs making 1 call to OpenBSD::PkgInfo::BEGIN@177 # spent 129µs making 1 call to Exporter::import
178230µs17µs
# spent 7µs within OpenBSD::PkgInfo::BEGIN@178 which was called: # once (7µs+0s) by main::run at line 178
use OpenBSD::PackageName;
# spent 7µs making 1 call to OpenBSD::PkgInfo::BEGIN@178
1792172µs2736µs
# spent 701µs (567+134) within OpenBSD::PkgInfo::BEGIN@179 which was called: # once (567µs+134µs) by main::run at line 179
use OpenBSD::Getopt;
# spent 701µs making 1 call to OpenBSD::PkgInfo::BEGIN@179 # spent 35µs making 1 call to Exporter::import
18022.37ms2136µs
# spent 74µs (11+63) within OpenBSD::PkgInfo::BEGIN@180 which was called: # once (11µs+63µs) by main::run at line 180
use OpenBSD::Error;
# spent 74µs making 1 call to OpenBSD::PkgInfo::BEGIN@180 # spent 63µs making 1 call to Exporter::import
181
182
1831700nsmy $total_size = 0;
1841700nsmy $pkgs = 0;
185
186sub find_pkg_in
187{
188 my ($self, $state, $repo, $pkgname, $code) = @_;
189
190 if (OpenBSD::PackageName::is_stem($pkgname)) {
191 require OpenBSD::Search;
192 my $l = $repo->match_locations(OpenBSD::Search::Stem->new($pkgname));
193 if (@$l != 0) {
194 for my $pkg (sort {$a->name cmp $b->name} @$l) {
195 &$code($pkg->name, $pkg);
196 $pkg->close_now;
197 $pkg->wipe_info;
198 }
199 return 1;
200 }
201 }
202 # okay, so we're actually a spec in disguise
203 if ($pkgname =~ m/[\*\<\>\=]/) {
204 require OpenBSD::Search;
205 my $s = OpenBSD::Search::PkgSpec->new($pkgname);
206 if (!$s->is_valid) {
207 $state->errsay("Invalid spec: #1", $pkgname);
208 return 0;
209 }
210 my $r = $repo->match_locations($s);
211 if (@$r == 0) {
212 return 0;
213 } else {
214 for my $pkg (@$r) {
215 &$code($pkg->name, $pkg);
216 $pkg->close_now;
217 $pkg->wipe_info;
218 }
219 return 1;
220 }
221 } else {
222 my $pkg = $repo->find($pkgname);
223 if (defined $pkg) {
224 &$code($pkgname, $pkg);
225 $pkg->close_now;
226 $pkg->wipe_info;
227 return 1;
228 }
229 return 0;
230 }
231}
232
233sub find_pkg
234{
235 my ($self, $state, $pkgname, $code) = @_;
236
237 if ($self->find_pkg_in($state, $state->repo->installed, $pkgname,
238 $code)) {
239 return 1;
240 }
241 my $repo;
242
243 if ($pkgname =~ m/[\/\:]/o) {
244 ($repo, $pkgname) = $state->repo->path_parse($pkgname);
245 } else {
246 $repo = $state->repo;
247 }
248
249 return $self->find_pkg_in($state, $repo, $pkgname, $code);
250}
251
252sub get_line
253{
254 open my $fh, '<', shift or return "";
255 my $c = <$fh>;
256 chomp($c);
257 close $fh;
258 return $c;
259}
260
261sub get_comment
262{
263 my $d = shift;
264 return get_line($d.DESC);
265}
266
267sub find_by_spec
268{
269 my ($pat, $state) = @_;
270
271 require OpenBSD::Search;
272
273 my $s = OpenBSD::Search::PkgSpec->new($pat);
274 if (!$s->is_valid) {
275 $state->errsay("Invalid spec: #1", $pat);
276 return ();
277 } else {
278 my $r = $state->repo->installed->match_locations($s);
279
280 return sort {$a->name cmp $b->name} @$r;
281 }
282}
283
284sub filter_files
285{
286 my ($self, $state, $search, @args) = @_;
287 require OpenBSD::PackingList;
288
289 my @k = ();
290 for my $file (keys %$search) {
291 my $k = $file;
292 if ($file =~ m|^.*/(.*?)$|) {
293 $k = $1;
294 }
295 push(@k, quotemeta($k));
296 }
297 my $re = join('|', @k);
298
299 my @result = ();
300 for my $arg (@args) {
301 $self->find_pkg($state, $arg,
302 sub {
303 my ($pkgname, $handle) = @_;
304
305 if (-f $handle->info.CONTENTS) {
306 my $maybe = 0;
307 open(my $fh, '<', $handle->info.CONTENTS);
308 while (<$fh>) {
309 if (m/$re/) {
310 $maybe = 1;
311 last;
312 }
313 }
314 close($fh);
315 return if !$maybe;
316 }
317 my $plist = $handle->plist(\&OpenBSD::PackingList::FilesOnly);
318
319 $plist->hunt_file($search, $pkgname, \@result);
320 });
321 }
322 return @result;
323}
324
325sub manual_filter
326{
327 my ($self, $state, @args) = @_;
328 require OpenBSD::PackingList;
329
330 my @result = ();
331 for my $arg (@args) {
332 $self->find_pkg($state, $arg,
333 sub {
334 my ($pkgname, $handle) = @_;
335
336 my $plist = $handle->plist(\&OpenBSD::PackingList::ConflictOnly);
337
338 push(@result, $pkgname) if $plist->has('manual-installation');
339 });
340 }
341 return @result;
342}
343
3441500nsmy $path_info;
345
346sub add_to_path_info
347{
348 my ($path, $pkgname) = @_;
349
350 push(@{$path_info->{$path}}, $pkgname);
351}
352
353sub find_by_path
354{
355 my $pat = shift;
356
357 if (!defined $path_info) {
358 require OpenBSD::PackingList;
359
360 $path_info = {};
361 for my $pkg (installed_packages(1)) {
362 my $plist =
363 OpenBSD::PackingList->from_installation($pkg,
364 \&OpenBSD::PackingList::ExtraInfoOnly);
365 next if !defined $plist;
366 if (defined $plist->fullpkgpath) {
367 add_to_path_info($plist->fullpkgpath,
368 $plist->pkgname);
369 }
370 if ($plist->has('pkgpath')) {
371 for my $p (@{$plist->{pkgpath}}) {
372 add_to_path_info($p->name,
373 $plist->pkgname);
374 }
375 }
376 }
377 }
378 if (defined $path_info->{$pat}) {
379 return @{$path_info->{$pat}};
380 } else {
381 return ();
382 }
383}
384
385sub print_info
386{
387 my ($self, $state, $pkg, $handle) = @_;
388 unless (defined $handle) {
389 $state->errsay("Error printing info for #1: no info ?", $pkg);
390 return;
391 }
392 my $plist;
393 if ($state->opt('z')) {
394 $plist = $handle->plist(\&OpenBSD::PackingList::ExtraInfoOnly);
395 # firmware don't belong
396 if ($plist->has('firmware')) {
397 return;
398 }
399 my $name = OpenBSD::PackageName->new_from_string($plist->pkgname);
400 my $stem = $name->{stem};
401 my $compose = $stem."--".join('-', sort keys %{$name->{flavors}});
402 if ($plist->has('is-branch')) {
403 if ($plist->fullpkgpath =~ m/\/([^\/]+?)(,.*)?$/) {
404 $compose .= "%$1";
405 }
406 }
407 $state->say("#1", $compose);
408 } elsif ($state->opt('I')) {
409 if ($state->opt('q')) {
410 $state->say("#1", $pkg);
411 } else {
412 my $l = 20 - length($pkg);
413 $l = 1 if $l <= 0;
414 $state->say("#1#2#3", $pkg, " "x$l,
415 get_comment($handle->info));
416 }
417 } else {
418 if ($state->opt('c')) {
419 $state->header($handle);
420 $state->banner("Comment:");
421 $state->say("#1\n", get_comment($handle->info));
422 }
423 if ($state->opt('R') && -f $handle->info.REQUIRED_BY) {
424 $state->header($handle);
425 $state->banner("Required by:");
426 $state->printfile_sorted($handle->info.REQUIRED_BY);
427 }
428 if ($state->opt('d')) {
429 $state->header($handle);
430 $state->banner("Description:");
431 $state->print_description($handle->info);
432 }
433 if ($state->opt('M') && -f $handle->info.DISPLAY) {
434 $state->header($handle);
435 $state->banner("Install notice:");
436 $state->printfile($handle->info.DISPLAY);
437 }
438 if ($state->opt('U') && -f $handle->info.UNDISPLAY) {
439 $state->header($handle);
440 $state->banner("Deinstall notice:");
441 $state->printfile($handle->info.UNDISPLAY);
442 }
443 my $needplist = $state->hasanyopt('fsSC');
444 if ($needplist || $state->opt('L')) {
445 require OpenBSD::PackingList;
446
447 if ($needplist) {
448 $plist //= $handle->plist;
449 } else {
450 $plist //= $handle->plist(\&OpenBSD::PackingList::FilesOnly);
451 }
452 $state->fatal("bad packing-list for #1", $handle->url)
453 unless defined $plist;
454 }
455 if ($state->opt('L')) {
456 $state->header($handle);
457 $state->banner("Files:");
458 $plist->dump_file($state->opt('K'));
459 $state->say;
460 }
461 if ($state->opt('C')) {
462 $state->header($handle);
463 if ($plist->is_signed) {
464 my $sig = $plist->get('digital-signature');
465 if ($sig->{key} eq 'x509') {
466 require OpenBSD::x509;
467 $state->banner("Certificate info:");
468 OpenBSD::x509::print_certificate_info($plist);
469 } elsif ($sig->{key} eq 'signify' ||
470 $sig->{key} eq 'signify2') {
471 $state->say("reportedly signed by #1",
472 $plist->get('signer')->name);
473 }
474 } else {
475 $state->banner("No digital signature");
476 }
477 }
478 if ($state->opt('s')) {
479 $state->header($handle);
480 my $size = 0;
481 $plist->sum_up(\$size);
482 $state->say(
483 ($state->opt('q') ? "#1": "Size: #1"), $size);
484 $total_size += $size;
485 $pkgs++;
486 }
487 if ($state->opt('S')) {
488 $state->header($handle);
489 $state->say(
490 ($state->opt('q') ? "#1": "Signature: #1"),
491 $plist->signature->string);
492 }
493 if ($state->opt('P')) {
494 require OpenBSD::PackingList;
495
496 my $plist = $handle->plist(
497 \&OpenBSD::PackingList::ExtraInfoOnly);
498 $state->header($handle);
499 $state->banner("Pkgpath:");
500 if (defined $plist->fullpkgpath) {
501 $state->say("#1", $plist->fullpkgpath);
502 } else {
503 $state->errsay("#1 has no FULLPKGPATH", $plist->pkgname);
504 $state->say;
505 }
506 }
507
508 if ($state->opt('f')) {
509 $state->header($handle);
510 $state->banner("Packing-list:");
511 $plist->write(\*STDOUT);
512 $state->say;
513 }
514 $state->footer($handle);
515 }
516}
517
518sub parse_and_run
519
# spent 12.0s (2.04ms+12.0) within OpenBSD::PkgInfo::parse_and_run which was called: # once (2.04ms+12.0s) by main::run at line 30 of /usr/sbin/pkg_info
{
52011µs my ($self, $cmd) = @_;
5211600ns my $exit_code = 0;
5221600ns my @sought_files;
5231600ns my $error_e = 0;
52415µs156µs my $state = OpenBSD::PkgInfo::State->new($cmd);
# spent 56µs making 1 call to OpenBSD::State::new
5251600ns my @extra;
526 $state->{opt} =
527 {
528 'e' =>
529 sub {
530 my $pat = shift;
531 my @list;
532 if ($pat =~ m/\//o) {
533 $state->lock;
534 @list = find_by_path($pat);
535 push(@ARGV, @list);
536 } else {
537 @list = find_by_spec($pat, $state);
538 push(@extra, @list);
539 }
540 if (@list == 0) {
541 $exit_code = 1;
542 $error_e = 1;
543 }
544 $state->{terse} = 1;
545 },
546 'E' =>
547 sub {
548 require File::Spec;
549
550 push(@sought_files, File::Spec->rel2abs(shift));
551
552 }
55315µs };
5541800ns $state->{no_exports} = 1;
55514µs1319µs $state->handle_options('cCdfF:hIKLmPQ:qr:RsSUe:E:Ml:aAtz',
# spent 319µs making 1 call to OpenBSD::State::handle_options
556 '[-AaCcdfIKLMmPqRSstUvz] [-D nolock][-E filename] [-e pkg-name] ',
557 '[-l str] [-Q query] [-r pkgspec] [pkg-name ...]');
558
55912µs13µs if ($state->opt('r')) {
# spent 3µs making 1 call to OpenBSD::State::opt
560
561 require OpenBSD::PkgSpec;
562
563 my $pattern = $state->opt('r');
564 my $s = OpenBSD::PkgSpec->new($pattern);
565 if (!$s->is_valid) {
566 $state->errsay("Invalid pkgspec: #1", $pattern);
567 return 1;
568 }
569 my @l = $s->match_ref(\@ARGV);
570 unless ($state->opt('q')) {
571 $state->say("Pkgspec #1 matched #2", $pattern,
572 join(' ', @l));
573 }
574 if (@l == 0) {
575 $exit_code += 2;
576 }
577 if (@extra == 0) {
578 return $exit_code;
579 } else {
580 @ARGV = ();
581 }
582 }
583
58413µs1105µs $state->lock;
# spent 105µs making 1 call to OpenBSD::PkgInfo::State::lock
585
58612µs my $nonames = @ARGV == 0 && @extra == 0;
587
58815µs281µs unless ($state->hasanyopt('cMUdfILRsSP') || $state->{terse}) {
# spent 75µs making 1 call to OpenBSD::PkgInfo::State::hasanyopt # spent 7µs making 1 call to OpenBSD::PkgInfo::State::setopts
589 if ($nonames) {
590 $state->setopts('Ia');
591 } else {
592 $state->setopts('cdMR');
593 }
594 }
595
59612µs12µs if ($state->opt('Q')) {
# spent 2µs making 1 call to OpenBSD::State::opt
5971116µs require OpenBSD::Search;
598
59917µs14µs print "PKG_PATH=$ENV{PKG_PATH}\n" if $state->verbose;
# spent 4µs making 1 call to OpenBSD::State::verbose
60017µs232µs my $partial = OpenBSD::Search::PartialStem->new($state->opt('Q'));
# spent 28µs making 1 call to OpenBSD::Search::Stem::new # spent 4µs making 1 call to OpenBSD::State::opt
601112µs212.0s my $r = $state->repo->match_locations($partial);
# spent 12.0s making 1 call to OpenBSD::PackageRepositoryFactory::match_locations # spent 5µs making 1 call to OpenBSD::State::repo
602
603469µs459µs for my $p (sort map {$_->name} @$r) {
# spent 43µs making 1 call to OpenBSD::PkgInfo::CORE:sort # spent 16µs making 3 calls to OpenBSD::PackageLocation::name, avg 5µs/call
604359µs634.8ms $state->say(
# spent 34.5ms making 3 calls to OpenBSD::PackageInfo::is_installed, avg 11.5ms/call # spent 296µs making 3 calls to OpenBSD::State::say, avg 99µs/call
605 is_installed($p) ? "#1 (installed)" : "#1", $p);
606 }
607
608163µs return 0;
609 }
610
611 if ($state->verbose) {
612 $state->setopts('cdfMURsS');
613 }
614
615 if ($state->opt('K') && !$state->opt('L')) {
616 $state->usage("-K only makes sense with -L");
617 }
618
619 my $all = $state->opt('a') || $state->opt('A');
620
621 if ($nonames && !$all) {
622 $state->usage("Missing package name(s)") unless $state->{terse} || $state->opt('q');
623 }
624
625 if (!$nonames && $state->hasanyopt('aAtm')) {
626 $state->usage("Can't specify package name(s) with [-aAtm]");
627 }
628
629
630 if ($nonames && !$error_e) {
631 @ARGV = sort(installed_packages($state->opt('A') ? 0 : 1));
632 if ($state->opt('t')) {
633 require OpenBSD::RequiredBy;
634 @ARGV = grep { OpenBSD::RequiredBy->new($_)->list == 0 } @ARGV;
635 }
636 }
637
638 if (@sought_files) {
639 my %hash = map { ($_, []) } @sought_files;
640 @ARGV = $self->filter_files($state, \%hash, @ARGV);
641 for my $f (@sought_files) {
642 my $l = $hash{$f};
643 if (@$l) {
644 $state->say("#1: #2", $f, join(',', @$l))
645 unless $state->opt('q');
646 } else {
647 $exit_code = 1;
648 }
649 }
650 }
651
652 if ($state->opt('m')) {
653 @ARGV = $self->manual_filter($state, @ARGV);
654 }
655
656 for my $pkg (@ARGV) {
657 if ($state->{terse}) {
658 $state->banner('#1', $pkg);
659 }
660 if (!$self->find_pkg($state, $pkg,
661 sub {
662 $self->print_info($state, @_);
663 })) {
664 $exit_code = 1;
665 }
666 }
667 for my $extra (@extra) {
668 if ($state->{terse}) {
669 $state->banner('#1', $extra->url);
670 }
671 $self->print_info($state, $extra->url, $extra);
672 }
673
674 if ($pkgs > 1) {
675 $state->say("Total size: #1", $total_size);
676 }
677 return $exit_code;
678}
679
68015µs1;
 
# spent 43µs within OpenBSD::PkgInfo::CORE:sort which was called: # once (43µs+0s) by OpenBSD::PkgInfo::parse_and_run at line 603
sub OpenBSD::PkgInfo::CORE:sort; # opcode
# spent 14µs within main::CORE:match which was called 4 times, avg 3µs/call: # 4 times (14µs+0s) by main::RUNTIME at line 46 of /usr/sbin/pkg_info, avg 3µs/call
sub main::CORE:match; # opcode
# spent 47µs within main::CORE:regcomp which was called 4 times, avg 12µs/call: # 4 times (47µs+0s) by main::RUNTIME at line 46 of /usr/sbin/pkg_info, avg 12µs/call
sub main::CORE:regcomp; # opcode