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