summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarc Espie <espie@cvs.openbsd.org>2005-08-29 00:42:59 +0000
committerMarc Espie <espie@cvs.openbsd.org>2005-08-29 00:42:59 +0000
commitf77900a9dce364865e138dff23d50042e10dd159 (patch)
treea435826b87769ea6fdd6c508250e843e9b2e2989
parentb3f05d04e18121aab8fa11d1cbc48691bcef59cc (diff)
correctly trim old p* versions of packages.
tests sturm@, aanriot@ okay deraadt@
-rw-r--r--usr.sbin/pkg_add/OpenBSD/PackageName.pm42
-rw-r--r--usr.sbin/pkg_add/pkg_add29
2 files changed, 43 insertions, 28 deletions
diff --git a/usr.sbin/pkg_add/OpenBSD/PackageName.pm b/usr.sbin/pkg_add/OpenBSD/PackageName.pm
index d8ed3bf9fa6..4805d3596ca 100644
--- a/usr.sbin/pkg_add/OpenBSD/PackageName.pm
+++ b/usr.sbin/pkg_add/OpenBSD/PackageName.pm
@@ -1,5 +1,5 @@
# ex:ts=8 sw=4:
-# $OpenBSD: PackageName.pm,v 1.8 2005/08/16 11:25:48 espie Exp $
+# $OpenBSD: PackageName.pm,v 1.9 2005/08/29 00:42:58 espie Exp $
#
# Copyright (c) 2003-2004 Marc Espie <espie@openbsd.org>
#
@@ -57,6 +57,46 @@ sub is_stem
}
}
+sub splitp
+{
+ local $_ = shift;
+
+ if (/^(.*\-\d[^-]*)p(\d+)/) {
+ return ($1.$', $2);
+ } else {
+ return ($_,-1);
+ }
+}
+
+sub rebuildp
+{
+ my ($pkg, $p) = @_;
+ if ($p == -1) {
+ return $pkg;
+ }
+ if ($pkg =~ m/\-\d[^-]*/) {
+ return "$`$&p$p$'";
+ } else {
+ return $pkg."p".$p;
+ }
+}
+
+sub keep_most_recent
+{
+ my $h = {};
+ for my $pkgname (@_) {
+ my ($p, $v) = splitp($pkgname);
+ if (!defined $h->{$p} || $h->{$p} < $v) {
+ $h->{$p} = $v;
+ }
+ }
+ my @list = ();
+ while (my ($p, $v) = each %$h) {
+ push(@list, rebuildp($p, $v));
+ }
+ return @list;
+}
+
sub findstem
{
my ($k, @list) = @_;
diff --git a/usr.sbin/pkg_add/pkg_add b/usr.sbin/pkg_add/pkg_add
index e0e056ca427..ee60c8c694e 100644
--- a/usr.sbin/pkg_add/pkg_add
+++ b/usr.sbin/pkg_add/pkg_add
@@ -1,7 +1,7 @@
#! /usr/bin/perl
# ex:ts=8 sw=4:
-# $OpenBSD: pkg_add,v 1.195 2005/08/22 12:18:06 espie Exp $
+# $OpenBSD: pkg_add,v 1.196 2005/08/29 00:42:58 espie Exp $
#
# Copyright (c) 2003-2004 Marc Espie <espie@openbsd.org>
#
@@ -635,33 +635,8 @@ sub find_updates
print "Updating $pkgname -> ", join(' ', @l2), "\n";
# if all packages have the same version, but distinct p,
# grab the most recent.
- # XXX dirty as hell, clean-up after 3.8
if (@l2 > 1) {
- my ($bestbase, $bestp, $best);
- my ($base, $p);
- for my $i (@l2) {
- if ($i =~ m/p(\d+)$/) {
- $base = $`;
- $p = $1;
- } else {
- $base = $i;
- $p = -1;
- }
- if (!defined $bestbase) {
- ($bestbase, $bestp, $best) = ($base, $p, $i);
- } else {
- if ($base ne $bestbase) {
- undef $best;
- last;
- }
- if ($p > $bestp) {
- ($bestp, $best) = ($p, $i);
- }
- }
- }
- if (defined $best) {
- @l2 = ($best);
- }
+ @l2 = OpenBSD::PackageName::keep_most_recent(@l2);
}
if (@l2 == 1) {