4 # Copyright 2003, 2004 Frank Lichtenheld <frank@lichtenheld.de>
6 # This program is free software; you can redistribute it and/or modify
7 # it under the terms of the GNU General Public License as published by
8 # the Free Software Foundation; either version 2 of the License, or
9 # (at your option) any later version.
11 # This program is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 # GNU General Public License for more details.
16 # You should have received a copy of the GNU General Public License
17 # along with this program; if not, write to the Free Software
18 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
23 Deb::Versions - compare Versions of Debian packages
29 my $res = version_cmp( "1:0.2.2-2woody1", "1:0.2.3-7" );
31 my @sorted = version_sort( "1:0.2.2-2woody1", "1:0.2.3-7", "2:0.1.1" );
35 This module allows you to compare version numbers like defined
36 in the Debian policy, section 5.6.11 (L<SEE ALSO>).
38 It provides two functions:
44 version_cmp() gets two version strings as parameters and returns
45 -1, if the first is lower than the second, 0 if equal, 1 if greater.
46 You can use this function as first parameter for the sort() function.
50 version_sort() is just an usefull abbrevation for
52 sort { version_cmp( $b, $a ) } @_;
58 By default, Deb::Versions exports version_cmp() and version_sort().
62 package Deb::Versions;
68 our @ISA = qw( Exporter );
69 our @EXPORT = qw( version_cmp version_sort suites_cmp suites_sort );
71 our $VERSION = v1.0.0;
73 my $re = qr/^(?:(\d+):)?([\w.+:~-]+?)(?:-([\w+.~]+))?$/;
75 return 0 if $_[0] eq $_[1];
76 my ( $ver1, $ver2 ) = @_;
78 my ( $e1, $e2, $u1, $u2, $d1, $d2 );
80 ( $e1, $u1, $d1 ) = ( $1, $2, $3 );
83 cluck "This seems not to be a valid version number:"
88 ( $e2, $u2, $d2 ) = ( $1, $2, $3 );
91 cluck "This seems not to be a valid version number:"
96 # warn "D: <$e1><$u1><$d1> <=> <$e2><$u2><$d2>\n";
98 my $res = ($e1 <=> $e2);
100 $res = _cmp_part ( $u1, $u2 );
102 $res = _cmp_part ( $d1, $d2 );
106 *version_cmp = \&version_cmp_pp;
108 require AptPkg::Config;
109 require AptPkg::System;
110 require AptPkg::Version;
112 $AptPkg::Config::_config->init;
113 $AptPkg::System::_system = $AptPkg::Config::_config->system;
114 my $apt_ver = $AptPkg::System::_system->versioning;
115 *version_cmp = sub { return $apt_ver->compare(@_) };
119 return sort { version_cmp( $b, $a ) } @_;
123 my ( $v1, $v2 ) = @_;
126 while ( $v1 || $v2 ) {
131 # warn "$sp1 cmp $sp2 = "._lcmp( $sp1,$sp2)."\n";
132 if ( $r = _lcmp( $sp1, $sp2 ) ) {
139 # warn "$np1 <=> $np2 = ".($np1 <=> $np2)."\n";
140 if ( $r = ($np1 <=> $np2) ) {
152 my ( $v1, $v2 ) = @_;
154 for ( my $i = 0; $i <= length( $v1 ); $i++ ) {
155 my ( $n1, $n2 ) = ( ord( substr( $v1, $i, 1 ) ),
156 ord( substr( $v2, $i, 1 ) ) );
157 $n1 += 256 if $n1 && $n1 < 65; # letters sort earlier than non-letters
158 $n1 = -1 if $n1 == 126; # '~' sorts earlier than everything else
159 $n2 += 256 if $n2 && $n2 < 65;
160 $n2 = -1 if $n2 == 126;
161 if ( my $r = ($n1 <=> $n2) ) {
165 return length( $v1 ) <=> length( $v2 );
168 our @SUITES_SORT = qw( woody
172 stable stable-proposed-updates
174 testing testing-proposed-updates
176 sid unstable experimental
177 warty hoary breezy dapper edgy feisty gutsy hardy intrepid jaunty);
178 our @ARCHIVE_SORT = qw( non-US security updates volatile backports );
179 our @PRIORITY_SORT = qw( required important standard optional extra );
181 our %suites_sort = map { $_ => ($i-=10) } @SUITES_SORT;
182 our %priority_sort = map { $_ => $i-- } @PRIORITY_SORT;
184 our %archive_sort = map { $_ => $i++ } @ARCHIVE_SORT;
187 my ($s_a, $s_b) = @_;
188 my $cmp_a = $suites_sort{$s_a};
190 $cmp_a = $suites_sort{$1} - $archive_sort{$2}
191 if $s_a =~ m;^(.+?)[/-](.*)$;o;
193 my $cmp_b = $suites_sort{$s_b};
195 $cmp_b = $suites_sort{$1} - $archive_sort{$2}
196 if $s_b =~ m;^(.+?)[/-](.*)$;o;
198 return ($cmp_b <=> $cmp_a);
202 return sort { suites_cmp( $a, $b ) } @_;
206 return ($priority_sort{$_[0]} <=> $priority_sort{$_[1]});
210 return sort { priority_cmp( $b, $a ) } @_;
219 Copyright 2003, 2004 Frank Lichtenheld <frank@lichtenheld.de>
221 This file is distributed under the terms of the GNU Public
222 License, Version 2. See the source code for more details.
226 Debian policy <URL:http://www.debian.org/doc/debian-policy/>