=== modified file 'scripts/dpkg-mergechangelogs.pl'
--- old/scripts/dpkg-mergechangelogs.pl	2011-10-14 12:58:08 +0000
+++ new/scripts/dpkg-mergechangelogs.pl	2011-12-13 20:18:25 +0000
@@ -143,43 +143,51 @@
     my @arrays = (\@o, \@a, \@b);
     my $minver;
     foreach my $i (0 .. 2) {
-	if (defined $minver and defined $items[$i]) {
-	    my $cmp = compare_versions($minver, $items[$i]->get_version());
-	    if ($cmp > 0) {
-		$minver = $items[$i]->get_version();
-		foreach my $j (0 .. $i - 1) {
-		    unshift @{$arrays[$j]}, $items[$j];
-		    $items[$j] = undef;
-		}
-	    } elsif ($cmp < 0) {
-		unshift @{$arrays[$i]}, $items[$i];
-		$items[$i] = undef;
-	    }
-	} else {
-	    $minver = $items[$i]->get_version() if defined $items[$i];
-	}
+        if (defined $items[$i]) {
+            my $ver = get_version($items[$i]); 
+            if (defined $minver) {
+                my $cmp = compare_versions($minver, $ver);
+                if ($cmp > 0) {
+                    $minver = $ver;
+                    foreach my $j (0 .. $i - 1) {
+                        unshift @{$arrays[$j]}, $items[$j];
+                        $items[$j] = undef;
+                    }
+                } elsif ($cmp < 0) {
+                    unshift @{$arrays[$i]}, $items[$i];
+                    $items[$i] = undef;
+                }
+            } else {
+                $minver = $ver;
+            }
+        }
     }
     return @items;
 }
 
-# Compares the versions taking into account some oddities like the fact
-# that we want backport/volatile versions to sort higher than the version
-# on which they are based.
+# Get a Dpkg::Version object given a Dpkg::Changelog::Entry taking into
+# account some oddities like the fact that we want backport/volatile
+# versions to sort higher than the version on which they are based.
+sub get_version {
+    my $entry = shift;
+    my $s = $entry->get_version();
+    # Backport and volatile are not real prereleases
+    $s =~ s/~(bpo|vola)/+$1/;
+    if ($merge_prereleases) {
+        $s =~ s/~[^~]*$//;
+    }
+    my $version = Dpkg::Version->new($s, check => 1);
+    defined($version) || warning(_g("%s is not a valid version"), "$s");
+    return $version;
+}
+
+# Compares Dpkg::Version objects tolerating if one or other is undef
 sub compare_versions {
     my ($a, $b) = @_;
     return 0 if not defined $a and not defined $b;
     return 1 if not defined $b;
     return -1 if not defined $a;
-    $a = $a->get_version() if ref($a) and $a->isa("Dpkg::Changelog::Entry");
-    $b = $b->get_version() if ref($b) and $b->isa("Dpkg::Changelog::Entry");
-    # Backport and volatile are not real prereleases
-    $a =~ s/~(bpo|vola)/+$1/;
-    $b =~ s/~(bpo|vola)/+$1/;
-    if ($merge_prereleases) {
-	$a =~ s/~[^~]*$//;
-	$b =~ s/~[^~]*$//;
-    }
-    return version_compare($a, $b);
+    return $a <=> $b;
 }
 
 # Merge changelog entries smartly by merging individually the different

=== modified file 'scripts/t/910_merge_changelogs.t'
--- old/scripts/t/910_merge_changelogs.t	2011-06-15 22:25:32 +0000
+++ new/scripts/t/910_merge_changelogs.t	2011-12-13 20:48:41 +0000
@@ -22,7 +22,7 @@
 use strict;
 use warnings;
 
-plan tests => 2;
+plan tests => 3;
 
 my $srcdir = $ENV{srcdir} || '.';
 my $datadir = "$srcdir/t/910_merge_changelogs";
@@ -31,8 +31,10 @@
 sub test_merge {
     my ($expected_file, @options) = @_;
     my ($fh, $filename) = tempfile();
+    my $err;
     spawn(exec => ["$srcdir/dpkg-mergechangelogs.pl", @options],
-	  to_handle => $fh, wait_child => 1, nocheck => 1);
+	  to_handle => $fh, error_to_string => \$err, nocheck => 1);
+    # TODO: add check that $err output is as expected?
     my $res = compare($expected_file, $filename);
     if ($res) {
 	system("diff -u $expected_file $filename >&2");
@@ -55,3 +57,5 @@
     test_merge("$datadir/ch-merged-basic", @input);
     test_merge("$datadir/ch-merged-pr-basic", "-m", @input);
 }
+test_merge("$datadir/ch-badver-merged",  ("$datadir/ch-badver-base",
+    "$datadir/ch-badver-other", "$datadir/ch-badver-this"));

=== added file 'scripts/t/910_merge_changelogs/ch-badver-base'
--- old/scripts/t/910_merge_changelogs/ch-badver-base	1970-01-01 00:00:00 +0000
+++ new/scripts/t/910_merge_changelogs/ch-badver-base	2011-12-13 20:46:41 +0000
@@ -0,0 +1,5 @@
+egcs (ss-970814-1) experimental; urgency=low
+
+  * Initial packaging (of initial snapshot!)
+
+ -- Galen Hazelwood <galenh@micron.net>  Wed, 20 Aug 1997 00:36:28 +0000

=== added file 'scripts/t/910_merge_changelogs/ch-badver-merged'
--- old/scripts/t/910_merge_changelogs/ch-badver-merged	1970-01-01 00:00:00 +0000
+++ new/scripts/t/910_merge_changelogs/ch-badver-merged	2011-12-13 20:46:58 +0000
@@ -0,0 +1,11 @@
+egcs (970904-1) experimental; urgency=low
+
+  * New upstream snapshot
+
+ -- Galen Hazelwood <galenh@micron.net>  Sun,  7 Sep 1997 18:25:06 -0600
+
+egcs (ss-970814-1) experimental; urgency=low
+
+  * Initial packaging (of initial snapshot!)
+
+ -- Galen Hazelwood <galenh@micron.net>  Wed, 20 Aug 1997 00:36:28 +0000

=== added file 'scripts/t/910_merge_changelogs/ch-badver-other'
--- old/scripts/t/910_merge_changelogs/ch-badver-other	1970-01-01 00:00:00 +0000
+++ new/scripts/t/910_merge_changelogs/ch-badver-other	2011-12-13 20:46:23 +0000
@@ -0,0 +1,5 @@
+egcs (ss-970814-1) experimental; urgency=low
+
+  * Initial packaging (of initial snapshot!)
+
+ -- Galen Hazelwood <galenh@micron.net>  Wed, 20 Aug 1997 00:36:28 +0000

=== added file 'scripts/t/910_merge_changelogs/ch-badver-this'
--- old/scripts/t/910_merge_changelogs/ch-badver-this	1970-01-01 00:00:00 +0000
+++ new/scripts/t/910_merge_changelogs/ch-badver-this	2011-12-13 20:46:50 +0000
@@ -0,0 +1,11 @@
+egcs (970904-1) experimental; urgency=low
+
+  * New upstream snapshot
+
+ -- Galen Hazelwood <galenh@micron.net>  Sun,  7 Sep 1997 18:25:06 -0600
+
+egcs (ss-970814-1) experimental; urgency=low
+
+  * Initial packaging (of initial snapshot!)
+
+ -- Galen Hazelwood <galenh@micron.net>  Wed, 20 Aug 1997 00:36:28 +0000

