xref: /openbsd/usr.sbin/pkg_add/pkg_mklocatedb (revision 6ba84b20)
158dbc7adSespie#! /usr/bin/perl
2a4f5498fSespie# Copyright (c) 2005-2010 Marc Espie <espie@openbsd.org>
3*6ba84b20Sespie# $OpenBSD: pkg_mklocatedb,v 1.48 2023/05/29 07:35:39 espie Exp $
458dbc7adSespie#
558dbc7adSespie# Permission to use, copy, modify, and distribute this software for any
658dbc7adSespie# purpose with or without fee is hereby granted, provided that the above
758dbc7adSespie# copyright notice and this permission notice appear in all copies.
858dbc7adSespie#
958dbc7adSespie# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
1058dbc7adSespie# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
1158dbc7adSespie# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
1258dbc7adSespie# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
1358dbc7adSespie# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
1458dbc7adSespie# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
1558dbc7adSespie# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
1658dbc7adSespie
17*6ba84b20Sespieuse v5.36;
188e722a89Sespieno lib ('/usr/local/libdata/perl5/site_perl');
190fbefeddSespie
2058dbc7adSespieuse OpenBSD::PackageInfo;
2158dbc7adSespieuse OpenBSD::PackingList;
2258dbc7adSespieuse OpenBSD::Getopt;
2358dbc7adSespieuse OpenBSD::Error;
2473c16894Sespieuse OpenBSD::Paths;
2569f8af35Sespieuse OpenBSD::AddCreateDelete;
2658dbc7adSespie
2762d979acSespiepackage OpenBSD::Pkgmklocatedb::State;
2862d979acSespieour @ISA = qw(OpenBSD::AddCreateDelete::State);
2962d979acSespie
30*6ba84b20Sespiesub handle_options($state)
3162d979acSespie{
3262d979acSespie	$state->{no_exports} = 1;
332d4ad278Sespie	$state->SUPER::handle_options('ad:Knqp:Pu',
342d4ad278Sespie	    '[-aKnPqu] [-d repository] [-p portsdir] [pkg-name ...]');
3562d979acSespie	$state->{portsdir} = $state->opt('p');
3662d979acSespie	$state->{pkgdir} = $state->opt('d');
3762d979acSespie	$state->{quiet} = $state->opt('q');
3862d979acSespie	$state->{pkgpath} = $state->opt('P');
3962d979acSespie	$state->{allinfo} = $state->opt('a');
4062d979acSespie	$state->{nopipe} = $state->opt('n');
413107f8b4Sespie	$state->{full} = $state->opt('K');
423107f8b4Sespie	$state->{update} = $state->opt('u');
43df0fe0c2Sespie}
4462d979acSespie
4558dbc7adSespiepackage OpenBSD::PackingElement;
46*6ba84b20Sespiesub print_name($, $) {}
47*6ba84b20Sespiesub set_header($, $) {}
4858dbc7adSespie
4962d979acSespiepackage OpenBSD::PackingElement::Name;
50*6ba84b20Sespiesub set_header($self, $state)
5162d979acSespie{
5262d979acSespie	$state->{currentheader} = $self->{name}.':';
5362d979acSespie}
5462d979acSespie
5562d979acSespiepackage OpenBSD::PackingElement::ExtraInfo;
56*6ba84b20Sespiesub set_header($self, $state)
5762d979acSespie{
5862d979acSespie	if ($state->{allinfo}) {
5962d979acSespie		$state->{currentheader} .=  $self->{subdir}.':';
6062d979acSespie	} elsif ($state->{pkgpath}) {
6162d979acSespie		$state->{currentheader} = $self->{subdir}.':';
6262d979acSespie	}
633107f8b4Sespie	$state->{done}{$self->{subdir}} = 1;
6462d979acSespie	$state->errsay($state->{currentheader}) unless $state->{quiet};
6562d979acSespie}
6662d979acSespie
6758dbc7adSespiepackage OpenBSD::PackingElement::FileObject;
68*6ba84b20Sespiesub object_name($self, $state)
693107f8b4Sespie{
703107f8b4Sespie	if ($state->{full}) {
713107f8b4Sespie		if ($self->needs_keyword) {
723107f8b4Sespie			return "\@".$self->keyword." ".$self->fullname;
733107f8b4Sespie		}
743107f8b4Sespie	}
753107f8b4Sespie	return $self->fullname;
763107f8b4Sespie}
773107f8b4Sespie
78*6ba84b20Sespiesub print_name($self, $state)
7958dbc7adSespie{
803107f8b4Sespie	print {$state->{out}} $state->{currentheader},
813107f8b4Sespie	    $self->object_name($state), "\n";
8258dbc7adSespie}
8358dbc7adSespie
84bbaa4218Sespiepackage OpenBSD::PackingElement::Action;
85*6ba84b20Sespiesub print_name($self, $state)
86bbaa4218Sespie{
87b0e520b0Sespie	print {$state->{out}} $state->{currentheader}, $self->fullstring, "\n";
88bbaa4218Sespie}
89bbaa4218Sespie
90b0e520b0Sespiepackage OpenBSD::PackingElement::ExeclikeAction;
91*6ba84b20Sespiesub print_name($self, $state)
92bbaa4218Sespie{
93b0e520b0Sespie	print {$state->{out}} $state->{currentheader}, "\@".
94b0e520b0Sespie	    $self->keyword, " ", $self->{expanded}, "\n";
95bbaa4218Sespie}
96bbaa4218Sespie
9728ca0f9aSespiepackage OpenBSD::PackingElement::Conflict;
9828ca0f9aSespiesub print_name
9928ca0f9aSespie{
10028ca0f9aSespie	&OpenBSD::PackingElement::Action::print_name;
10128ca0f9aSespie}
10228ca0f9aSespie
10328ca0f9aSespiepackage OpenBSD::PackingElement::NoDefaultConflict;
10428ca0f9aSespiesub print_name
10528ca0f9aSespie{
10628ca0f9aSespie	&OpenBSD::PackingElement::Action::print_name;
10728ca0f9aSespie}
10828ca0f9aSespie
109a970ee5aSespiepackage OpenBSD::PackingElement::TagBase;
110*6ba84b20Sespiesub print_name($self, $state)
111a970ee5aSespie{
112a970ee5aSespie	print {$state->{out}} $state->{currentheader}, "\@".
113a970ee5aSespie	    join(' ', $self->keyword, $self->name, $self->{params}), "\n";
114a970ee5aSespie}
115a970ee5aSespie
116a970ee5aSespiepackage OpenBSD::PackingElement::Tag;
117*6ba84b20Sespiesub print_name($self, $state)
118a970ee5aSespie{
119a970ee5aSespie	print {$state->{out}} $state->{currentheader}, "\@".
120a970ee5aSespie	    join(' ', $self->keyword, $self->name, $self->{expanded}), "\n";
121a970ee5aSespie}
122a970ee5aSespie
123e51225d9Sespiepackage OpenBSD::PackingElement::DirBase;
124*6ba84b20Sespiesub print_name($self, $state)
125e51225d9Sespie{
1263107f8b4Sespie	print {$state->{out}} $state->{currentheader},
1273107f8b4Sespie	    $self->object_name($state), "/\n";
128e51225d9Sespie}
12958dbc7adSespie
130965def97Sespiepackage main;
13162d979acSespie
132*6ba84b20Sespiesub open_output($state)
13362d979acSespie{
13462d979acSespie	if ($state->{nopipe} or -t STDOUT) {
13562d979acSespie		$state->{out} = \*STDOUT;
13662d979acSespie	} else {
13762d979acSespie		my $MKLOCATEDB = OpenBSD::Paths->mklocatedb;
13862d979acSespie
13962d979acSespie		open $state->{out}, "|-", $MKLOCATEDB, $MKLOCATEDB or
14062d979acSespie		    $state->fatal("couldn't open pipe to mklocatedb: #1", $!);
14162d979acSespie	}
14262d979acSespie}
14362d979acSespie
144*6ba84b20Sespiesub print_out($plist, $state)
145efcf1a09Sespie{
146efcf1a09Sespie	$plist->set_header($state);
147efcf1a09Sespie	$plist->print_name($state);
148efcf1a09Sespie}
149efcf1a09Sespie
150*6ba84b20Sespiesub do_portsdir($state)
15162d979acSespie{
1526baa78d2Sespie	my $make = $ENV{MAKE} || 'make';
1534f52b46eSespie	my $target = defined $ENV{SUBDIRLIST} ?
1544f52b46eSespie	    'print-plist' : 'print-plist-all';
15588d40ff8Sespie	delete $ENV{FLAVOR};
15688d40ff8Sespie	delete $ENV{SUBPACKAGE};
1574f52b46eSespie	open my $in, "cd $state->{portsdir} && $make $target |";
1586baa78d2Sespie	my $done = 0;
1596baa78d2Sespie	while (!$done) {
1606baa78d2Sespie		my $plist = OpenBSD::PackingList->read($in,
1616baa78d2Sespie		    sub {
1626baa78d2Sespie			my ($fh, $cont) = @_;
1636baa78d2Sespie			while (<$fh>) {
1646baa78d2Sespie				return if m/^\=\=\=\> /o;
1656baa78d2Sespie				&$cont($_);
1666baa78d2Sespie			}
1676baa78d2Sespie			$done = 1;
1686baa78d2Sespie		    });
169cc24e6f2Sespie		if (defined $plist && defined $plist->pkgname) {
170efcf1a09Sespie			print_out($plist, $state);
1716baa78d2Sespie		}
1726baa78d2Sespie	}
1736baa78d2Sespie	close($in);
1746baa78d2Sespie}
17524bc8510Sespie
176*6ba84b20Sespiesub do_pkgdir($state)
17762d979acSespie{
17899ebf4daSespie	require File::Find;
179a4f5498fSespie	no warnings qw(once);
18062d979acSespie	$state->fatal("Bad argument: #1 is not a directory", $state->{pkgdir})
18162d979acSespie	    unless -d $state->{pkgdir};
18299ebf4daSespie	File::Find::find(
183*6ba84b20Sespie	    sub() {
18499ebf4daSespie		return unless -f $_;
18569f8af35Sespie		my $plist = $state->repo->grabPlist($File::Find::name);
18699ebf4daSespie		return unless defined $plist;
187efcf1a09Sespie		print_out($plist, $state);
18862d979acSespie	    }, $state->{pkgdir});
18962d979acSespie}
19062d979acSespie
191*6ba84b20Sespiesub copy_stdin($state)
1923107f8b4Sespie{
1933107f8b4Sespie	while (<STDIN>) {
1943107f8b4Sespie		# if we find something that looks like a pkgpath we've done
1953107f8b4Sespie		# assume we were updating it
1963107f8b4Sespie		if (m,([^:]*/[^:]*)\:,) {
1973107f8b4Sespie			next if defined $state->{done}{$1};
1983107f8b4Sespie		}
1993107f8b4Sespie		print {$state->{out}} $_;
2003107f8b4Sespie	}
2013107f8b4Sespie}
2023107f8b4Sespie
20341c1847dSespiemy $state = OpenBSD::Pkgmklocatedb::State->new;
20462d979acSespie$state->handle_options;
20562d979acSespie
20662d979acSespieopen_output($state);
20762d979acSespie
208df0fe0c2Sespieif ($state->{fatals}) {
209df0fe0c2Sespie	$state->fatal("Files not found, can't continue");
210df0fe0c2Sespie}
211df0fe0c2Sespie
21262d979acSespieif ($state->{portsdir}) {
21362d979acSespie	do_portsdir($state);
21462d979acSespie} elsif ($state->{pkgdir}) {
21562d979acSespie	do_pkgdir($state);
21699ebf4daSespie} elsif (@ARGV == 0) {
2173107f8b4Sespie	if (!$state->{update}) {
21869f8af35Sespie		$state->progress->for_list("Scanning installation",
21969f8af35Sespie		    [installed_packages()], sub {
22069f8af35Sespie			my $pkgname = shift;
2213107f8b4Sespie			my $plist =
2223107f8b4Sespie			    OpenBSD::PackingList->from_installation($pkgname);
22369f8af35Sespie			return unless defined $plist;
224efcf1a09Sespie			print_out($plist, $state);
22569f8af35Sespie		    });
2263107f8b4Sespie	}
22758dbc7adSespie} else {
22869f8af35Sespie	$state->progress->for_list("Scanning packages", \@ARGV,
22969f8af35Sespie	    sub {
23069f8af35Sespie	    	my $pkgname = shift;
23169f8af35Sespie		my $plist = $state->repo->grabPlist($pkgname);
232d5a96aa3Sespie		next unless $plist;
233efcf1a09Sespie		print_out($plist, $state);
23469f8af35Sespie	    });
23558dbc7adSespie}
2363107f8b4Sespieif ($state->{update}) {
2373107f8b4Sespie	copy_stdin($state);
2383107f8b4Sespie}
239