xref: /openbsd/usr.sbin/pkg_add/pkg_mklocatedb (revision 69f8af35)
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