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