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