Do my bit for the Perl removal team and shoot my own, rather mangy

looking, dog.
This commit is contained in:
paul 2002-05-08 18:44:24 +00:00
parent 2f7396a747
commit 360d649dec
4 changed files with 1 additions and 306 deletions

View File

@ -1,6 +1,6 @@
# $FreeBSD$
SUBDIR= lib add create delete info update version
SUBDIR= lib add create delete info version
.if exists(${.CURDIR}/../../crypto) && !defined(NOCRYPT) && !defined(NO_OPENSSL)
DISTRIBUTION= crypto

View File

@ -1,6 +0,0 @@
# $FreeBSD$
SCRIPTS= pkg_update.pl
MAN= pkg_update.1
.include <bsd.prog.mk>

View File

@ -1,77 +0,0 @@
.\"
.\" Copyright 2000 Paul Richards
.\"
.\" All rights reserved.
.\"
.\" 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 DEVELOPERS ``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 DEVELOPERS 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.
.\"
.\" $FreeBSD$
.Dd December 27, 2000
.Dt PKG_UPDATE 1
.Os
.Sh NAME
.Nm pkg_update
.Nd update an installed package
.Sh SYNOPSIS
.Nm
.Op Fl nv
.Op Fl r Ar oldpkg
.Ar newpkg.tgz
.Sh DESCRIPTION
The
.Nm
command is used to update an already installed package.
It takes care
of propagating dependencies from the replaced versions to the newly
installed version.
It would normally be used to replace all currently
installed versions of a package with a more current version.
It can
also be used to revert a package to an older version by specifying the
version to be replaced with the
.Fl r
option.
.Pp
The following options are available:
.Bl -tag -width indent
.It Fl n
Print the actions to be performed but don't actually do them.
.It Fl r Ar oldpkg
Replace the specified version of the package.
Normally
.Nm
will replace all installed versions of a package with the new version.
This isn't always desirable since for some packages it is expected
that multiple versions will be installed at the same time.
This option allows a specific version to be replaced.
.It Fl v
Enable verbose output.
.El
.Sh SEE ALSO
.Xr pkg_add 1 ,
.Xr pkg_create 1 ,
.Xr pkg_delete 1 ,
.Xr pkg_info 1 ,
.Xr pkg_version 1
.Sh AUTHORS
.An Paul Richards Aq paul@FreeBSD.org
.Sh BUGS
None known of as yet.

View File

@ -1,222 +0,0 @@
#!/usr/bin/perl
# Copyright (c) 2000
# Paul Richards. All rights reserved.
#
# 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,
# verbatim and that no modifications are made prior to this
# point in the file.
# 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 PAUL RICHARDS ``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 PAUL RICHARDS 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.
#
# $FreeBSD$
#/
use warnings;
use strict;
use File::Basename;
use Getopt::Std;
my $PKG_DB = "/var/db/pkg";
my $PKG_DEP_FILE = "+REQUIRED_BY";
my $PKG_ADD = "/usr/sbin/pkg_add";
my $PKG_CREATE = "/usr/sbin/pkg_create";
my $PKG_DELETE = "/usr/sbin/pkg_delete -f";
my $PKG_INFO = "/usr/sbin/pkg_info -Ia";
sub error ($) {
my ($error) = @_;
print STDERR $error, "\n";
}
sub get_version($) {
my ($pkg) = @_;
$pkg =~ /(.+)-([0-9\.]+)/;
if (! $2) {
return($pkg, "");
} else {
return ($1, $2);
}
}
sub get_requires($$) {
my ($pkg, $requires) = @_;
my $file = "$PKG_DB/$pkg/$PKG_DEP_FILE";
if (! -f $file) {
# Not all packages have dependencies
return 1;
}
if (! open(REQUIRES, "< $file")) {
error("Can't open $file, $!");
return 0;
}
while (<REQUIRES>) {
chomp $_;
$$requires{$_} = 1;
}
close(REQUIRES) || warn("Can't close $file, $!");
return 1;
}
sub put_requires($$) {
my ($pkg, $requires) = @_;
my $file = "$PKG_DB/$pkg/$PKG_DEP_FILE";
if (! open(REQUIRES, "> $file")) {
error("Can't open $file, $!");
return 0;
}
my $req;
for $req (keys %$requires) {
print REQUIRES $req, "\n";
}
if (! close(REQUIRES)) {
error("Can't close $file, $!");
return 0;
}
return 1;
}
#
# Start of main program
#
my @installed;
my %requires;
my $pkg = "";
my $update_pkg = "";
our($opt_a, $opt_c, $opt_v, $opt_r, $opt_n);
getopts('acnvr:');
if ($opt_a && $opt_c) {
die("Options 'a' and 'c' are mutually exclusive");
}
if ($opt_v) {
$PKG_DELETE .= " -v";
$PKG_ADD .= " -v";
$PKG_CREATE .= " -v";
}
if ($opt_n) {
$PKG_DELETE .= " -n";
$PKG_ADD .= " -n";
}
if (scalar @ARGV < 1) {
die("No package specified.\n");
} elsif (scalar @ARGV > 1) {
die("Only one package may be updated at a time.\n");
}
my $pkgfile = $ARGV[0];
if (! -f $pkgfile) {
die("Can't find package file $pkgfile\n");
}
my $newpkg = basename($pkgfile, '.tgz');
my ($pkgname, $new_version) = get_version($newpkg);
if ($opt_r && $opt_r ne "") {
my ($old_pkg, $old_version) = get_version($opt_r);
print "Updating $old_pkg package version ";
print "$old_version to $new_version\n";
$update_pkg = $opt_r;
} else {
print "Updating $pkgname packages to version $new_version\n";
$update_pkg = $pkgname;
}
# Safety net to prevent all packages getting deleted
if ($update_pkg eq "") {
die ("Package to update is empty, aborting\n");
}
# Find out what package versions are already installed
open(PKGINFO, "$PKG_INFO|") || die("Can't run $PKG_INFO, $!");
while (<PKGINFO>) {
my ($pkg) = /^(.*?)\s+.*/;
if ($pkg =~ /^$update_pkg-[0-9\.]+/) {
push(@installed, $pkg);
}
}
close(PKGINFO) || die("Couldn't close pipe from $PKG_INFO, $!");
if (scalar @installed == 0) {
if (! $opt_r) {
die("There are no $pkgname packages installed.\n");
} else {
die("Package $opt_r is not installed.\n");
}
}
# For each installed package that matches get the dependencies
my $old_pkg;
for $old_pkg (@installed) {
if (! get_requires($old_pkg, \%requires)) {
die("Failed to get requires from $old_pkg\n");
}
}
# Now delete all currently installed packages
for $old_pkg (@installed) {
if (! system("$PKG_DELETE $old_pkg")) {
print "Deleted $old_pkg\n" if ($opt_v);
} else {
error("Couldn't remove package $old_pkg, $!");
}
}
if (system("$PKG_ADD $pkgfile")) {
error("Command '$PKG_ADD $newpkg' failed, $!");
if (scalar keys %requires) {
print "The following packages depended on previously\n";
print "installed versions of $pkgname.\n";
print "You need to add them to the +REQUIRES file when you\n";
print "succeed in installing $newpkg.\n";
my $req;
for $req (keys %requires) {
print $req, "\n";
}
}
} else {
put_requires($pkgname . "-" . $new_version, \%requires);
}
exit;