[BACK]Return to pkg_info CVS log [TXT][DIR] Up to [local] / src / usr.sbin / pkg_add

File: [local] / src / usr.sbin / pkg_add / Attic / pkg_info (download)

Revision 1.3, Thu Oct 23 17:48:07 2003 UTC (20 years, 7 months ago) by espie
Branch: MAIN
CVS Tags: OPENBSD_3_5_BASE, OPENBSD_3_5
Changes since 1.2: +64 -55 lines

missing space in DEINSTALL message.
allow pkg_delete stem to work, unless ambiguous.
put all pkg_info's work into a single function, so that
pkg_info autoconf will work.

ok fries@ sturm@

#! /usr/bin/perl
# ex:ts=8 sw=4:
# $OpenBSD: pkg_info,v 1.3 2003/10/23 17:48:07 espie Exp $
#
# Copyright (c) 2003 Marc Espie.
# 
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
#    notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
#    notice, this list of conditions and the following disclaimer in the
#    documentation and/or other materials provided with the distribution.
# 
# THIS SOFTWARE IS PROVIDED BY THE OPENBSD PROJECT AND CONTRIBUTORS
# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
# A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OPENBSD
# PROJECT OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

use strict;
use warnings;
use OpenBSD::PackageInfo;
use OpenBSD::PackageName;
use Getopt::Std;
use File::Copy;
# XXX we don't want to load these packages all the time
package OpenBSD::PackageLocator;
our $AUTOLOAD;
sub AUTOLOAD {
	eval { require OpenBSD::PackageLocator;
	};
	goto &$AUTOLOAD;
}

package OpenBSD::PackingList;
our $AUTOLOAD;
sub AUTOLOAD {
	eval { require OpenBSD::PackingList;
	};
	goto &$AUTOLOAD;
}

package main;

sub get_line
{
	open my $fh, '<', shift or return "";
	my $c = <$fh>;
	chomp($c);
	close $fh;
	return $c;
}

our ($opt_c, $opt_D, $opt_d, $opt_f, $opt_I, $opt_i, $opt_k, $opt_L, $opt_m,
    $opt_p, $opt_q, $opt_R, $opt_r, $opt_v, $opt_h, $opt_e, $opt_l, $opt_a);

sub print_info
{
	my ($pkg, $dir) = @_;
	unless (-d $dir) {
		print STDERR "Error printing info for $pkg: no info ?\n";
	}
	if ($opt_I) {
		my $l = 20 - length($pkg);
		$l = 1 if $l <= 0;
		print $pkg, " "x$l, get_line($dir.COMMENT), "\n";
	} else {
		print $opt_p, "Information for ", $pkg, "\n\n" unless $opt_q;
		if ($opt_c) {
			print $opt_p, "Comment:\n" unless $opt_q;
			copy($dir.COMMENT, \*STDOUT);
			print "\n";
		}
		if ($opt_R && -f $dir.REQUIRED_BY) {
			print $opt_p, "Required by:\n" unless $opt_q;
			copy($dir.REQUIRED_BY, \*STDOUT);
			print "\n";
		}
		if ($opt_d) {
			print $opt_p, "Description:\n" unless $opt_q;
			copy($dir.DESC, \*STDOUT);
			print "\n";
		}
		if ($opt_D && -f $dir.DISPLAY) {
			print $opt_p, "Install notice:\n" unless $opt_q;
			copy($dir.DISPLAY, \*STDOUT);
			print "\n";
		}
		if ($opt_i && -f $dir.INSTALL) {
			print $opt_p, "Install script:\n" unless $opt_q;
			copy($dir.INSTALL, \*STDOUT);
			print "\n";
		}
		if ($opt_k && -f $dir.DEINSTALL) {
			print $opt_p, "De-Install script:\n" unless $opt_q;
			copy($dir.DEINSTALL, \*STDOUT);
			print "\n";
		}
		if ($opt_r && -f $dir.REQUIRE) {
			print $opt_p, "Require script:\n" unless $opt_q;
			copy($dir.REQUIRE, \*STDOUT);
			print "\n";
		}
		my $plist;
		if ($opt_f || $opt_L) {
			if ($opt_f) {
				$plist = OpenBSD::PackingList->fromfile($dir.CONTENTS);
			} else {
				$plist = OpenBSD::PackingList->fromfile($dir.CONTENTS, \&OpenBSD::PackingList::FilesOnly);
			}
			die "Bad packing list" unless defined $plist;
		}
		if ($opt_L) {
			print $opt_p, "Files:\n" unless $opt_q;
			for my $item (@{$plist->{items}}) {
				next unless $item->IsFile();
				print $item->fullname(), "\n";
			}
			print "\n";
		}
		if ($opt_f) {
			print $opt_p, "Packing list:\n" unless $opt_q;
			$plist->write(\*STDOUT);
			print "\n";
		}
		print $opt_p, "\n" unless $opt_q;
	}
}

getopts('cDdfIikLmpqRrvhe:l:a');

if (defined $opt_e) {
	die "Error: -e is not yet supported";
}

unless ($opt_c || $opt_D || $opt_d || $opt_f || $opt_I || $opt_i ||
	$opt_k || $opt_L || $opt_m || $opt_p || $opt_R || $opt_r) {
	if (@ARGV == 0) {
		$opt_I = $opt_a = 1;
	} else {
		$opt_c = $opt_d = $opt_R = 1;
	}
}

if ($opt_v) {
	$opt_c = $opt_d = $opt_f = $opt_i = $opt_k = $opt_r = $opt_D =
	    $opt_m = $opt_R = 1;
}

if (!defined $opt_p) {
	$opt_p = "";
}

if (@ARGV == 0 && !$opt_a) {
	die "Missing package name(s)";
}

if (@ARGV > 0 && $opt_a) {
	die "Can't specify package name(s) with -a";
}

if (@ARGV == 0) {
	@ARGV = sort(installed_packages());
}

for my $pkg (@ARGV) {
	if (is_installed($pkg)) {
		print_info($pkg, installed_info($pkg));
		next;
	}
	if (OpenBSD::PackageName::is_stem($pkg)) {
		my @l = sort (OpenBSD::PackageName::findstem($pkg, installed_packages()));
		if (@l != 0) {
			for my $p (@l) {
				print_info($p, installed_info($p));
			}
			next;
		}
	}
				
	my $true_package = OpenBSD::PackageLocator->find($pkg);
	next unless $true_package;
	my $dir = $true_package->info();
	$true_package->close();

	print_info($pkg, $dir);
}