Browse Source

Dpkg::Version: Add new function compare_versions

Emulates the dpkg --compare-versions behaviour (Doesn't support
the -nl operators yet, though). This is often easier to write and
read instead of using vercmp directly.

Also add tests for the new function.
Frank Lichtenheld 19 years ago
parent
commit
8584f930e4
2 changed files with 64 additions and 2 deletions
  1. 30 0
      scripts/Dpkg/Version.pm
  2. 34 2
      scripts/t/100_Dpkg_Version.t

+ 30 - 0
scripts/Dpkg/Version.pm

@@ -162,6 +162,36 @@ sub vercmp ($$)
     return verrevcmp($version{revision}, $refversion{revision});
 }
 
+=item compare_versions
+
+Emulates dpkg --compare-versions. Takes two versions as arguments
+one and three and one operator as argument two. Supports the following
+operators: 'gt', 'ge', 'eq', 'le', 'lt', and '>>', '>=', '=', '<=', '<<'.
+Returns a true value if the specified condition is true, a false value
+otherwise.
+
+=cut
+
+sub compare_versions ($$$)
+{
+    my $rel = $_[1];
+    my $res = vercmp($_[0], $_[2]);
+
+    if ($rel eq 'gt' or $rel =~ />?>/) {
+	return $res > 0;
+    } elsif ($rel eq 'ge' or $rel eq '>=') {
+	return $res >= 0;
+    } elsif ($rel eq 'eq' or $rel eq '=') {
+	return $res == 0;
+    } elsif ($rel eq 'le' or $rel eq '<=') {
+	return $res <= 0;
+    } elsif ($rel eq 'lt' or $rel =~ /<?</) {
+	return $res < 0;
+    } else {
+	die "bad relation '$rel'";
+    }
+}
+
 =back
 
 =head1 AUTHOR

+ 34 - 2
scripts/t/100_Dpkg_Version.t

@@ -26,9 +26,33 @@ my @versions = ({a      => '1.0-1',
 		 result => 0,
 		 relation => 'eq',
 		},
+		{a      => '1.0000-1',
+		 b      => '1.0-1',
+		 result => 0,
+		 relation => 'ge',
+		},
+		{a      => '1',
+		 b      => '0:1',
+		 result => 0,
+		 relation => 'eq',
+		},
+		{a      => '2:2.5',
+		 b      => '1:7.5',
+		 result => 1,
+		 relation => 'gt',
+		},
 	       );
+my @test_failure = ({a      => '1.0-1',
+		     b      => '2.0-2',
+		     relation => 'gt',
+		    },
+		    {a      => '2.2~rc-4',
+		     b      => '2.2-1',
+		     relation => 'eq',
+		    },
+		   );
 
-plan tests => @versions * 2 + 1;
+plan tests => @versions * 3 + @test_failure * 2 + 1;
 
 sub dpkg_vercmp{
      my ($a,$b,$cmp) = @_;
@@ -41,8 +65,16 @@ use_ok('Dpkg::Version');
 
 for my $version_cmp (@versions) {
      ok(Dpkg::Version::vercmp($$version_cmp{a},$$version_cmp{b}) == $$version_cmp{result},
-	"Version $$version_cmp{a} $$version_cmp{relation} $$version_cmp{b} ok");
+	"vercmp: Version $$version_cmp{a} $$version_cmp{relation} $$version_cmp{b} ok");
+     ok(Dpkg::Version::compare_versions($$version_cmp{a},$$version_cmp{relation},$$version_cmp{b}),
+       "compare_versions: Version $$version_cmp{a} $$version_cmp{relation} $$version_cmp{b} ok");
      ok(dpkg_vercmp($$version_cmp{a},$$version_cmp{b},$$version_cmp{relation}),
 	"Dpkg concures: Version $$version_cmp{a} $$version_cmp{relation} $$version_cmp{b}");
 }
 
+for my $version_cmp (@test_failure) {
+     ok(!Dpkg::Version::compare_versions($$version_cmp{a},$$version_cmp{relation},$$version_cmp{b}),
+       "compare_versions: Version $$version_cmp{a} $$version_cmp{relation} $$version_cmp{b} false");
+     ok(!dpkg_vercmp($$version_cmp{a},$$version_cmp{b},$$version_cmp{relation}),
+	"Dpkg concures: Version $$version_cmp{a} $$version_cmp{relation} $$version_cmp{b}");
+}