| Filename | /usr/libdata/perl5/OpenBSD/PkgInfo.pm |
| Statements | Executed 70 statements in 4.09ms |
| Calls | P | F | Exclusive Time |
Inclusive Time |
Subroutine |
|---|---|---|---|---|---|
| 1 | 1 | 1 | 2.83ms | 10.0ms | main::BEGIN@22 |
| 1 | 1 | 1 | 2.04ms | 12.0s | OpenBSD::PkgInfo::parse_and_run |
| 1 | 1 | 1 | 1.32ms | 10.3ms | OpenBSD::PkgInfo::State::BEGIN@65 |
| 1 | 1 | 1 | 567µs | 701µs | OpenBSD::PkgInfo::BEGIN@179 |
| 1 | 1 | 1 | 50µs | 75µs | OpenBSD::PkgInfo::State::hasanyopt |
| 4 | 1 | 1 | 47µs | 47µs | main::CORE:regcomp (opcode) |
| 1 | 1 | 1 | 43µs | 43µs | OpenBSD::PkgInfo::CORE:sort (opcode) |
| 1 | 1 | 1 | 17µs | 21µs | main::BEGIN@19.1 |
| 1 | 1 | 1 | 16µs | 105µs | OpenBSD::PkgInfo::State::lock |
| 4 | 1 | 1 | 14µs | 14µs | main::CORE:match (opcode) |
| 1 | 1 | 1 | 12µs | 141µs | OpenBSD::PkgInfo::BEGIN@177 |
| 1 | 1 | 1 | 11µs | 74µs | OpenBSD::PkgInfo::BEGIN@180 |
| 1 | 1 | 1 | 9µs | 16µs | main::BEGIN@20.2 |
| 1 | 1 | 1 | 7µs | 7µs | OpenBSD::PkgInfo::BEGIN@178 |
| 1 | 1 | 1 | 7µs | 7µs | OpenBSD::PkgInfo::State::setopts |
| 0 | 0 | 0 | 0s | 0s | OpenBSD::PackingElement::FileBase::dump_file |
| 0 | 0 | 0 | 0s | 0s | OpenBSD::PackingElement::FileObject::hunt_file |
| 0 | 0 | 0 | 0s | 0s | OpenBSD::PackingElement::dump_file |
| 0 | 0 | 0 | 0s | 0s | OpenBSD::PackingElement::hunt_file |
| 0 | 0 | 0 | 0s | 0s | OpenBSD::PackingElement::sum_up |
| 0 | 0 | 0 | 0s | 0s | OpenBSD::PkgInfo::State::banner |
| 0 | 0 | 0 | 0s | 0s | OpenBSD::PkgInfo::State::footer |
| 0 | 0 | 0 | 0s | 0s | OpenBSD::PkgInfo::State::header |
| 0 | 0 | 0 | 0s | 0s | OpenBSD::PkgInfo::State::log |
| 0 | 0 | 0 | 0s | 0s | OpenBSD::PkgInfo::State::print_description |
| 0 | 0 | 0 | 0s | 0s | OpenBSD::PkgInfo::State::printfile |
| 0 | 0 | 0 | 0s | 0s | OpenBSD::PkgInfo::State::printfile_sorted |
| 0 | 0 | 0 | 0s | 0s | OpenBSD::PkgInfo::__ANON__[:320] |
| 0 | 0 | 0 | 0s | 0s | OpenBSD::PkgInfo::__ANON__[:339] |
| 0 | 0 | 0 | 0s | 0s | OpenBSD::PkgInfo::__ANON__[:545] |
| 0 | 0 | 0 | 0s | 0s | OpenBSD::PkgInfo::__ANON__[:552] |
| 0 | 0 | 0 | 0s | 0s | OpenBSD::PkgInfo::__ANON__[:663] |
| 0 | 0 | 0 | 0s | 0s | OpenBSD::PkgInfo::add_to_path_info |
| 0 | 0 | 0 | 0s | 0s | OpenBSD::PkgInfo::filter_files |
| 0 | 0 | 0 | 0s | 0s | OpenBSD::PkgInfo::find_by_path |
| 0 | 0 | 0 | 0s | 0s | OpenBSD::PkgInfo::find_by_spec |
| 0 | 0 | 0 | 0s | 0s | OpenBSD::PkgInfo::find_pkg |
| 0 | 0 | 0 | 0s | 0s | OpenBSD::PkgInfo::find_pkg_in |
| 0 | 0 | 0 | 0s | 0s | OpenBSD::PkgInfo::get_comment |
| 0 | 0 | 0 | 0s | 0s | OpenBSD::PkgInfo::get_line |
| 0 | 0 | 0 | 0s | 0s | OpenBSD::PkgInfo::manual_filter |
| 0 | 0 | 0 | 0s | 0s | OpenBSD::PkgInfo::print_info |
| 0 | 0 | 0 | 0s | 0s | main::RUNTIME |
| 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 | |||||
| 19 | 2 | 29µs | 2 | 25µ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 # spent 21µs making 1 call to main::BEGIN@19.1
# spent 4µs making 1 call to strict::import |
| 20 | 2 | 24µs | 2 | 24µ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 # spent 16µs making 1 call to main::BEGIN@20.2
# spent 7µs making 1 call to warnings::import |
| 21 | |||||
| 22 | 2 | 281µs | 2 | 10.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 # spent 10.0ms making 1 call to main::BEGIN@22
# spent 24µs making 1 call to Exporter::import |
| 23 | |||||
| 24 | package OpenBSD::PackingElement; | ||||
| 25 | sub dump_file | ||||
| 26 | { | ||||
| 27 | } | ||||
| 28 | |||||
| 29 | sub hunt_file | ||||
| 30 | { | ||||
| 31 | } | ||||
| 32 | |||||
| 33 | sub sum_up | ||||
| 34 | { | ||||
| 35 | my ($self, $rsize) = @_; | ||||
| 36 | if (defined $self->{size}) { | ||||
| 37 | $$rsize += $self->{size}; | ||||
| 38 | } | ||||
| 39 | } | ||||
| 40 | |||||
| 41 | package OpenBSD::PackingElement::FileBase; | ||||
| 42 | sub dump_file | ||||
| 43 | { | ||||
| 44 | my ($item, $opt_K) = @_; | ||||
| 45 | if ($opt_K) { | ||||
| 46 | print '@', $item->keyword, " "; | ||||
| 47 | } | ||||
| 48 | print $item->fullname, "\n"; | ||||
| 49 | } | ||||
| 50 | |||||
| 51 | package OpenBSD::PackingElement::FileObject; | ||||
| 52 | sub 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 | |||||
| 62 | package OpenBSD::PkgInfo::State; | ||||
| 63 | 1 | 9µs | our @ISA = qw(OpenBSD::State); | ||
| 64 | |||||
| 65 | 2 | 704µs | 2 | 10.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 # spent 10.3ms making 1 call to OpenBSD::PkgInfo::State::BEGIN@65
# spent 127µs making 1 call to Exporter::import |
| 66 | |||||
| 67 | sub 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 | ||||
| 69 | 1 | 800ns | my $state = shift; | ||
| 70 | 1 | 800ns | return if $state->{locked}; | ||
| 71 | 1 | 2µs | 1 | 2µs | return if $state->{subst}->value('nolock'); # spent 2µs making 1 call to OpenBSD::Subst::value |
| 72 | 1 | 4µs | 2 | 87µ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 |
| 73 | 1 | 4µs | $state->{locked} = 1; | ||
| 74 | } | ||||
| 75 | |||||
| 76 | sub 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 | |||||
| 84 | sub 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 | |||||
| 94 | sub 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 | |||||
| 106 | sub 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 | |||||
| 119 | sub 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 | |||||
| 133 | sub 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 | |||||
| 147 | sub 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 | ||||
| 149 | 1 | 900ns | my ($self, $string) = @_; | ||
| 150 | 1 | 6µs | for my $i (split //, $string) { | ||
| 151 | 11 | 32µs | 11 | 25µs | if ($self->opt($i)) { # spent 25µs making 11 calls to OpenBSD::State::opt, avg 2µs/call |
| 152 | return 1; | ||||
| 153 | } | ||||
| 154 | } | ||||
| 155 | 1 | 4µs | return 0; | ||
| 156 | } | ||||
| 157 | |||||
| 158 | sub 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 | ||||
| 160 | 1 | 800ns | my ($self, $string) = @_; | ||
| 161 | 1 | 5µs | for my $i (split //, $string) { | ||
| 162 | 2 | 3µs | $self->{opt}{$i} = 1; | ||
| 163 | } | ||||
| 164 | } | ||||
| 165 | |||||
| 166 | sub log | ||||
| 167 | { | ||||
| 168 | my $self = shift; | ||||
| 169 | if (@_ == 0) { | ||||
| 170 | return $self; | ||||
| 171 | } else { | ||||
| 172 | $self->say(@_); | ||||
| 173 | } | ||||
| 174 | } | ||||
| 175 | |||||
| 176 | package OpenBSD::PkgInfo; | ||||
| 177 | 2 | 31µs | 2 | 270µ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 # spent 141µs making 1 call to OpenBSD::PkgInfo::BEGIN@177
# spent 129µs making 1 call to Exporter::import |
| 178 | 2 | 30µs | 1 | 7µs | # spent 7µs within OpenBSD::PkgInfo::BEGIN@178 which was called:
# once (7µs+0s) by main::run at line 178 # spent 7µs making 1 call to OpenBSD::PkgInfo::BEGIN@178 |
| 179 | 2 | 172µs | 2 | 736µ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 # spent 701µs making 1 call to OpenBSD::PkgInfo::BEGIN@179
# spent 35µs making 1 call to Exporter::import |
| 180 | 2 | 2.37ms | 2 | 136µ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 # spent 74µs making 1 call to OpenBSD::PkgInfo::BEGIN@180
# spent 63µs making 1 call to Exporter::import |
| 181 | |||||
| 182 | |||||
| 183 | 1 | 700ns | my $total_size = 0; | ||
| 184 | 1 | 700ns | my $pkgs = 0; | ||
| 185 | |||||
| 186 | sub 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 | |||||
| 233 | sub 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 | |||||
| 252 | sub 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 | |||||
| 261 | sub get_comment | ||||
| 262 | { | ||||
| 263 | my $d = shift; | ||||
| 264 | return get_line($d.DESC); | ||||
| 265 | } | ||||
| 266 | |||||
| 267 | sub 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 | |||||
| 284 | sub 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 | |||||
| 325 | sub 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 | |||||
| 344 | 1 | 500ns | my $path_info; | ||
| 345 | |||||
| 346 | sub add_to_path_info | ||||
| 347 | { | ||||
| 348 | my ($path, $pkgname) = @_; | ||||
| 349 | |||||
| 350 | push(@{$path_info->{$path}}, $pkgname); | ||||
| 351 | } | ||||
| 352 | |||||
| 353 | sub 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 | |||||
| 385 | sub 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 | |||||
| 518 | sub 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 | ||||
| 520 | 1 | 1µs | my ($self, $cmd) = @_; | ||
| 521 | 1 | 600ns | my $exit_code = 0; | ||
| 522 | 1 | 600ns | my @sought_files; | ||
| 523 | 1 | 600ns | my $error_e = 0; | ||
| 524 | 1 | 5µs | 1 | 56µs | my $state = OpenBSD::PkgInfo::State->new($cmd); # spent 56µs making 1 call to OpenBSD::State::new |
| 525 | 1 | 600ns | 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 | } | ||||
| 553 | 1 | 5µs | }; | ||
| 554 | 1 | 800ns | $state->{no_exports} = 1; | ||
| 555 | 1 | 4µs | 1 | 319µ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 | |||||
| 559 | 1 | 2µs | 1 | 3µ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 | |||||
| 584 | 1 | 3µs | 1 | 105µs | $state->lock; # spent 105µs making 1 call to OpenBSD::PkgInfo::State::lock |
| 585 | |||||
| 586 | 1 | 2µs | my $nonames = @ARGV == 0 && @extra == 0; | ||
| 587 | |||||
| 588 | 1 | 5µs | 2 | 81µ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 | |||||
| 596 | 1 | 2µs | 1 | 2µs | if ($state->opt('Q')) { # spent 2µs making 1 call to OpenBSD::State::opt |
| 597 | 1 | 116µs | require OpenBSD::Search; | ||
| 598 | |||||
| 599 | 1 | 7µs | 1 | 4µs | print "PKG_PATH=$ENV{PKG_PATH}\n" if $state->verbose; # spent 4µs making 1 call to OpenBSD::State::verbose |
| 600 | 1 | 7µs | 2 | 32µ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 |
| 601 | 1 | 12µs | 2 | 12.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 | |||||
| 603 | 4 | 69µs | 4 | 59µ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 |
| 604 | 3 | 59µs | 6 | 34.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 | |||||
| 608 | 1 | 63µ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 | |||||
| 680 | 1 | 5µs | 1; | ||
# spent 43µs within OpenBSD::PkgInfo::CORE:sort which was called:
# once (43µs+0s) by OpenBSD::PkgInfo::parse_and_run at line 603 | |||||
# 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 | |||||
# 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 |