[devscripts] 01/22: uscan: properly cope with colons and minus signs in upstream versions

James McCoy jamessan at debian.org
Wed Aug 7 02:49:49 UTC 2013


This is an automated email from the git hooks/post-receive script.

jamessan pushed a commit to branch master
in repository devscripts.

commit 6173548263cc832d01c822738e7c53929aed66e8
Author: Bernhard R. Link <brlink at debian.org>
Date:   Tue Feb 7 10:53:12 2012 +0100

    uscan: properly cope with colons and minus signs in upstream versions
    
    uscan uses dpkg --compare-versions and Dpkg::Version to compare upstream
    versions.  But this command takes debian versions, which means it produces
    wrong results if the upstream version contains colons or minus signs.
    
    For example    3-1-1-3   >   3-1-4   (as 'upstream' is 3-1-1   vs. 3-1)
    but            3-1-1-3-1 <   3-1-4-1 (as 'upstream' is 3-1-1-3 vs. 3-1-4)
    
    To work around this compare the upstream versions with a epoch before
    and a revision afterwards, so colons and minus signs are treated as part
    of the upstream version.
    
    Calls to dpkg --compare-versions in uscan get this treatment directly,
    for the Dpkg::Version calls fix Devscripts::Versort:
    
    Add Devscripts::Versort::upstream_versort to sort versions ad upstream
    versions. (Devscripts::Versort::versort was documented to take upstream
    versions, but some other scripts seem to call it with Debian versions,
    so keep that behaviour and add a new one).
    
    Signed-off-by: Bernhard R. Link <brlink at debian.org>
    Signed-off-by: James McCoy <jamessan at debian.org>
---
 Devscripts/Versort.pm |   27 +++++++++++++++++----------
 debian/changelog      |    4 ++++
 scripts/uscan.pl      |   14 +++++++-------
 3 files changed, 28 insertions(+), 17 deletions(-)

diff --git a/Devscripts/Versort.pm b/Devscripts/Versort.pm
index 5bc4f8e..261d232 100644
--- a/Devscripts/Versort.pm
+++ b/Devscripts/Versort.pm
@@ -13,13 +13,15 @@
 # You should have received a copy of the GNU General Public License
 # along with this program. If not, see <http://www.gnu.org/licenses/>.
 
-# The functions in this Perl module are versort and deb_versort.  They
-# each take as input an array of elements of the form [version, data, ...]
-# and sort them into decreasing order according to dpkg's
+# The functions in this Perl module are versort, upstream_versort and
+# deb_versort.  They each take as input an array of elements of the form
+# [version, data, ...] and sort them into decreasing order according to dpkg's
 # understanding of version sorting.  The output is a sorted array.  In
-# versort, "version" is assumed to be an upstream version number only,
-# whereas in deb_versort, "version" is assumed to be a Debian version
-# number, possibly including an epoch and/or a Debian revision.
+# upstream_versort, "version" is assumed to be an upstream version number only,
+# whereas in deb_versort, "version" is assumed to be a Debian version number,
+# possibly including an epoch and/or a Debian revision. versort is available
+# for compatibility reasons. It compares versions as Debian versions
+# (i.e. 1-2-4 < 1-3) but disables checks for wellformed versions.
 #
 # The returned array has the greatest version as the 0th array element.
 
@@ -28,20 +30,25 @@ use Dpkg::Version;
 
 sub versort (@)
 {
-    return _versort(0, @_);
+    return _versort(0, sub { return shift->[0] }, @_);
 }
 
 sub deb_versort (@)
 {
-    return _versort(1, @_);
+    return _versort(1, sub { return shift->[0] }, @_);
+}
+
+sub upstream_versort (@)
+{
+    return _versort(0, sub { return "1:" . shift->[0] . "-0" }, @_);
 }
 
 sub _versort ($@)
 {
-    my ($check, @namever_pairs) = @_;
+    my ($check, $getversion, @namever_pairs) = @_;
 
     foreach my $pair (@namever_pairs) {
-	unshift(@$pair, Dpkg::Version->new($pair->[0], check => $check));
+	unshift(@$pair, Dpkg::Version->new(&$getversion($pair), check => $check));
     }
 
     my @sorted = sort { $b->[0] <=> $a->[0] } @namever_pairs;
diff --git a/debian/changelog b/debian/changelog
index 431b6da..3124bae 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -38,6 +38,10 @@ devscripts (2.13.3) UNRELEASED; urgency=low
   * wnpp-check: Add bug URL to output and reorder columns to ease reading.
     (Closes: #715572)
 
+  [ Bernhard R. Link ]
+  * uscan: properly cope with colons and minus signs in upstream versions.
+    (Closes: #658999)
+
  -- Yaroslav Halchenko <debian at onerussian.com>  Thu, 06 Jun 2013 22:32:37 -0400
 
 devscripts (2.13.2) unstable; urgency=low
diff --git a/scripts/uscan.pl b/scripts/uscan.pl
index 9daaf49..976b368 100755
--- a/scripts/uscan.pl
+++ b/scripts/uscan.pl
@@ -872,7 +872,7 @@ sub process_watchline ($$$$$$)
 
     # What is the most recent file, based on the filenames?
     # We first have to find the candidates, then we sort them using
-    # Devscripts::Versort::versort
+    # Devscripts::Versort::upstream_versort
     if ($site =~ m%^http(s)?://%) {
 	if (defined($1) and !$haveSSL) {
 	    uscan_die "$progname: you must have the libcrypt-ssleay-perl package installed\nto use https URLs\n";
@@ -988,7 +988,7 @@ sub process_watchline ($$$$$$)
 		    return 1;
 		}
 	    } else {
-		@hrefs = Devscripts::Versort::versort(@hrefs);
+		@hrefs = Devscripts::Versort::upstream_versort(@hrefs);
 		($newversion, $newfile) = @{$hrefs[0]};
 	    }
 	} else {
@@ -1085,7 +1085,7 @@ sub process_watchline ($$$$$$)
 		    return 1;
 		}
 	    } else {
-		@files = Devscripts::Versort::versort(@files);
+		@files = Devscripts::Versort::upstream_versort(@files);
 		($newversion, $newfile) = @{$files[0]};
 	    }
 	} else {
@@ -1241,7 +1241,7 @@ EOF
 
     # Can't just use $lastversion eq $newversion, as then 0.01 and 0.1
     # compare different, whereas they are treated as equal by dpkg
-    if (system("dpkg", "--compare-versions", "$mangled_lastversion", "eq", "$newversion") == 0) {
+    if (system("dpkg", "--compare-versions", "1:${mangled_lastversion}-0", "eq", "1:${newversion}-0") == 0) {
 	if ($verbose or ($download == 0 and $report and ! $dehs)) {
 	    print $pkg_report_header;
 	    $pkg_report_header = '';
@@ -1268,7 +1268,7 @@ EOF
     # We use dpkg's rules to determine whether our current version
     # is newer or older than the remote version.
     if (!defined $download_version) {
-	if (system("dpkg", "--compare-versions", "$mangled_lastversion", "gt", "$newversion") == 0) {
+	if (system("dpkg", "--compare-versions", "1:${mangled_lastversion}-0", "gt", "1:${newversion}-0") == 0) {
 	    if ($verbose) {
 		print " => remote site does not even have current version\n";
 	    } elsif ($dehs) {
@@ -1636,7 +1636,7 @@ sub newest_dir ($$$$$) {
 	    }
 	}
 	if (@hrefs) {
-	    @hrefs = Devscripts::Versort::versort(@hrefs);
+	    @hrefs = Devscripts::Versort::upstream_versort(@hrefs);
 	    if ($debug) {
 		print "-- Found the following matching hrefs (newest first):\n";
 		foreach my $href (@hrefs) { print "     $$href[1] ($$href[0])\n"; }
@@ -1708,7 +1708,7 @@ sub newest_dir ($$$$$) {
 		print STDERR "-- Found the following matching dirs:\n";
 		foreach my $dir (@dirs) { print STDERR "     $$dir[1]\n"; }
 	    }
-	    @dirs = Devscripts::Versort::versort(@dirs);
+	    @dirs = Devscripts::Versort::upstream_versort(@dirs);
 	    my ($newversion, $newdir) = @{$dirs[0]};
 	    return $newdir;
 	} else {

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/collab-maint/devscripts.git



More information about the devscripts-devel mailing list