File: [local] / src / usr.sbin / pkg_add / pkg_mklocatedb (download)
Revision 1.16, Wed Jun 20 13:44:39 2007 UTC (16 years, 11 months ago) by espie
Branch: MAIN
CVS Tags: OPENBSD_4_3_BASE, OPENBSD_4_3, OPENBSD_4_2_BASE, OPENBSD_4_2 Changes since 1.15: +1 -0 lines
sprinkle code to deal gracefully with absent packing-lists.
makes it easier for people to recover after a disk crash that
leaves /var/db/pkg half-empty.
|
#! /usr/bin/perl
# Copyright (c) 2005-2007 Marc Espie <espie@openbsd.org>
#
# Permission to use, copy, modify, and distribute this software for any
# purpose with or without fee is hereby granted, provided that the above
# copyright notice and this permission notice appear in all copies.
#
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
use strict;
use OpenBSD::PackageLocator;
use OpenBSD::PackageInfo;
use OpenBSD::PackingList;
use OpenBSD::Getopt;
use OpenBSD::Error;
use OpenBSD::Paths;
use File::Path;
package OpenBSD::PackingElement;
sub print_name {}
package OpenBSD::PackingElement::FileObject;
sub print_name
{
my ($self, $fh, $pkgname) = @_;
print $fh $pkgname, ":", $self->fullname, "\n";
}
package main;
set_usage('pkg_mklocatedb [-anPq] [-p portsdir] [-r release] [-s src] [-x X11src] [pkg-name [...]]');
our ($opt_a, $opt_n, $opt_q, $opt_s, $opt_x, $opt_r, $opt_p, $opt_P);
sub info
{
my $plist = shift;
my $r;
if ($opt_a) {
$r = $plist->{extrainfo}->{subdir}.":".$plist->pkgname;
} elsif ($opt_P) {
$r = $plist->{extrainfo}->{subdir};
} else {
$r = $plist->pkgname;
}
print STDERR "$r\n" unless $opt_q;
return $r;
}
sub tag
{
my ($dir, $set, $rev) = @_;
my $r;
if ($opt_a) {
$r = "$dir/$set:$set$rev";
} elsif ($opt_P) {
$r = "$dir/$set";
} else {
$r = "$set$rev";
}
print STDERR "$r\n" unless $opt_q;
return $r;
}
try {
getopts('anqs:x:r:p:P');
} catchall {
Usage($_);
};
my $fh;
my $MKLOCATEDB = OpenBSD::Paths->mklocatedb;
if ($opt_n or -t STDOUT) {
$fh = \*STDOUT;
} else {
open $fh, "|-", $MKLOCATEDB, $MKLOCATEDB or die "couldn't open pipe: $!";
}
if ($opt_s || $opt_x) {
my $cmd = OpenBSD::Paths->uname." -mr";
my ($rev, $arch) = split(/\s+/o, `$cmd`);
chomp $arch;
$rev =~ s/\.//;
if ($opt_s) {
my $dir = "$opt_s/distrib/sets/lists";
for my $set (qw(base comp etc game man misc)) {
my $tag = tag('src', $set, $rev);
for my $f ("$dir/$set/mi", "$dir/$set/md.$arch") {
open my $l, '<', $f or next;
while (my $e = <$l>) {
chomp $e;
$e =~ s/^\.//;
print $fh "$tag:$e\n";
}
}
}
}
if ($opt_x) {
my $dir = "$opt_x/distrib/sets/lists";
for my $set (qw(xbase xetc xfont xserv xshare)) {
my $tag = tag('XF4', $set, $rev);
for my $f ("$dir/$set/mi", "$dir/$set/md.$arch") {
open my $l, '<', $f or next;
while (my $e = <$l>) {
chomp $e;
$e =~ s/^\.//;
print $fh "$tag:$e\n";
}
}
}
}
}
if ($opt_r) {
require OpenBSD::Ustar;
opendir(my $dir, $opt_r) or next;
while (my $e = readdir $dir) {
if ($e =~ m/^(\w+\d\d)\.tgz$/o) {
my $set = $1;
open my $arc, '-|', OpenBSD::Paths->gzip, '-c', '-d', "$opt_r/$e";
my $u = OpenBSD::Ustar->new($arc, '/');
while (my $f = $u->next) {
my $name = $f->{name};
$name =~ s/^\.//o;
print $fh "$set:$name\n";
}
close $arc;
}
}
closedir($dir);
}
if ($opt_p) {
my $make = $ENV{MAKE} || 'make';
open my $in, "cd $opt_p && $make print-plist-all |";
my $done = 0;
while (!$done) {
my $plist = OpenBSD::PackingList->read($in,
sub {
my ($fh, $cont) = @_;
local $_;
while (<$fh>) {
return if m/^\=\=\=\> /o;
next unless m/^\@(?:cwd|name|info|man|file|lib|shell|comment\s+subdir\=)\b/o || !m/^\@/o;
&$cont($_);
}
$done = 1;
});
if (defined $plist && defined $plist->pkgname) {
$plist->print_name($fh, info($plist));
}
}
close($in);
}
elsif (@ARGV==0) {
for my $pkgname (installed_packages()) {
my $plist = OpenBSD::PackingList->from_installation($pkgname);
next unless defined $plist;
$plist->print_name($fh, info($plist));
}
} else {
for my $pkgname (@ARGV) {
my $plist = OpenBSD::PackageLocator->grabPlist($pkgname);
next unless $plist;
$plist->print_name($fh, info($plist));
}
}