167d43fbcSespie# ex:ts=8 sw=4: 2*efe01a68Sespie# $OpenBSD: PackingList.pm,v 1.148 2022/05/29 10:48:41 espie Exp $ 36f05d20cSespie# 445019a4aSespie# Copyright (c) 2003-2014 Marc Espie <espie@openbsd.org> 56f05d20cSespie# 667d43fbcSespie# Permission to use, copy, modify, and distribute this software for any 767d43fbcSespie# purpose with or without fee is hereby granted, provided that the above 867d43fbcSespie# copyright notice and this permission notice appear in all copies. 96f05d20cSespie# 1067d43fbcSespie# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 1167d43fbcSespie# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 1267d43fbcSespie# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 1367d43fbcSespie# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 1467d43fbcSespie# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 1567d43fbcSespie# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 1667d43fbcSespie# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 176f05d20cSespie 186f05d20cSespieuse strict; 196f05d20cSespieuse warnings; 20d76faf42Sespie 21d76faf42Sespiepackage OpenBSD::PackingList::State; 22d76faf42Sespiemy $dot = '.'; 23d76faf42Sespie 24d76faf42Sespiesub new 25d76faf42Sespie{ 26d76faf42Sespie my $class = shift; 27d76faf42Sespie bless { default_owner=>'root', 28d76faf42Sespie default_group=>'bin', 29d76faf42Sespie default_mode=> 0444, 30652240a2Sespie owners => {}, 31652240a2Sespie groups => {}, 32d76faf42Sespie cwd=>\$dot}, $class; 33d76faf42Sespie} 34d76faf42Sespie 35d76faf42Sespiesub cwd 36d76faf42Sespie{ 37d76faf42Sespie return ${$_[0]->{cwd}}; 38d76faf42Sespie} 39d76faf42Sespie 40d76faf42Sespiesub set_cwd 41d76faf42Sespie{ 42d76faf42Sespie my ($self, $p) = @_; 43d76faf42Sespie 44d76faf42Sespie require File::Spec; 45d76faf42Sespie 46d76faf42Sespie $p = File::Spec->canonpath($p); 47d76faf42Sespie $self->{cwd} = \$p; 48d76faf42Sespie} 49d76faf42Sespie 50e451b54dSespiepackage OpenBSD::PackingList::hashpath; 51e451b54dSespiesub match 52e451b54dSespie{ 5331e751cfSespie my ($h, $plist) = @_; 5408fe6b3eSespie my $f = $plist->fullpkgpath2; 552d3b5332Sespie if (!defined $f) { 562d3b5332Sespie return 0; 572d3b5332Sespie } 58a38c9a10Sespie for my $i (@{$h->{$f->{dir}}}) { 592d3b5332Sespie if ($i->match($f)) { 602d3b5332Sespie return 1; 612d3b5332Sespie } 622d3b5332Sespie } 632d3b5332Sespie return 0; 64e451b54dSespie} 65e451b54dSespie 665c50b308Sespiesub partial_match 675c50b308Sespie{ 685c50b308Sespie my ($h, $subdir) = @_; 695c50b308Sespie for my $dir (keys %$h) { 705c50b308Sespie return 1 if $dir =~ m/\b\Q$subdir\E\b/; 715c50b308Sespie } 725c50b308Sespie return 0; 735c50b308Sespie} 745c50b308Sespie 755790075aSespiepackage OpenBSD::Composite; 765790075aSespie 77d1b1b3a5Sespie# convert call to $self->sub(@args) into $self->visit(sub, @args) 785790075aSespiesub AUTOLOAD 795790075aSespie{ 805790075aSespie our $AUTOLOAD; 815790075aSespie my $fullsub = $AUTOLOAD; 825790075aSespie (my $sub = $fullsub) =~ s/.*:://o; 835790075aSespie return if $sub eq 'DESTROY'; # special case 845790075aSespie my $self = $_[0]; 855790075aSespie # verify it makes sense 865790075aSespie if ($self->element_class->can($sub)) { 875790075aSespie no strict "refs"; 885790075aSespie # create the sub to avoid regenerating further calls 895790075aSespie *$fullsub = sub { 905790075aSespie my $self = shift; 915790075aSespie $self->visit($sub, @_); 925790075aSespie }; 935790075aSespie # and jump to it 945790075aSespie goto &$fullsub; 955790075aSespie } else { 965790075aSespie die "Can't call $sub on ".ref($self); 975790075aSespie } 985790075aSespie} 995790075aSespie 1006f05d20cSespiepackage OpenBSD::PackingList; 1015790075aSespieour @ISA = qw(OpenBSD::Composite); 1026f05d20cSespie 1036f05d20cSespieuse OpenBSD::PackingElement; 1046f05d20cSespieuse OpenBSD::PackageInfo; 1056f05d20cSespie 1065790075aSespiesub element_class { "OpenBSD::PackingElement" } 1075790075aSespie 1086f05d20cSespiesub new 1096f05d20cSespie{ 1106f05d20cSespie my $class = shift; 111e39fac1bSespie my $plist = bless {state => OpenBSD::PackingList::State->new, 112e39fac1bSespie infodir => \(my $d)}, $class; 113435cc565Sespie OpenBSD::PackingElement::File->add($plist, CONTENTS); 114435cc565Sespie return $plist; 1156f05d20cSespie} 1166f05d20cSespie 117e39fac1bSespiesub set_infodir 118e39fac1bSespie{ 119c0956bedSespie my ($self, $dir) = @_; 120cc24e6f2Sespie $dir .= '/' unless $dir =~ m/\/$/o; 121e39fac1bSespie ${$self->{infodir}} = $dir; 122e39fac1bSespie} 123e39fac1bSespie 1246a5fab34Sespiesub make_shallow_copy 12526205b33Sespie{ 12626205b33Sespie my ($plist, $h) = @_; 12726205b33Sespie 128d1b1b3a5Sespie my $copy = ref($plist)->new; 1292786dca3Sespie $copy->set_infodir($plist->infodir); 1306a5fab34Sespie $plist->copy_shallow_if($copy, $h); 13126205b33Sespie return $copy; 13226205b33Sespie} 13326205b33Sespie 1346a5fab34Sespiesub make_deep_copy 1356a5fab34Sespie{ 1366a5fab34Sespie my ($plist, $h) = @_; 1376a5fab34Sespie 138d1b1b3a5Sespie my $copy = ref($plist)->new; 1392786dca3Sespie $copy->set_infodir($plist->infodir); 1406a5fab34Sespie $plist->copy_deep_if($copy, $h); 1416a5fab34Sespie return $copy; 1426a5fab34Sespie} 14326205b33Sespie 144c0956bedSespiesub infodir 145c0956bedSespie{ 146c0956bedSespie my $self = shift; 1473f2ef483Sespie return ${$self->{infodir}}; 148c0956bedSespie} 149c0956bedSespie 150f0c4f0f9Sespiesub zap_wrong_annotations 151f0c4f0f9Sespie{ 152f0c4f0f9Sespie my $self = shift; 153f0c4f0f9Sespie my $pkgname = $self->pkgname; 154f0c4f0f9Sespie if (defined $pkgname && $pkgname =~ m/^(?:\.libs\d*|partial)\-/) { 155f0c4f0f9Sespie delete $self->{'manual-installation'}; 15612460683Sespie delete $self->{'firmware'}; 15712460683Sespie delete $self->{'digital-signature'}; 158f0c4f0f9Sespie } 159f0c4f0f9Sespie} 160f0c4f0f9Sespie 161ec33acfdSespiesub conflict_list 162ec33acfdSespie{ 163ec33acfdSespie require OpenBSD::PkgCfl; 164ec33acfdSespie 165ec33acfdSespie my $self = shift; 166d7d1cba4Sespie return OpenBSD::PkgCfl->make_conflict_list($self); 167ec33acfdSespie} 168ec33acfdSespie 169d1b1b3a5Sespiemy $subclass; 170d1b1b3a5Sespie 1716f05d20cSespiesub read 1726f05d20cSespie{ 17309568254Sespie my ($a, $u, $code) = @_; 1746f05d20cSespie my $plist; 17518f2b7ffSespie $code = \&defaultCode if !defined $code; 1766f05d20cSespie if (ref $a) { 1776f05d20cSespie $plist = $a; 1786f05d20cSespie } else { 1796f05d20cSespie $plist = new $a; 1806f05d20cSespie } 181d1b1b3a5Sespie if (defined $subclass->{$code}) { 182d1b1b3a5Sespie bless $plist, "OpenBSD::PackingList::".$subclass->{$code}; 183d1b1b3a5Sespie } 18409568254Sespie &$code($u, 185f7e1ce99Sespie sub { 1862c486618Sespie my $line = shift; 1872c486618Sespie return if $line =~ m/^\s*$/o; 1882c486618Sespie OpenBSD::PackingElement->create($line, $plist); 189f7e1ce99Sespie }); 190f0c4f0f9Sespie $plist->zap_wrong_annotations; 1916f05d20cSespie return $plist; 1926f05d20cSespie} 1936f05d20cSespie 194f7e1ce99Sespiesub defaultCode 1956f05d20cSespie{ 196f7e1ce99Sespie my ($fh, $cont) = @_; 197f7e1ce99Sespie while (<$fh>) { 198f7e1ce99Sespie &$cont($_); 199f7e1ce99Sespie } 2006f05d20cSespie} 2016f05d20cSespie 20258be51c0Sespiesub SharedItemsOnly 2036f05d20cSespie{ 204f7e1ce99Sespie my ($fh, $cont) = @_; 205f7e1ce99Sespie while (<$fh>) { 2060dbdd4adSespie next unless m/^\@(?:cwd|dir|fontdir|ghost|mandir|newuser|newgroup|name)\b/o || m/^\@(?:sample|extra)\b.*\/$/o || m/^[^\@].*\/$/o; 207f7e1ce99Sespie &$cont($_); 208f7e1ce99Sespie } 2096f05d20cSespie} 2106f05d20cSespie 2116e58fb23Sespiesub UpdatePlistOnly 2126e58fb23Sespie{ 2136e58fb23Sespie my ($fh, $cont) = @_; 2146e58fb23Sespie while (<$fh>) { 2156e58fb23Sespie next unless m/^\@(?:cwd|dir|fontdir|ghost|mandir|depend)\b/o || m/^\@(?:sample|extra)\b.*\/$/o || m/^[^\@].*\/$/o; 2166e58fb23Sespie &$cont($_); 2176e58fb23Sespie } 2186e58fb23Sespie} 2196e58fb23Sespie 22058be51c0Sespiesub DirrmOnly 22158be51c0Sespie{ 22258be51c0Sespie &OpenBSD::PackingList::SharedItemsOnly; 22358be51c0Sespie} 22458be51c0Sespie 2252d9bc31aSespiesub LibraryOnly 2262d9bc31aSespie{ 2272d9bc31aSespie my ($fh, $cont) = @_; 2282d9bc31aSespie while (<$fh>) { 229dd2410cfSespie next unless m/^\@(?:cwd|lib|name|comment\s+subdir\=)\b/o; 2302d9bc31aSespie &$cont($_); 2312d9bc31aSespie } 2322d9bc31aSespie} 2332d9bc31aSespie 234f7e1ce99Sespiesub FilesOnly 2356f05d20cSespie{ 236f7e1ce99Sespie my ($fh, $cont) = @_; 237f7e1ce99Sespie while (<$fh>) { 238130b115fSespie next unless m/^\@(?:cwd|name|info|man|file|lib|shell|sample|bin|rcscript|so|static-lib)\b/o || !m/^\@/o; 239f7e1ce99Sespie &$cont($_); 240f7e1ce99Sespie } 241f7e1ce99Sespie} 242f7e1ce99Sespie 2436a8d296fSespiesub PrelinkStuffOnly 2446a8d296fSespie{ 2456a8d296fSespie my ($fh, $cont) = @_; 2466a8d296fSespie while (<$fh>) { 247d13585a8Sespie next unless m/^\@(?:cwd|bin|lib|name|define-tag|libset|depend|wantlib|comment\s+ubdir\=)\b/o; 2486a8d296fSespie &$cont($_); 2496a8d296fSespie } 2506a8d296fSespie} 2516a8d296fSespie 25238727c08Sespiesub DependOnly 25338727c08Sespie{ 25438727c08Sespie my ($fh, $cont) = @_; 25538727c08Sespie while (<$fh>) { 256b78ce643Sespie if (m/^\@(?:libset|depend|wantlib|define-tag)\b/o) { 25728790261Sespie &$cont($_); 258dd2410cfSespie # XXX optimization 259368a866dSespie } elsif (m/^\@(?:newgroup|newuser|cwd)\b/o) { 26028790261Sespie last; 26128790261Sespie } 26228790261Sespie } 26338727c08Sespie} 26438727c08Sespie 265737fdd9bSespiesub ExtraInfoOnly 266737fdd9bSespie{ 267737fdd9bSespie my ($fh, $cont) = @_; 268737fdd9bSespie while (<$fh>) { 269e18e832dSespie if (m/^\@(?:name|pkgpath|comment\s+(?:subdir|pkgpath)\=|option)\b/o) { 270987c5975Sespie &$cont($_); 271dd2410cfSespie # XXX optimization 272b78ce643Sespie } elsif (m/^\@(?:libset|depend|wantlib|newgroup|newuser|cwd)\b/o) { 2737522c6eaSespie last; 2747522c6eaSespie } 2757522c6eaSespie } 276737fdd9bSespie} 277737fdd9bSespie 2789b5ce663Sespiesub UpdateInfoOnly 2799b5ce663Sespie{ 2809b5ce663Sespie my ($fh, $cont) = @_; 2819b5ce663Sespie while (<$fh>) { 282*efe01a68Sespie # if old alwaysupdate, all info is sig 283*efe01a68Sespie # if new, we don't need the rest 284*efe01a68Sespie if (m/^\@option\s+always-update$/o) { 2859131f929Sespie &$cont($_); 2869131f929Sespie while (<$fh>) { 2879131f929Sespie &$cont($_); 2889131f929Sespie } 2893b9b0d1bSespie return; 2909131f929Sespie } 291b78ce643Sespie if (m/^\@(?:name|libset|depend|wantlib|conflict|option|pkgpath|url|version|arch|comment\s+(?:subdir|pkgpath)\=)\b/o) { 2929b5ce663Sespie &$cont($_); 293dd2410cfSespie # XXX optimization 294dd2410cfSespie } elsif (m/^\@(?:newgroup|newuser|cwd)\b/o) { 295dd2410cfSespie last; 296dd2410cfSespie } 2979b5ce663Sespie } 2989b5ce663Sespie} 2999b5ce663Sespie 300f7e1ce99Sespiesub ConflictOnly 301f7e1ce99Sespie{ 302f7e1ce99Sespie my ($fh, $cont) = @_; 303f7e1ce99Sespie while (<$fh>) { 304dd2410cfSespie if (m/^\@(?:name|conflict|option)\b/o) { 30528790261Sespie &$cont($_); 306dd2410cfSespie # XXX optimization 307b78ce643Sespie } elsif (m/^\@(?:libset|depend|wantlib|newgroup|newuser|cwd)\b/o) { 30828790261Sespie last; 30928790261Sespie } 31028790261Sespie } 311f7e1ce99Sespie} 312f7e1ce99Sespie 3136f05d20cSespiesub fromfile 3146f05d20cSespie{ 3156f05d20cSespie my ($a, $fname, $code) = @_; 316b9b2024bSespie open(my $fh, '<', $fname) or return; 3178433647eSespie my $plist; 3188433647eSespie eval { 3198433647eSespie $plist = $a->read($fh, $code); 3208433647eSespie }; 3218433647eSespie if ($@) { 3228433647eSespie chomp $@; 323cc24e6f2Sespie $@ =~ s/\.$/,/o; 3248433647eSespie die "$@ in $fname, "; 3258433647eSespie } 3266f05d20cSespie close($fh); 3276f05d20cSespie return $plist; 3286f05d20cSespie} 3296f05d20cSespie 3306f05d20cSespiesub tofile 3316f05d20cSespie{ 3326f05d20cSespie my ($self, $fname) = @_; 333b9b2024bSespie open(my $fh, '>', $fname) or return; 334f0c4f0f9Sespie $self->zap_wrong_annotations; 3356f05d20cSespie $self->write($fh); 336b9b2024bSespie close($fh) or return; 3376f05d20cSespie return 1; 3386f05d20cSespie} 3396f05d20cSespie 340c0956bedSespiesub save 341c0956bedSespie{ 342c0956bedSespie my $self = shift; 343c0956bedSespie $self->tofile($self->infodir.CONTENTS); 344c0956bedSespie} 345c0956bedSespie 3466f05d20cSespiesub add2list 3476f05d20cSespie{ 3486f05d20cSespie my ($plist, $object) = @_; 349f04afe28Sespie my $category = $object->category; 3506f05d20cSespie push @{$plist->{$category}}, $object; 3516f05d20cSespie} 3526f05d20cSespie 3536f05d20cSespiesub addunique 3546f05d20cSespie{ 3556f05d20cSespie my ($plist, $object) = @_; 356f04afe28Sespie my $category = $object->category; 3576f05d20cSespie if (defined $plist->{$category}) { 35833efc49fSespie die "Duplicate $category in plist ".($plist->pkgname // "?"); 3596f05d20cSespie } 3606f05d20cSespie $plist->{$category} = $object; 3616f05d20cSespie} 3626f05d20cSespie 36310d7f8b4Sespiesub has 36410d7f8b4Sespie{ 36510d7f8b4Sespie my ($plist, $name) = @_; 36610d7f8b4Sespie return defined $plist->{$name}; 36710d7f8b4Sespie} 36810d7f8b4Sespie 36910d7f8b4Sespiesub get 37010d7f8b4Sespie{ 37110d7f8b4Sespie my ($plist, $name) = @_; 37210d7f8b4Sespie return $plist->{$name}; 37310d7f8b4Sespie} 37410d7f8b4Sespie 37526205b33Sespiesub set_pkgname 37626205b33Sespie{ 37726205b33Sespie my ($self, $name) = @_; 37826205b33Sespie if (defined $self->{name}) { 379e451b54dSespie $self->{name}->set_name($name); 38026205b33Sespie } else { 38126205b33Sespie OpenBSD::PackingElement::Name->add($self, $name); 38226205b33Sespie } 38326205b33Sespie} 38426205b33Sespie 38536a7fe47Sespiesub pkgname 3866f05d20cSespie{ 3876f05d20cSespie my $self = shift; 388c9089320Snaddy if (defined $self->{name}) { 389e451b54dSespie return $self->{name}->name; 390c9089320Snaddy } else { 391c9089320Snaddy return undef; 392c9089320Snaddy } 3936f05d20cSespie} 3946f05d20cSespie 39536a7fe47Sespiesub localbase 396dccc2276Sespie{ 397dccc2276Sespie my $self = shift; 398e95d9ee4Sespie 399e95d9ee4Sespie if (defined $self->{localbase}) { 400e451b54dSespie return $self->{localbase}->name; 401e95d9ee4Sespie } else { 402e95d9ee4Sespie return '/usr/local'; 403e95d9ee4Sespie } 404dccc2276Sespie} 405dccc2276Sespie 40611ccabebSespiesub is_signed 40711ccabebSespie{ 40887317f7eSespie my $self = shift; 40987317f7eSespie return defined $self->{'digital-signature'}; 41011ccabebSespie} 4112063c02eSespie 412a4f5498fSespiesub fullpkgpath 413a4f5498fSespie{ 414a4f5498fSespie my $self = shift; 41589955da4Sespie if (defined $self->{extrainfo} && $self->{extrainfo}{subdir} ne '') { 41689955da4Sespie return $self->{extrainfo}{subdir}; 41708fe6b3eSespie } else { 41808fe6b3eSespie return undef; 41908fe6b3eSespie } 42008fe6b3eSespie} 42108fe6b3eSespie 42208fe6b3eSespiesub fullpkgpath2 42308fe6b3eSespie{ 42408fe6b3eSespie my $self = shift; 42589955da4Sespie if (defined $self->{extrainfo} && $self->{extrainfo}{subdir} ne '') { 42689955da4Sespie return $self->{extrainfo}{path}; 427a4f5498fSespie } else { 428a4f5498fSespie return undef; 429a4f5498fSespie } 430a4f5498fSespie} 43108fe6b3eSespie 432e451b54dSespiesub pkgpath 433e451b54dSespie{ 434e451b54dSespie my $self = shift; 435e451b54dSespie if (!defined $self->{_hashpath}) { 436e451b54dSespie my $h = $self->{_hashpath} = 437e451b54dSespie bless {}, "OpenBSD::PackingList::hashpath"; 43808fe6b3eSespie my $f = $self->fullpkgpath2; 4392d3b5332Sespie if (defined $f) { 4402d3b5332Sespie push(@{$h->{$f->{dir}}}, $f); 441e451b54dSespie } 442e451b54dSespie if (defined $self->{pkgpath}) { 443e451b54dSespie for my $i (@{$self->{pkgpath}}) { 44489955da4Sespie push(@{$h->{$i->{path}{dir}}}, $i->{path}); 445e451b54dSespie } 446e451b54dSespie } 447e451b54dSespie } 448e451b54dSespie return $self->{_hashpath}; 449e451b54dSespie} 450e451b54dSespie 451e451b54dSespiesub match_pkgpath 452e451b54dSespie{ 453e451b54dSespie my ($self, $plist2) = @_; 45431e751cfSespie return $self->pkgpath->match($plist2) || 45531e751cfSespie $plist2->pkgpath->match($self); 456e451b54dSespie} 457e451b54dSespie 4589b5ce663Sespieour @unique_categories = 459c179c396Sespie (qw(name url version signer digital-signature no-default-conflict manual-installation firmware always-update is-branch extrainfo localbase arch)); 4609b5ce663Sespie 4619b5ce663Sespieour @list_categories = 462b78ce643Sespie (qw(conflict pkgpath ask-update libset depend 463b82ff443Sespie wantlib define-tag groups users items)); 4649b5ce663Sespie 4659b5ce663Sespieour @cache_categories = 466b78ce643Sespie (qw(libset depend wantlib)); 4679b5ce663Sespie 4682063c02eSespiesub visit 4692063c02eSespie{ 4702063c02eSespie my ($self, $method, @l) = @_; 4712063c02eSespie 4722063c02eSespie if (defined $self->{cvstags}) { 4732063c02eSespie for my $item (@{$self->{cvstags}}) { 47467cc0ba0Sespie $item->$method(@l) unless $item->{deleted}; 4752063c02eSespie } 4762063c02eSespie } 4772063c02eSespie 47867cc0ba0Sespie # XXX unique and info files really get deleted, so there's no need 47967cc0ba0Sespie # to remove them later. 4809b5ce663Sespie for my $unique_item (@unique_categories) { 48167cc0ba0Sespie $self->{$unique_item}->$method(@l) 48267cc0ba0Sespie if defined $self->{$unique_item}; 4832063c02eSespie } 4842063c02eSespie 4852063c02eSespie for my $special (OpenBSD::PackageInfo::info_names()) { 4862063c02eSespie $self->{$special}->$method(@l) if defined $self->{$special}; 4872063c02eSespie } 4882063c02eSespie 4899b5ce663Sespie for my $listname (@list_categories) { 4902063c02eSespie if (defined $self->{$listname}) { 4912063c02eSespie for my $item (@{$self->{$listname}}) { 49267cc0ba0Sespie $item->$method(@l) if !$item->{deleted}; 4932063c02eSespie } 4942063c02eSespie } 4952063c02eSespie } 4962063c02eSespie} 4972063c02eSespie 49851f6b09fSespiemy $plist_cache = {}; 49951f6b09fSespie 50018f9a590Sespiesub from_installation 50118f9a590Sespie{ 50251f6b09fSespie my ($o, $pkgname, $code) = @_; 50318f9a590Sespie 50418f9a590Sespie require OpenBSD::PackageInfo; 50518f9a590Sespie 506f5939716Sespie $code //= \&defaultCode; 50751f6b09fSespie 5083571b10fSespie if ($code == \&DependOnly && defined $plist_cache->{$pkgname}) { 5093571b10fSespie return $plist_cache->{$pkgname}; 5103571b10fSespie } 5118ee98284Sespie my $filename = OpenBSD::PackageInfo::installed_contents($pkgname); 5128ee98284Sespie my $plist = $o->fromfile($filename, $code); 5133571b10fSespie if (defined $plist && $code == \&DependOnly) { 5143571b10fSespie $plist_cache->{$pkgname} = $plist; 5153571b10fSespie } 5163fdb0aa4Sespie if (defined $plist) { 517e39fac1bSespie $plist->set_infodir(OpenBSD::PackageInfo::installed_info($pkgname)); 5183fdb0aa4Sespie } 5198ee98284Sespie if (!defined $plist) { 5208ee98284Sespie print STDERR "Warning: couldn't read packing-list from installed package $pkgname\n"; 5218ee98284Sespie unless (-e $filename) { 5228ee98284Sespie print STDERR "File $filename does not exist\n"; 5238ee98284Sespie } 5248ee98284Sespie } 52551f6b09fSespie return $plist; 52618f9a590Sespie} 52718f9a590Sespie 528f0b76557Sespiesub to_cache 529f0b76557Sespie{ 530bd99e8b0Sespie my ($self) = @_; 531b1674f53Sespie return if defined $plist_cache->{$self->pkgname}; 532d1b1b3a5Sespie my $plist = OpenBSD::PackingList::Depend->new; 5339b5ce663Sespie for my $c (@cache_categories) { 534bd99e8b0Sespie if (defined $self->{$c}) { 535bd99e8b0Sespie $plist->{$c} = $self->{$c}; 536bd99e8b0Sespie } 537bd99e8b0Sespie } 538e39fac1bSespie $plist_cache->{$self->pkgname} = $plist; 539f0b76557Sespie} 540f0b76557Sespie 54118f9a590Sespiesub to_installation 54218f9a590Sespie{ 54318f9a590Sespie my ($self) = @_; 54418f9a590Sespie 54518f9a590Sespie require OpenBSD::PackageInfo; 54618f9a590Sespie 54738599eebSespie return if $main::not; 54838599eebSespie 549f04afe28Sespie $self->tofile(OpenBSD::PackageInfo::installed_contents($self->pkgname)); 55051f6b09fSespie} 55151f6b09fSespie 55251f6b09fSespiesub forget 55351f6b09fSespie{ 55418f2b7ffSespie} 55518f9a590Sespie 556fc9f0195Sespiesub signature 557fc9f0195Sespie{ 558fc9f0195Sespie my $self = shift; 559e1eeb5e0Sespie 560e1eeb5e0Sespie require OpenBSD::Signature; 561e1eeb5e0Sespie return OpenBSD::Signature->from_plist($self); 562fc9f0195Sespie} 563fc9f0195Sespie 564d1b1b3a5Sespie$subclass = { 565d1b1b3a5Sespie \&defaultCode => 'Full', 566d1b1b3a5Sespie \&SharedItemsOnly => 'SharedItems', 567d1b1b3a5Sespie \&DirrmOnly => 'SharedItems', 568d1b1b3a5Sespie \&LibraryOnly => 'Libraries', 569d1b1b3a5Sespie \&FilesOnly => 'Files', 570d1b1b3a5Sespie \&PrelinkStuffOnly => 'Prelink', 571d1b1b3a5Sespie \&DependOnly => 'Depend', 572d1b1b3a5Sespie \&ExtraInfoOnly => 'ExtraInfo', 573d1b1b3a5Sespie \&UpdateInfoOnly => 'UpdateInfo', 574d1b1b3a5Sespie \&ConflictOnly => 'Conflict' }; 575d1b1b3a5Sespie 576d1b1b3a5Sespiepackage OpenBSD::PackingList::OldLibs; 577d1b1b3a5Sespieour @ISA = qw(OpenBSD::PackingList); 578d1b1b3a5Sespiepackage OpenBSD::PackingList::Full; 579d1b1b3a5Sespieour @ISA = qw(OpenBSD::PackingList::OldLibs); 580d1b1b3a5Sespiepackage OpenBSD::PackingList::SharedItems; 581d1b1b3a5Sespieour @ISA = qw(OpenBSD::PackingList); 582d1b1b3a5Sespiepackage OpenBSD::PackingList::Libraries; 583d1b1b3a5Sespieour @ISA = qw(OpenBSD::PackingList); 584d1b1b3a5Sespiepackage OpenBSD::PackingList::Files; 585d1b1b3a5Sespieour @ISA = qw(OpenBSD::PackingList); 586d1b1b3a5Sespiepackage OpenBSD::PackingList::Prelink; 587d1b1b3a5Sespieour @ISA = qw(OpenBSD::PackingList); 588d1b1b3a5Sespiepackage OpenBSD::PackingList::Depend; 589d1b1b3a5Sespieour @ISA = qw(OpenBSD::PackingList); 590d1b1b3a5Sespiepackage OpenBSD::PackingList::ExtraInfo; 591d1b1b3a5Sespieour @ISA = qw(OpenBSD::PackingList); 592d1b1b3a5Sespiepackage OpenBSD::PackingList::UpdateInfo; 593d1b1b3a5Sespieour @ISA = qw(OpenBSD::PackingList); 594d1b1b3a5Sespiepackage OpenBSD::PackingList::Conflict; 595d1b1b3a5Sespieour @ISA = qw(OpenBSD::PackingList); 596d1b1b3a5Sespie 5976f05d20cSespie1; 598