158dbc7adSespie#! /usr/bin/perl 2*a4f5498fSespie# Copyright (c) 2005-2010 Marc Espie <espie@openbsd.org> 3*a4f5498fSespie# $OpenBSD: pkg_mklocatedb,v 1.22 2010/01/01 16:09:35 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 1758dbc7adSespieuse strict; 180fbefeddSespieuse warnings; 190fbefeddSespie 2058dbc7adSespieuse OpenBSD::PackageLocator; 2158dbc7adSespieuse OpenBSD::PackageInfo; 2258dbc7adSespieuse OpenBSD::PackingList; 2358dbc7adSespieuse OpenBSD::Getopt; 2458dbc7adSespieuse OpenBSD::Error; 2573c16894Sespieuse OpenBSD::Paths; 2658dbc7adSespieuse File::Path; 2758dbc7adSespie 2858dbc7adSespiepackage OpenBSD::PackingElement; 2958dbc7adSespiesub print_name {} 3058dbc7adSespie 3158dbc7adSespiepackage OpenBSD::PackingElement::FileObject; 3258dbc7adSespiesub print_name 3358dbc7adSespie{ 3458dbc7adSespie my ($self, $fh, $pkgname) = @_; 35cc24e6f2Sespie print $fh $pkgname, ":", $self->fullname, "\n"; 3658dbc7adSespie} 3758dbc7adSespie 3858dbc7adSespiepackage main; 3958dbc7adSespie 400895ba1aSjmcset_usage('pkg_mklocatedb [-anPq] [-d repository] [-p portsdir] [-r release] [-s src] [-x X11src] [pkg-name [...]]'); 4158dbc7adSespie 4299ebf4daSespieour ($opt_a, $opt_n, $opt_q, $opt_s, $opt_x, $opt_r, $opt_p, $opt_P, $opt_d); 436baa78d2Sespie 446baa78d2Sespiesub info 456baa78d2Sespie{ 466baa78d2Sespie my $plist = shift; 4764275629Sespie my $r; 48df720557Sespie if ($opt_a) { 49*a4f5498fSespie $r = $plist->fullpkgpath.":".$plist->pkgname; 50df720557Sespie } elsif ($opt_P) { 51*a4f5498fSespie $r = $plist->fullpkgpath; 526baa78d2Sespie } else { 53cc24e6f2Sespie $r = $plist->pkgname; 546baa78d2Sespie } 5564275629Sespie print STDERR "$r\n" unless $opt_q; 5664275629Sespie return $r; 576baa78d2Sespie} 5858dbc7adSespie 595cbde8aaSespiesub tag 605cbde8aaSespie{ 615cbde8aaSespie my ($dir, $set, $rev) = @_; 625cbde8aaSespie my $r; 63df720557Sespie if ($opt_a) { 64df720557Sespie $r = "$dir/$set:$set$rev"; 65df720557Sespie } elsif ($opt_P) { 665cbde8aaSespie $r = "$dir/$set"; 675cbde8aaSespie } else { 685cbde8aaSespie $r = "$set$rev"; 695cbde8aaSespie } 705cbde8aaSespie print STDERR "$r\n" unless $opt_q; 715cbde8aaSespie return $r; 725cbde8aaSespie} 735cbde8aaSespie 7458dbc7adSespietry { 7599ebf4daSespie getopts('ad:nqs:x:r:p:P'); 7658dbc7adSespie} catchall { 7758dbc7adSespie Usage($_); 7858dbc7adSespie}; 7958dbc7adSespie 8058dbc7adSespiemy $fh; 8173c16894Sespiemy $MKLOCATEDB = OpenBSD::Paths->mklocatedb; 8258dbc7adSespie 8358dbc7adSespieif ($opt_n or -t STDOUT) { 8458dbc7adSespie $fh = \*STDOUT; 8558dbc7adSespie} else { 8658dbc7adSespie open $fh, "|-", $MKLOCATEDB, $MKLOCATEDB or die "couldn't open pipe: $!"; 8758dbc7adSespie} 8824bc8510Sespieif ($opt_s || $opt_x) { 8973c16894Sespie my $cmd = OpenBSD::Paths->uname." -mr"; 9073c16894Sespie my ($rev, $arch) = split(/\s+/o, `$cmd`); 9124bc8510Sespie chomp $arch; 9224bc8510Sespie $rev =~ s/\.//; 9324bc8510Sespie if ($opt_s) { 9424bc8510Sespie my $dir = "$opt_s/distrib/sets/lists"; 9524bc8510Sespie for my $set (qw(base comp etc game man misc)) { 965cbde8aaSespie my $tag = tag('src', $set, $rev); 9724bc8510Sespie for my $f ("$dir/$set/mi", "$dir/$set/md.$arch") { 9824bc8510Sespie open my $l, '<', $f or next; 9924bc8510Sespie while (my $e = <$l>) { 10024bc8510Sespie chomp $e; 10124bc8510Sespie $e =~ s/^\.//; 1025cbde8aaSespie print $fh "$tag:$e\n"; 10324bc8510Sespie } 10424bc8510Sespie } 10524bc8510Sespie } 10624bc8510Sespie } 10724bc8510Sespie if ($opt_x) { 10824bc8510Sespie my $dir = "$opt_x/distrib/sets/lists"; 10924bc8510Sespie for my $set (qw(xbase xetc xfont xserv xshare)) { 1105cbde8aaSespie my $tag = tag('XF4', $set, $rev); 11124bc8510Sespie for my $f ("$dir/$set/mi", "$dir/$set/md.$arch") { 11224bc8510Sespie open my $l, '<', $f or next; 11324bc8510Sespie while (my $e = <$l>) { 11424bc8510Sespie chomp $e; 11524bc8510Sespie $e =~ s/^\.//; 1165cbde8aaSespie print $fh "$tag:$e\n"; 11724bc8510Sespie } 11824bc8510Sespie } 11924bc8510Sespie } 12024bc8510Sespie } 12124bc8510Sespie} 12224bc8510Sespie 12324bc8510Sespieif ($opt_r) { 12424bc8510Sespie require OpenBSD::Ustar; 12524bc8510Sespie 12624bc8510Sespie opendir(my $dir, $opt_r) or next; 12724bc8510Sespie while (my $e = readdir $dir) { 128cc24e6f2Sespie if ($e =~ m/^(\w+\d\d)\.tgz$/o) { 12924bc8510Sespie my $set = $1; 13073c16894Sespie open my $arc, '-|', OpenBSD::Paths->gzip, '-c', '-d', "$opt_r/$e"; 13124bc8510Sespie my $u = OpenBSD::Ustar->new($arc, '/'); 132cc24e6f2Sespie while (my $f = $u->next) { 13324bc8510Sespie my $name = $f->{name}; 134cc24e6f2Sespie $name =~ s/^\.//o; 135c14797aeSespie print $fh "$set:$name\n"; 13624bc8510Sespie } 13724bc8510Sespie close $arc; 13824bc8510Sespie } 13924bc8510Sespie } 14024bc8510Sespie closedir($dir); 14124bc8510Sespie} 14224bc8510Sespie 1436baa78d2Sespieif ($opt_p) { 1446baa78d2Sespie my $make = $ENV{MAKE} || 'make'; 1456baa78d2Sespie open my $in, "cd $opt_p && $make print-plist-all |"; 1466baa78d2Sespie my $done = 0; 1476baa78d2Sespie while (!$done) { 1486baa78d2Sespie my $plist = OpenBSD::PackingList->read($in, 1496baa78d2Sespie sub { 1506baa78d2Sespie my ($fh, $cont) = @_; 151294e3aadSespie my $_; 1526baa78d2Sespie while (<$fh>) { 1536baa78d2Sespie return if m/^\=\=\=\> /o; 1546baa78d2Sespie next unless m/^\@(?:cwd|name|info|man|file|lib|shell|comment\s+subdir\=)\b/o || !m/^\@/o; 1556baa78d2Sespie &$cont($_); 1566baa78d2Sespie } 1576baa78d2Sespie $done = 1; 1586baa78d2Sespie }); 159cc24e6f2Sespie if (defined $plist && defined $plist->pkgname) { 160e46d0794Sespie $plist->print_name($fh, info($plist)); 1616baa78d2Sespie } 1626baa78d2Sespie } 1636baa78d2Sespie close($in); 1646baa78d2Sespie} 16524bc8510Sespie 16699ebf4daSespieelsif ($opt_d) { 16799ebf4daSespie require File::Find; 168*a4f5498fSespie no warnings qw(once); 16999ebf4daSespie die "Bad argument: $opt_d is not a directory" unless -d $opt_d; 17099ebf4daSespie File::Find::find( 17199ebf4daSespie sub { 17299ebf4daSespie return unless -f $_; 17399ebf4daSespie my $plist = OpenBSD::PackageLocator->grabPlist($File::Find::name); 17499ebf4daSespie return unless defined $plist; 17599ebf4daSespie $plist->print_name($fh, info($plist)); 17699ebf4daSespie }, $opt_d); 17799ebf4daSespie} elsif (@ARGV==0) { 17858dbc7adSespie for my $pkgname (installed_packages()) { 17958dbc7adSespie my $plist = OpenBSD::PackingList->from_installation($pkgname); 1808ee98284Sespie next unless defined $plist; 181e46d0794Sespie $plist->print_name($fh, info($plist)); 18258dbc7adSespie } 18358dbc7adSespie} else { 18458dbc7adSespie for my $pkgname (@ARGV) { 185d5a96aa3Sespie my $plist = OpenBSD::PackageLocator->grabPlist($pkgname); 186d5a96aa3Sespie next unless $plist; 187e46d0794Sespie $plist->print_name($fh, info($plist)); 18858dbc7adSespie } 18958dbc7adSespie} 190