summaryrefslogtreecommitdiffstats
path: root/usr.sbin/pkg_install
diff options
context:
space:
mode:
authorbmah <bmah@FreeBSD.org>2000-09-09 21:28:06 +0000
committerbmah <bmah@FreeBSD.org>2000-09-09 21:28:06 +0000
commitf974d44667252f4878d3fb79ab927da2faa6fa96 (patch)
tree187cb9508dee1a62f8382b1b01f7c351f86c5723 /usr.sbin/pkg_install
parentb5350bb3a5beaa89886049b7fe66b1c8d754891e (diff)
downloadFreeBSD-src-f974d44667252f4878d3fb79ab927da2faa6fa96.zip
FreeBSD-src-f974d44667252f4878d3fb79ab927da2faa6fa96.tar.gz
pkg_version.pl now understands the new package/port numbering scheme
introduced by version 1.349 of ports/Mk/bsd.port.mk and originally submitted by kris. In particular, it understands the $PORTREVISION (FreeBSD-specific changes or patches to a port) and $PORTEPOCH (for re-sorting version numbers when not used or when broken).
Diffstat (limited to 'usr.sbin/pkg_install')
-rwxr-xr-xusr.sbin/pkg_install/version/pkg_version.pl133
1 files changed, 109 insertions, 24 deletions
diff --git a/usr.sbin/pkg_install/version/pkg_version.pl b/usr.sbin/pkg_install/version/pkg_version.pl
index 984730d..ed05c3d 100755
--- a/usr.sbin/pkg_install/version/pkg_version.pl
+++ b/usr.sbin/pkg_install/version/pkg_version.pl
@@ -50,13 +50,13 @@ $CommentChar = "#";
$LimitFlag = "";
#
-# CompareVersions
+# CompareNumbers
#
# Try to figure out the relationship between two program version numbers.
# Detecting equality is easy, but determining order is a little difficult.
# This function returns -1, 0, or 1, in the same manner as <=> or cmp.
#
-sub CompareVersions {
+sub CompareNumbers {
local($v1, $v2);
$v1 = $_[0];
$v2 = $_[1];
@@ -92,23 +92,94 @@ sub CompareVersions {
}
#
+# CompareVersions
+#
+# Try to figure out the relationship between two program "full
+# versions", which is defined as the
+# ${PORTVERSION}[_${PORTREVISION}][,${PORTEPOCH}]
+# part of a package's name.
+#
+# Key points: ${PORTEPOCH} supercedes ${PORTVERSION}
+# supercedes ${PORTREVISION}. See the commit log for revision
+# 1.349 of ports/Mk/bsd.port.mk for more information.
+#
+sub CompareVersions {
+ local($fv1, $fv2, $v1, $v2, $v1, $r2, $e1, $e2, $rc);
+
+ $fv1 = $_[0];
+ $fv2 = $_[1];
+
+ # Shortcut check for equality before invoking the parsing
+ # routines.
+ if ($fv1 eq $fv2) {
+ return 0;
+ }
+ else {
+ ($v1, $r1, $e1) = &GetVersionComponents($fv1);
+ ($v2, $r2, $e2) = &GetVersionComponents($fv2);
+
+ # Check epoch, port version, and port revision, in that
+ # order.
+ $rc = &CompareNumbers($e1, $e2);
+ if ($rc == 0) {
+ $rc = &CompareNumbers($v1, $v2);
+ if ($rc == 0) {
+ $rc = &CompareNumbers($r1, $r2);
+ }
+ }
+
+ return $rc;
+ }
+}
+
+#
+# GetVersionComponents
+#
+# Parse out the version number, revision number, and epoch number
+# of a port's version string and return them as a three-element array.
+#
+# Syntax is: ${PORTVERSION}[_${PORTREVISION}][,${PORTEPOCH}]
+#
+sub GetVersionComponents {
+ local ($fullversion, $version, $revision, $epoch);
+
+ $fullversion = $_[0];
+
+ $fullversion =~ /([^_,]+)/;
+ $version = $1;
+
+ if ($fullversion =~ /_([^_,]+)/) {
+ $revision = $1;
+ }
+
+ if ($fullversion =~ /,([^_,]+)/) {
+ $epoch = $1;
+ }
+
+ return($version, $revision, $epoch);
+}
+
+#
# GetNameAndVersion
#
# Get the name and version number of a package. Returns a two element
-# array, first element is name, second element is version number.
+# array, first element is name, second element is full version string.,
#
sub GetNameAndVersion {
- local($string);
- $string = $_[0];
+ local($fullname, $name, $fullversion);
+ $fullname = $_[0];
- # If no hyphens then no version number
- return ($string, "") if $string !~ /-/;
+ # If no hyphens then no version numbers
+ return ($fullname, "", "", "", "") if $fullname !~ /-/;
- # Match (and group) everything in between two hyphens. Because the
+ # Match (and group) everything after hyphen(s). Because the
# regexp is 'greedy', the first .* will try and match everything up
# to (but not including) the last hyphen
- $string =~ /(.*)-(.*)/;
- return ($1, $2);
+ $fullname =~ /(.+)-(.+)/;
+ $name = $1;
+ $fullversion = $2;
+
+ return ($name, $fullversion);
}
#
@@ -179,13 +250,14 @@ if ($DebugFlag) {
open CURRENT, "$CurrentPackagesCommand|";
while (<CURRENT>) {
($packageString, $rest) = split;
- ($packageName, $packageVersion) = &GetNameAndVersion($packageString);
+
+ ($packageName, $packageFullversion) = &GetNameAndVersion($packageString);
$currentPackages{$packageName}{'name'} = $packageName;
- if (defined $currentPackages{$packageName}{'version'}) {
- $currentPackages{$packageName}{'version'} .= "," . $packageVersion;
+ if (defined $currentPackages{$packageName}{'fullversion'}) {
+ $currentPackages{$packageName}{'fullversion'} .= "|" . $packageFullversion;
}
else {
- $currentPackages{$packageName}{'version'} = $packageVersion;
+ $currentPackages{$packageName}{'fullversion'} = $packageFullversion;
}
$currentPackages{$packageName}{'refcount'}++;
}
@@ -198,14 +270,15 @@ if ($DebugFlag) {
open INDEX, "$IndexPackagesCommand|";
while (<INDEX>) {
($packageString, $packagePath, $rest) = split(/\|/);
- ($packageName, $packageVersion) = &GetNameAndVersion($packageString);
+
+ ($packageName, $packageFullversion) = &GetNameAndVersion($packageString);
$indexPackages{$packageName}{'name'} = $packageName;
$indexPackages{$packageName}{'path'} = $packagePath;
- if (defined $indexPackages{$packageName}{'version'}) {
- $indexPackages{$packageName}{'version'} .= "," . $packageVersion;
+ if (defined $indexPackages{$packageName}{'fullversion'}) {
+ $indexPackages{$packageName}{'fullversion'} .= "|" . $packageFullversion;
}
else {
- $indexPackages{$packageName}{'version'} = $packageVersion;
+ $indexPackages{$packageName}{'fullversion'} = $packageFullversion;
}
$indexPackages{$packageName}{'refcount'}++;
}
@@ -214,16 +287,24 @@ close INDEX;
#
# Produce reports
#
+# Prior versions of pkg_version used commas (",") as delimiters
+# when there were multiple versions of a package installed.
+# The new package version number syntax uses commas as well,
+# so we've used vertical bars ("|") internally, and convert them
+# to commas before we output anything so the reports look the
+# same as they did before.
+#
foreach $packageName (sort keys %currentPackages) {
$~ = "STDOUT_VERBOSE" if $VerboseFlag;
$~ = "STDOUT_COMMANDS" if $ShowCommandsFlag;
- $packageNameVer = "$packageName-$currentPackages{$packageName}{'version'}";
+ $packageNameVer = "$packageName-$currentPackages{$packageName}{'fullversion'}";
+ $packageNameVer =~ s/\|/,/g;
- if (defined $indexPackages{$packageName}{'version'}) {
+ if (defined $indexPackages{$packageName}{'fullversion'}) {
- $indexVersion = $indexPackages{$packageName}{'version'};
- $currentVersion = $currentPackages{$packageName}{'version'};
+ $indexVersion = $indexPackages{$packageName}{'fullversion'};
+ $currentVersion = $currentPackages{$packageName}{'fullversion'};
$indexRefcount = $indexPackages{$packageName}{'refcount'};
$currentRefcount = $currentPackages{$packageName}{'refcount'};
@@ -233,10 +314,14 @@ foreach $packageName (sort keys %currentPackages) {
if (($indexRefcount > 1) || ($currentRefcount > 1)) {
$versionCode = "?";
$Comment = "multiple versions (index has $indexVersion)";
+ $Comment =~ s/\|/,/g;
}
else {
- $rc = &CompareVersions($currentVersion, $indexVersion);
+ # Do the comparison
+ $rc =
+ &CompareVersions($currentPackages{$packageName}{'fullversion'},
+ $indexPackages{$packageName}{'fullversion'});
if ($rc == 0) {
next if $ShowCommandsFlag;
@@ -288,7 +373,7 @@ $packageName, $versionCode
# Verbose report (-v flag)
format STDOUT_VERBOSE =
-@<<<<<<<<<<<<<<<<<<<<<<<<< @< @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
+@<<<<<<<<<<<<<<<<<<<<<<<<< @< @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
$packageNameVer, $versionCode, $Comment
.
;
OpenPOWER on IntegriCloud