158dbc7adSespie#! /usr/bin/perl 2a4f5498fSespie# Copyright (c) 2005-2010 Marc Espie <espie@openbsd.org> 3*69f8af35Sespie# $OpenBSD: pkg_mklocatedb,v 1.28 2010/06/30 11:33:57 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::PackageInfo; 2158dbc7adSespieuse OpenBSD::PackingList; 2258dbc7adSespieuse OpenBSD::Getopt; 2358dbc7adSespieuse OpenBSD::Error; 2473c16894Sespieuse OpenBSD::Paths; 25*69f8af35Sespieuse OpenBSD::AddCreateDelete; 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 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) { 47a4f5498fSespie $r = $plist->fullpkgpath.":".$plist->pkgname; 48df720557Sespie } elsif ($opt_P) { 49a4f5498fSespie $r = $plist->fullpkgpath; 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 72*69f8af35Sespiemy $state = OpenBSD::AddCreateDelete::State->new("pkg_mklocatedb"); 73*69f8af35Sespie$state->handle_options('ad:nqs:x:r:p:P', 74*69f8af35Sespie '[-anPq] [-d repository] [-p portsdir] [-r release] [-s src] ', 75*69f8af35Sespie '[-x X11src] [pkg-name [...]]'); 7658dbc7adSespie 7758dbc7adSespiemy $fh; 7873c16894Sespiemy $MKLOCATEDB = OpenBSD::Paths->mklocatedb; 7958dbc7adSespie 8058dbc7adSespieif ($opt_n or -t STDOUT) { 8158dbc7adSespie $fh = \*STDOUT; 8258dbc7adSespie} else { 83*69f8af35Sespie open $fh, "|-", $MKLOCATEDB, $MKLOCATEDB or 84*69f8af35Sespie $state->fatal("couldn't open pipe: #1", $!); 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; 12806629db8Sespie 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) = @_; 149294e3aadSespie my $_; 1506baa78d2Sespie while (<$fh>) { 1516baa78d2Sespie return if m/^\=\=\=\> /o; 15289c2548bSsthen next unless m/^\@(?:bin|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; 166a4f5498fSespie no warnings qw(once); 167*69f8af35Sespie $state->fatal("Bad argument: #1 is not a directory", $opt_d) 168*69f8af35Sespie unless -d $opt_d; 16999ebf4daSespie File::Find::find( 17099ebf4daSespie sub { 17199ebf4daSespie return unless -f $_; 172*69f8af35Sespie my $plist = $state->repo->grabPlist($File::Find::name); 17399ebf4daSespie return unless defined $plist; 17499ebf4daSespie $plist->print_name($fh, info($plist)); 17599ebf4daSespie }, $opt_d); 17699ebf4daSespie} elsif (@ARGV == 0) { 177*69f8af35Sespie $state->progress->for_list("Scanning installation", 178*69f8af35Sespie [installed_packages()], sub { 179*69f8af35Sespie my $pkgname = shift; 18058dbc7adSespie my $plist = OpenBSD::PackingList->from_installation($pkgname); 181*69f8af35Sespie return unless defined $plist; 182e46d0794Sespie $plist->print_name($fh, info($plist)); 183*69f8af35Sespie }); 18458dbc7adSespie} else { 185*69f8af35Sespie $state->progress->for_list("Scanning packages", \@ARGV, 186*69f8af35Sespie sub { 187*69f8af35Sespie my $pkgname = shift; 188*69f8af35Sespie my $plist = $state->repo->grabPlist($pkgname); 189d5a96aa3Sespie next unless $plist; 190e46d0794Sespie $plist->print_name($fh, info($plist)); 191*69f8af35Sespie }); 19258dbc7adSespie} 193