diff options
author | Bruce A. Mah <bmah@FreeBSD.org> | 2000-09-09 21:28:06 +0000 |
---|---|---|
committer | Bruce A. Mah <bmah@FreeBSD.org> | 2000-09-09 21:28:06 +0000 |
commit | 186cbe8e5d04ece62d4dd96a8774be015c1092b4 (patch) | |
tree | 5295f4406a3ab9acfb183b199bbee4fba3f30cb5 /usr.sbin/pkg_install | |
parent | 58359dc594b01399dd3a1ea3e9bce418acff582c (diff) | |
download | src-186cbe8e5d04ece62d4dd96a8774be015c1092b4.tar.gz src-186cbe8e5d04ece62d4dd96a8774be015c1092b4.zip |
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).
Notes
Notes:
svn path=/head/; revision=65646
Diffstat (limited to 'usr.sbin/pkg_install')
-rwxr-xr-x | usr.sbin/pkg_install/version/pkg_version.pl | 133 |
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 984730d7888b..ed05c3d54b4d 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 . ; |