From c6c756d5594b107fea7712fe6b377d77abfc6ef2 Mon Sep 17 00:00:00 2001 From: Raphael Hertzog Date: Tue, 11 Dec 2007 10:46:08 +0100 Subject: [PATCH] Dpkg::Deps: tweak the comparison algorithm to sort > lower than < * scripts/Dpkg/Deps.pm: Add a compare function that compares dependencies more intelligently than a comparison on their string representation. In particular we want >= and >> to sort lower than << and <= so that intervals are nicely displayed as "a (>= 1), a (<< 2)" instead of the ugly "a (<< 2), a (>= 1)". --- ChangeLog | 8 ++++++++ debian/changelog | 3 +++ scripts/Dpkg/Deps.pm | 46 ++++++++++++++++++++++++++++++++++++++++---- 3 files changed, 53 insertions(+), 4 deletions(-) diff --git a/ChangeLog b/ChangeLog index 2b703d51..93b1463f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2007-12-11 Raphael Hertzog + + * scripts/Dpkg/Deps.pm: Add a compare function that compares + dependencies more intelligently than a comparison on their + string representation. In particular we want >= and >> to sort + lower than << and <= so that intervals are nicely displayed + as "a (>= 1), a (<< 2)" instead of the ugly "a (<< 2), a (>= 1)". + 2007-12-10 Raphael Hertzog * README.translators: Explain how to format Git commit messages. diff --git a/debian/changelog b/debian/changelog index ed45efb7..a562d497 100644 --- a/debian/changelog +++ b/debian/changelog @@ -26,6 +26,9 @@ dpkg (1.14.13) UNRELEASED; urgency=low -lm. Closes: #454616 * Included files in symbols files (via #include) do no more need to repeat the header line. Closes: #455260 + * Tweak the sort algorithm between dependencies so that intervals + are displayed as "a (>= 1), a (<< 2)" instead of the opposite. + Closes: #455520 [ Updated man pages translations ] * Swedish (Peter Karlsson) diff --git a/scripts/Dpkg/Deps.pm b/scripts/Dpkg/Deps.pm index 3b5ca3af..4ceceb5f 100644 --- a/scripts/Dpkg/Deps.pm +++ b/scripts/Dpkg/Deps.pm @@ -74,7 +74,8 @@ use Dpkg::ErrorHandling qw(warning); use Dpkg::Gettext; our @ISA = qw(Exporter); -our @EXPORT_OK = qw(@pkg_dep_fields @src_dep_fields %dep_field_type); +our @EXPORT_OK = qw(@pkg_dep_fields @src_dep_fields %dep_field_type + %relation_ordering); # Some generic variables our @pkg_dep_fields = qw(Pre-Depends Depends Recommends Suggests Enhances @@ -97,6 +98,15 @@ our %dep_field_type = ( 'Build-Conflicts-Indep' => 'union', ); +our %relation_ordering = ( + 'undef' => 0, + '>=' => 1, + '>>' => 2, + '=' => 3, + '<<' => 4, + '<=' => 5, +); + # Some factorized function =item Dpkg::Deps::arch_is_superset(\@p, \@q) @@ -285,8 +295,6 @@ this when parsing non-dependency fields like Conflicts (see =back -=back - =cut sub parse { my $dep_line = shift; @@ -331,6 +339,36 @@ sub parse { return $dep_and; } +=item Dpkg::Deps::compare($a, $b) + +This functions is used to order AND and Union dependencies prior to +dumping. + +=back + +=cut +sub compare { + my ($a, $b) = @_; + return -1 if $a->is_empty(); + return 1 if $b->is_empty(); + while ($a->isa('Dpkg::Deps::Multiple')) { + return -1 if $a->is_empty(); + my @deps = $a->get_deps(); + $a = $deps[0]; + } + while ($b->isa('Dpkg::Deps::Multiple')) { + return 1 if $b->is_empty(); + my @deps = $b->get_deps(); + $b = $deps[0]; + } + my $ar = defined($a->{relation}) ? $a->{relation} : "undef"; + my $br = defined($b->{relation}) ? $b->{relation} : "undef"; + return (($a->{package} cmp $b->{package}) || + ($relation_ordering{$ar} <=> $relation_ordering{$br}) || + ($a->{version} cmp $b->{version})); +} + + package Dpkg::Deps::Simple; =head1 OBJECTS - Dpkg::Deps::* @@ -762,7 +800,7 @@ sub get_deps { sub sort { my $self = shift; my @res = (); - @res = sort { $a->dump() cmp $b->dump() } @{$self->{list}}; + @res = sort { Dpkg::Deps::compare($a, $b) } @{$self->{list}}; $self->{list} = [ @res ]; } -- 2.39.5