| Filename | /usr/libdata/perl5/OpenBSD/PackageLocation.pm |
| Statements | Executed 32 statements in 1.86ms |
| Calls | P | F | Exclusive Time |
Inclusive Time |
Subroutine |
|---|---|---|---|---|---|
| 1 | 1 | 1 | 761µs | 1.56ms | OpenBSD::PackageLocation::BEGIN@24 |
| 3 | 1 | 1 | 32µs | 60µs | OpenBSD::PackageLocation::new |
| 1 | 1 | 1 | 20µs | 24µs | OpenBSD::PackageRepository::BEGIN@18 |
| 3 | 1 | 1 | 16µs | 16µs | OpenBSD::PackageLocation::name |
| 1 | 1 | 1 | 11µs | 76µs | OpenBSD::PackageLocation::BEGIN@25 |
| 1 | 1 | 1 | 10µs | 18µs | OpenBSD::PackageRepository::BEGIN@19 |
| 1 | 1 | 1 | 10µs | 150µs | OpenBSD::PackageLocation::BEGIN@23 |
| 0 | 0 | 0 | 0s | 0s | OpenBSD::PackageLocation::Installed::info |
| 0 | 0 | 0 | 0s | 0s | OpenBSD::PackageLocation::Installed::plist |
| 0 | 0 | 0 | 0s | 0s | OpenBSD::PackageLocation::__ANON__[:54] |
| 0 | 0 | 0 | 0s | 0s | OpenBSD::PackageLocation::__ANON__[:67] |
| 0 | 0 | 0 | 0s | 0s | OpenBSD::PackageLocation::__ANON__[:68] |
| 0 | 0 | 0 | 0s | 0s | OpenBSD::PackageLocation::_opened |
| 0 | 0 | 0 | 0s | 0s | OpenBSD::PackageLocation::_set_callback |
| 0 | 0 | 0 | 0s | 0s | OpenBSD::PackageLocation::close |
| 0 | 0 | 0 | 0s | 0s | OpenBSD::PackageLocation::close_after_error |
| 0 | 0 | 0 | 0s | 0s | OpenBSD::PackageLocation::close_now |
| 0 | 0 | 0 | 0s | 0s | OpenBSD::PackageLocation::close_with_client_error |
| 0 | 0 | 0 | 0s | 0s | OpenBSD::PackageLocation::contents |
| 0 | 0 | 0 | 0s | 0s | OpenBSD::PackageLocation::deref |
| 0 | 0 | 0 | 0s | 0s | OpenBSD::PackageLocation::find_contents |
| 0 | 0 | 0 | 0s | 0s | OpenBSD::PackageLocation::finish_and_close |
| 0 | 0 | 0 | 0s | 0s | OpenBSD::PackageLocation::forget |
| 0 | 0 | 0 | 0s | 0s | OpenBSD::PackageLocation::getNext |
| 0 | 0 | 0 | 0s | 0s | OpenBSD::PackageLocation::grabPlist |
| 0 | 0 | 0 | 0s | 0s | OpenBSD::PackageLocation::grab_info |
| 0 | 0 | 0 | 0s | 0s | OpenBSD::PackageLocation::info |
| 0 | 0 | 0 | 0s | 0s | OpenBSD::PackageLocation::next |
| 0 | 0 | 0 | 0s | 0s | OpenBSD::PackageLocation::plist |
| 0 | 0 | 0 | 0s | 0s | OpenBSD::PackageLocation::set_callback |
| 0 | 0 | 0 | 0s | 0s | OpenBSD::PackageLocation::skip |
| 0 | 0 | 0 | 0s | 0s | OpenBSD::PackageLocation::unput |
| 0 | 0 | 0 | 0s | 0s | OpenBSD::PackageLocation::url |
| 0 | 0 | 0 | 0s | 0s | OpenBSD::PackageLocation::wipe_info |
| Line | State ments |
Time on line |
Calls | Time in subs |
Code |
|---|---|---|---|---|---|
| 1 | # ex:ts=8 sw=4: | ||||
| 2 | # $OpenBSD: PackageLocation.pm,v 1.51 2017/03/07 14:15:09 espie Exp $ | ||||
| 3 | # | ||||
| 4 | # Copyright (c) 2003-2007 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 | |||||
| 18 | 2 | 28µs | 2 | 28µs | # spent 24µs (20+4) within OpenBSD::PackageRepository::BEGIN@18 which was called:
# once (20µs+4µs) by OpenBSD::PackageRepository::BEGIN@30 at line 18 # spent 24µs making 1 call to OpenBSD::PackageRepository::BEGIN@18
# spent 4µs making 1 call to strict::import |
| 19 | 2 | 30µs | 2 | 26µs | # spent 18µs (10+8) within OpenBSD::PackageRepository::BEGIN@19 which was called:
# once (10µs+8µs) by OpenBSD::PackageRepository::BEGIN@30 at line 19 # spent 18µs making 1 call to OpenBSD::PackageRepository::BEGIN@19
# spent 8µs making 1 call to warnings::import |
| 20 | |||||
| 21 | package OpenBSD::PackageLocation; | ||||
| 22 | |||||
| 23 | 2 | 28µs | 2 | 290µs | # spent 150µs (10+140) within OpenBSD::PackageLocation::BEGIN@23 which was called:
# once (10µs+140µs) by OpenBSD::PackageRepository::BEGIN@30 at line 23 # spent 150µs making 1 call to OpenBSD::PackageLocation::BEGIN@23
# spent 140µs making 1 call to Exporter::import |
| 24 | 2 | 142µs | 1 | 1.56ms | # spent 1.56ms (761µs+804µs) within OpenBSD::PackageLocation::BEGIN@24 which was called:
# once (761µs+804µs) by OpenBSD::PackageRepository::BEGIN@30 at line 24 # spent 1.56ms making 1 call to OpenBSD::PackageLocation::BEGIN@24 |
| 25 | 2 | 1.55ms | 2 | 142µs | # spent 76µs (11+65) within OpenBSD::PackageLocation::BEGIN@25 which was called:
# once (11µs+65µs) by OpenBSD::PackageRepository::BEGIN@30 at line 25 # spent 76µs making 1 call to OpenBSD::PackageLocation::BEGIN@25
# spent 65µs making 1 call to Exporter::import |
| 26 | |||||
| 27 | sub new | ||||
| 28 | # spent 60µs (32+28) within OpenBSD::PackageLocation::new which was called 3 times, avg 20µs/call:
# 3 times (32µs+28µs) by OpenBSD::PackageRepositoryBase::new_location at line 163 of OpenBSD/PackageRepository/Installed.pm, avg 20µs/call | ||||
| 29 | 3 | 3µs | my ($class, $repository, $name) = @_; | ||
| 30 | |||||
| 31 | 3 | 14µs | 3 | 28µs | my $self = { repository => $repository, name => $repository->canonicalize($name) }; # spent 28µs making 3 calls to OpenBSD::PackageRepositoryBase::canonicalize, avg 9µs/call |
| 32 | 3 | 3µs | bless $self, $class; | ||
| 33 | 3 | 15µs | return $self; | ||
| 34 | |||||
| 35 | } | ||||
| 36 | |||||
| 37 | sub url | ||||
| 38 | { | ||||
| 39 | my $self = shift; | ||||
| 40 | |||||
| 41 | return $self->{repository}->url($self->name); | ||||
| 42 | } | ||||
| 43 | |||||
| 44 | sub name | ||||
| 45 | # spent 16µs within OpenBSD::PackageLocation::name which was called 3 times, avg 5µs/call:
# 3 times (16µs+0s) by OpenBSD::PkgInfo::parse_and_run at line 603 of OpenBSD/PkgInfo.pm, avg 5µs/call | ||||
| 46 | 3 | 2µs | my $self = shift; | ||
| 47 | 3 | 15µs | return $self->{name}; | ||
| 48 | } | ||||
| 49 | |||||
| 50 | OpenBSD::Auto::cache(pkgname, | ||||
| 51 | sub { | ||||
| 52 | my $self = shift; | ||||
| 53 | return OpenBSD::PackageName->from_string($self->name); | ||||
| 54 | 1 | 6µs | 1 | 13µs | }); # spent 13µs making 1 call to OpenBSD::Auto::cache |
| 55 | |||||
| 56 | OpenBSD::Auto::cache(update_info, | ||||
| 57 | sub { | ||||
| 58 | my $self = shift; | ||||
| 59 | if ($self->name =~ /^quirks\-/) { | ||||
| 60 | return $self->plist; | ||||
| 61 | } | ||||
| 62 | return $self->plist(\&OpenBSD::PackingList::UpdateInfoOnly, | ||||
| 63 | sub { | ||||
| 64 | return 0 if $_[0] =~ m/^\@option\s+always-update\b/m; | ||||
| 65 | return 1 if $_[0] =~ m/^\@(?:newgroup|newuser|cwd)\b/m; | ||||
| 66 | return 0; | ||||
| 67 | }); | ||||
| 68 | 1 | 4µs | 1 | 8µs | }); # spent 8µs making 1 call to OpenBSD::Auto::cache |
| 69 | |||||
| 70 | |||||
| 71 | # make sure self is opened and move to the right location if need be. | ||||
| 72 | sub _opened | ||||
| 73 | { | ||||
| 74 | my $self = shift; | ||||
| 75 | |||||
| 76 | if (defined $self->{fh}) { | ||||
| 77 | return $self; | ||||
| 78 | } | ||||
| 79 | my $fh = $self->{repository}->open($self); | ||||
| 80 | if (!defined $fh) { | ||||
| 81 | $self->{repository}->parse_problems($self->{errors}, undef, | ||||
| 82 | $self) if defined $self->{errors}; | ||||
| 83 | undef $self->{errors}; | ||||
| 84 | return; | ||||
| 85 | } | ||||
| 86 | require OpenBSD::Ustar; | ||||
| 87 | my $archive = OpenBSD::Ustar->new($fh, $self->{repository}{state}); | ||||
| 88 | $archive->set_description($self->{repository}->url($self->{name})); | ||||
| 89 | $self->{_archive} = $archive; | ||||
| 90 | $self->_set_callback; | ||||
| 91 | |||||
| 92 | if (defined $self->{_current_name}) { | ||||
| 93 | while (my $e = $self->{_archive}->next) { | ||||
| 94 | if ($e->{name} eq $self->{_current_name}) { | ||||
| 95 | $self->{_current} = $e; | ||||
| 96 | return $self; | ||||
| 97 | } | ||||
| 98 | } | ||||
| 99 | } | ||||
| 100 | return $self; | ||||
| 101 | } | ||||
| 102 | |||||
| 103 | sub _set_callback | ||||
| 104 | { | ||||
| 105 | my $self = shift; | ||||
| 106 | if (defined $self->{callback} && defined $self->{_archive}) { | ||||
| 107 | $self->{_archive}->set_callback($self->{callback}); | ||||
| 108 | } | ||||
| 109 | } | ||||
| 110 | |||||
| 111 | sub find_contents | ||||
| 112 | { | ||||
| 113 | my ($self, $extra) = @_; | ||||
| 114 | |||||
| 115 | while (my $e = $self->next) { | ||||
| 116 | if ($e->isFile && is_info_name($e->{name})) { | ||||
| 117 | if ($e->{name} eq CONTENTS ) { | ||||
| 118 | my $v = | ||||
| 119 | $self->{extra_content}.$e->contents($extra); | ||||
| 120 | return $v; | ||||
| 121 | } | ||||
| 122 | } else { | ||||
| 123 | $self->unput; | ||||
| 124 | last; | ||||
| 125 | } | ||||
| 126 | } | ||||
| 127 | } | ||||
| 128 | |||||
| 129 | sub contents | ||||
| 130 | { | ||||
| 131 | my ($self, $extra) = @_; | ||||
| 132 | if (!defined $self->{contents}) { | ||||
| 133 | if (!$self->_opened) { | ||||
| 134 | return; | ||||
| 135 | } | ||||
| 136 | if (defined $extra) { | ||||
| 137 | my $contents = $self->find_contents($extra); | ||||
| 138 | if ($contents) { | ||||
| 139 | $self->unput; | ||||
| 140 | } | ||||
| 141 | return $contents; | ||||
| 142 | } | ||||
| 143 | $self->{contents} = $self->find_contents; | ||||
| 144 | } | ||||
| 145 | |||||
| 146 | return $self->{contents}; | ||||
| 147 | } | ||||
| 148 | |||||
| 149 | sub grab_info | ||||
| 150 | { | ||||
| 151 | my $self = shift; | ||||
| 152 | my $dir = $self->{dir} = OpenBSD::Temp->dir; | ||||
| 153 | |||||
| 154 | my $c = $self->contents; | ||||
| 155 | if (!defined $c) { | ||||
| 156 | return 0; | ||||
| 157 | } | ||||
| 158 | |||||
| 159 | if (! -f $dir.CONTENTS) { | ||||
| 160 | open my $fh, '>', $dir.CONTENTS or die "Permission denied"; | ||||
| 161 | print $fh $self->contents; | ||||
| 162 | close $fh; | ||||
| 163 | } | ||||
| 164 | |||||
| 165 | while (my $e = $self->next) { | ||||
| 166 | if ($e->isFile && is_info_name($e->{name})) { | ||||
| 167 | $e->{name} = $dir.$e->{name}; | ||||
| 168 | undef $e->{mtime}; | ||||
| 169 | undef $e->{atime}; | ||||
| 170 | eval { $e->create; }; | ||||
| 171 | if ($@) { | ||||
| 172 | unlink($e->{name}); | ||||
| 173 | $@ =~ s/\s+at.*//o; | ||||
| 174 | $self->{repository}{state}->errprint('#1', $@); | ||||
| 175 | return 0; | ||||
| 176 | } | ||||
| 177 | } else { | ||||
| 178 | $self->unput; | ||||
| 179 | last; | ||||
| 180 | } | ||||
| 181 | } | ||||
| 182 | return 1; | ||||
| 183 | } | ||||
| 184 | |||||
| 185 | sub grabPlist | ||||
| 186 | { | ||||
| 187 | my ($self, $code) = @_; | ||||
| 188 | |||||
| 189 | my $plist = $self->plist($code); | ||||
| 190 | if (defined $plist) { | ||||
| 191 | $self->wipe_info; | ||||
| 192 | $self->close_now; | ||||
| 193 | return $plist; | ||||
| 194 | } else { | ||||
| 195 | return; | ||||
| 196 | } | ||||
| 197 | } | ||||
| 198 | |||||
| 199 | sub forget | ||||
| 200 | { | ||||
| 201 | my $self = shift; | ||||
| 202 | $self->wipe_info; | ||||
| 203 | $self->close_now; | ||||
| 204 | } | ||||
| 205 | |||||
| 206 | sub wipe_info | ||||
| 207 | { | ||||
| 208 | my $self = shift; | ||||
| 209 | $self->{repository}->wipe_info($self); | ||||
| 210 | $self->{repository}->close_now($self); | ||||
| 211 | delete $self->{contents}; | ||||
| 212 | $self->deref; | ||||
| 213 | delete $self->{_current_name}; | ||||
| 214 | delete $self->{update_info}; | ||||
| 215 | delete $self->{_unput}; | ||||
| 216 | } | ||||
| 217 | |||||
| 218 | sub info | ||||
| 219 | { | ||||
| 220 | my $self = shift; | ||||
| 221 | |||||
| 222 | if (!defined $self->{dir}) { | ||||
| 223 | $self->grab_info; | ||||
| 224 | } | ||||
| 225 | return $self->{dir}; | ||||
| 226 | } | ||||
| 227 | |||||
| 228 | sub plist | ||||
| 229 | { | ||||
| 230 | my ($self, $code, $extra) = @_; | ||||
| 231 | require OpenBSD::PackingList; | ||||
| 232 | |||||
| 233 | if (defined $self->{dir} && -f $self->{dir}.CONTENTS) { | ||||
| 234 | my $plist = | ||||
| 235 | OpenBSD::PackingList->fromfile($self->{dir}.CONTENTS, | ||||
| 236 | $code); | ||||
| 237 | $plist->set_infodir($self->{dir}); | ||||
| 238 | return $plist; | ||||
| 239 | } | ||||
| 240 | if (my $value = $self->contents($extra)) { | ||||
| 241 | return OpenBSD::PackingList->fromfile(\$value, $code); | ||||
| 242 | } | ||||
| 243 | # hopeless | ||||
| 244 | $self->close_with_client_error; | ||||
| 245 | |||||
| 246 | return; | ||||
| 247 | } | ||||
| 248 | |||||
| 249 | sub close | ||||
| 250 | { | ||||
| 251 | my ($self, $hint) = @_; | ||||
| 252 | $self->{repository}->close($self, $hint); | ||||
| 253 | } | ||||
| 254 | |||||
| 255 | sub finish_and_close | ||||
| 256 | { | ||||
| 257 | my $self = shift; | ||||
| 258 | $self->{repository}->finish_and_close($self); | ||||
| 259 | } | ||||
| 260 | |||||
| 261 | sub close_now | ||||
| 262 | { | ||||
| 263 | my $self = shift; | ||||
| 264 | $self->{repository}->close_now($self); | ||||
| 265 | } | ||||
| 266 | |||||
| 267 | sub close_after_error | ||||
| 268 | { | ||||
| 269 | my $self = shift; | ||||
| 270 | $self->{repository}->close_after_error($self); | ||||
| 271 | } | ||||
| 272 | |||||
| 273 | sub close_with_client_error | ||||
| 274 | { | ||||
| 275 | my $self = shift; | ||||
| 276 | $self->{repository}->close_with_client_error($self); | ||||
| 277 | } | ||||
| 278 | |||||
| 279 | sub deref | ||||
| 280 | { | ||||
| 281 | my $self = shift; | ||||
| 282 | delete $self->{fh}; | ||||
| 283 | delete $self->{pid2}; | ||||
| 284 | delete $self->{_archive}; | ||||
| 285 | delete $self->{_current}; | ||||
| 286 | } | ||||
| 287 | |||||
| 288 | # proxy for archive operations | ||||
| 289 | sub next | ||||
| 290 | { | ||||
| 291 | my $self = shift; | ||||
| 292 | |||||
| 293 | if (!$self->_opened) { | ||||
| 294 | return; | ||||
| 295 | } | ||||
| 296 | if (!$self->{_unput}) { | ||||
| 297 | $self->{_current} = $self->getNext; | ||||
| 298 | if (defined $self->{_current}) { | ||||
| 299 | $self->{_current_name} = $self->{_current}{name}; | ||||
| 300 | } else { | ||||
| 301 | delete $self->{_current_name}; | ||||
| 302 | } | ||||
| 303 | } else { | ||||
| 304 | $self->{_unput} = 0; | ||||
| 305 | } | ||||
| 306 | return $self->{_current}; | ||||
| 307 | } | ||||
| 308 | |||||
| 309 | sub unput | ||||
| 310 | { | ||||
| 311 | my $self = shift; | ||||
| 312 | $self->{_unput} = 1; | ||||
| 313 | } | ||||
| 314 | |||||
| 315 | sub getNext | ||||
| 316 | { | ||||
| 317 | my $self = shift; | ||||
| 318 | |||||
| 319 | return $self->{_archive}->next; | ||||
| 320 | } | ||||
| 321 | |||||
| 322 | sub skip | ||||
| 323 | { | ||||
| 324 | my $self = shift; | ||||
| 325 | return $self->{_archive}->skip; | ||||
| 326 | } | ||||
| 327 | |||||
| 328 | sub set_callback | ||||
| 329 | { | ||||
| 330 | my ($self, $code) = @_; | ||||
| 331 | $self->{callback} = $code; | ||||
| 332 | $self->_set_callback; | ||||
| 333 | } | ||||
| 334 | |||||
| 335 | package OpenBSD::PackageLocation::Installed; | ||||
| 336 | 1 | 7µs | our @ISA = qw(OpenBSD::PackageLocation); | ||
| 337 | |||||
| 338 | |||||
| 339 | sub info | ||||
| 340 | { | ||||
| 341 | my $self = shift; | ||||
| 342 | require OpenBSD::PackageInfo; | ||||
| 343 | $self->{dir} = OpenBSD::PackageInfo::installed_info($self->name); | ||||
| 344 | } | ||||
| 345 | |||||
| 346 | sub plist | ||||
| 347 | { | ||||
| 348 | my ($self, $code) = @_; | ||||
| 349 | require OpenBSD::PackingList; | ||||
| 350 | return OpenBSD::PackingList->from_installation($self->name, $code); | ||||
| 351 | } | ||||
| 352 | |||||
| 353 | 1 | 6µs | 1; |