158dbc7adSespie#! /usr/bin/perl 21144937fSespie# Copyright (c) 2005-2007 Marc Espie <espie@openbsd.org> 3*294e3aadSespie# $OpenBSD: pkg_mklocatedb,v 1.20 2008/10/20 10:25:16 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; 1858dbc7adSespieuse OpenBSD::PackageLocator; 1958dbc7adSespieuse OpenBSD::PackageInfo; 2058dbc7adSespieuse OpenBSD::PackingList; 2158dbc7adSespieuse OpenBSD::Getopt; 2258dbc7adSespieuse OpenBSD::Error; 2373c16894Sespieuse OpenBSD::Paths; 2458dbc7adSespieuse File::Path; 2558dbc7adSespie 2658dbc7adSespiepackage OpenBSD::PackingElement; 2758dbc7adSespiesub print_name {} 2858dbc7adSespie 2958dbc7adSespiepackage OpenBSD::PackingElement::FileObject; 3058dbc7adSespiesub print_name 3158dbc7adSespie{ 3258dbc7adSespie my ($self, $fh, $pkgname) = @_; 33cc24e6f2Sespie print $fh $pkgname, ":", $self->fullname, "\n"; 3458dbc7adSespie} 3558dbc7adSespie 3658dbc7adSespiepackage main; 3758dbc7adSespie 380895ba1aSjmcset_usage('pkg_mklocatedb [-anPq] [-d repository] [-p portsdir] [-r release] [-s src] [-x X11src] [pkg-name [...]]'); 3958dbc7adSespie 4099ebf4daSespieour ($opt_a, $opt_n, $opt_q, $opt_s, $opt_x, $opt_r, $opt_p, $opt_P, $opt_d); 416baa78d2Sespie 426baa78d2Sespiesub info 436baa78d2Sespie{ 446baa78d2Sespie my $plist = shift; 4564275629Sespie my $r; 46df720557Sespie if ($opt_a) { 47cc24e6f2Sespie $r = $plist->{extrainfo}->{subdir}.":".$plist->pkgname; 48df720557Sespie } elsif ($opt_P) { 4964275629Sespie $r = $plist->{extrainfo}->{subdir}; 506baa78d2Sespie } else { 51cc24e6f2Sespie $r = $plist->pkgname; 526baa78d2Sespie } 5364275629Sespie print STDERR "$r\n" unless $opt_q; 5464275629Sespie return $r; 556baa78d2Sespie} 5658dbc7adSespie 575cbde8aaSespiesub tag 585cbde8aaSespie{ 595cbde8aaSespie my ($dir, $set, $rev) = @_; 605cbde8aaSespie my $r; 61df720557Sespie if ($opt_a) { 62df720557Sespie $r = "$dir/$set:$set$rev"; 63df720557Sespie } elsif ($opt_P) { 645cbde8aaSespie $r = "$dir/$set"; 655cbde8aaSespie } else { 665cbde8aaSespie $r = "$set$rev"; 675cbde8aaSespie } 685cbde8aaSespie print STDERR "$r\n" unless $opt_q; 695cbde8aaSespie return $r; 705cbde8aaSespie} 715cbde8aaSespie 7258dbc7adSespietry { 7399ebf4daSespie getopts('ad:nqs:x:r:p:P'); 7458dbc7adSespie} catchall { 7558dbc7adSespie Usage($_); 7658dbc7adSespie}; 7758dbc7adSespie 7858dbc7adSespiemy $fh; 7973c16894Sespiemy $MKLOCATEDB = OpenBSD::Paths->mklocatedb; 8058dbc7adSespie 8158dbc7adSespieif ($opt_n or -t STDOUT) { 8258dbc7adSespie $fh = \*STDOUT; 8358dbc7adSespie} else { 8458dbc7adSespie open $fh, "|-", $MKLOCATEDB, $MKLOCATEDB or die "couldn't open pipe: $!"; 8558dbc7adSespie} 8624bc8510Sespieif ($opt_s || $opt_x) { 8773c16894Sespie my $cmd = OpenBSD::Paths->uname." -mr"; 8873c16894Sespie my ($rev, $arch) = split(/\s+/o, `$cmd`); 8924bc8510Sespie chomp $arch; 9024bc8510Sespie $rev =~ s/\.//; 9124bc8510Sespie if ($opt_s) { 9224bc8510Sespie my $dir = "$opt_s/distrib/sets/lists"; 9324bc8510Sespie for my $set (qw(base comp etc game man misc)) { 945cbde8aaSespie my $tag = tag('src', $set, $rev); 9524bc8510Sespie for my $f ("$dir/$set/mi", "$dir/$set/md.$arch") { 9624bc8510Sespie open my $l, '<', $f or next; 9724bc8510Sespie while (my $e = <$l>) { 9824bc8510Sespie chomp $e; 9924bc8510Sespie $e =~ s/^\.//; 1005cbde8aaSespie print $fh "$tag:$e\n"; 10124bc8510Sespie } 10224bc8510Sespie } 10324bc8510Sespie } 10424bc8510Sespie } 10524bc8510Sespie if ($opt_x) { 10624bc8510Sespie my $dir = "$opt_x/distrib/sets/lists"; 10724bc8510Sespie for my $set (qw(xbase xetc xfont xserv xshare)) { 1085cbde8aaSespie my $tag = tag('XF4', $set, $rev); 10924bc8510Sespie for my $f ("$dir/$set/mi", "$dir/$set/md.$arch") { 11024bc8510Sespie open my $l, '<', $f or next; 11124bc8510Sespie while (my $e = <$l>) { 11224bc8510Sespie chomp $e; 11324bc8510Sespie $e =~ s/^\.//; 1145cbde8aaSespie print $fh "$tag:$e\n"; 11524bc8510Sespie } 11624bc8510Sespie } 11724bc8510Sespie } 11824bc8510Sespie } 11924bc8510Sespie} 12024bc8510Sespie 12124bc8510Sespieif ($opt_r) { 12224bc8510Sespie require OpenBSD::Ustar; 12324bc8510Sespie 12424bc8510Sespie opendir(my $dir, $opt_r) or next; 12524bc8510Sespie while (my $e = readdir $dir) { 126cc24e6f2Sespie if ($e =~ m/^(\w+\d\d)\.tgz$/o) { 12724bc8510Sespie my $set = $1; 12873c16894Sespie open my $arc, '-|', OpenBSD::Paths->gzip, '-c', '-d', "$opt_r/$e"; 12924bc8510Sespie my $u = OpenBSD::Ustar->new($arc, '/'); 130cc24e6f2Sespie while (my $f = $u->next) { 13124bc8510Sespie my $name = $f->{name}; 132cc24e6f2Sespie $name =~ s/^\.//o; 133c14797aeSespie print $fh "$set:$name\n"; 13424bc8510Sespie } 13524bc8510Sespie close $arc; 13624bc8510Sespie } 13724bc8510Sespie } 13824bc8510Sespie closedir($dir); 13924bc8510Sespie} 14024bc8510Sespie 1416baa78d2Sespieif ($opt_p) { 1426baa78d2Sespie my $make = $ENV{MAKE} || 'make'; 1436baa78d2Sespie open my $in, "cd $opt_p && $make print-plist-all |"; 1446baa78d2Sespie my $done = 0; 1456baa78d2Sespie while (!$done) { 1466baa78d2Sespie my $plist = OpenBSD::PackingList->read($in, 1476baa78d2Sespie sub { 1486baa78d2Sespie my ($fh, $cont) = @_; 149*294e3aadSespie my $_; 1506baa78d2Sespie while (<$fh>) { 1516baa78d2Sespie return if m/^\=\=\=\> /o; 1526baa78d2Sespie next unless m/^\@(?:cwd|name|info|man|file|lib|shell|comment\s+subdir\=)\b/o || !m/^\@/o; 1536baa78d2Sespie &$cont($_); 1546baa78d2Sespie } 1556baa78d2Sespie $done = 1; 1566baa78d2Sespie }); 157cc24e6f2Sespie if (defined $plist && defined $plist->pkgname) { 158e46d0794Sespie $plist->print_name($fh, info($plist)); 1596baa78d2Sespie } 1606baa78d2Sespie } 1616baa78d2Sespie close($in); 1626baa78d2Sespie} 16324bc8510Sespie 16499ebf4daSespieelsif ($opt_d) { 16599ebf4daSespie require File::Find; 16699ebf4daSespie die "Bad argument: $opt_d is not a directory" unless -d $opt_d; 16799ebf4daSespie File::Find::find( 16899ebf4daSespie sub { 16999ebf4daSespie return unless -f $_; 17099ebf4daSespie my $plist = OpenBSD::PackageLocator->grabPlist($File::Find::name); 17199ebf4daSespie return unless defined $plist; 17299ebf4daSespie $plist->print_name($fh, info($plist)); 17399ebf4daSespie }, $opt_d); 17499ebf4daSespie} elsif (@ARGV==0) { 17558dbc7adSespie for my $pkgname (installed_packages()) { 17658dbc7adSespie my $plist = OpenBSD::PackingList->from_installation($pkgname); 1778ee98284Sespie next unless defined $plist; 178e46d0794Sespie $plist->print_name($fh, info($plist)); 17958dbc7adSespie } 18058dbc7adSespie} else { 18158dbc7adSespie for my $pkgname (@ARGV) { 182d5a96aa3Sespie my $plist = OpenBSD::PackageLocator->grabPlist($pkgname); 183d5a96aa3Sespie next unless $plist; 184e46d0794Sespie $plist->print_name($fh, info($plist)); 18558dbc7adSespie } 18658dbc7adSespie} 187