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