File: | /tmp/automake/lib/Automake/Version.pm |
Coverage: | 100.0% |
line | stmt | bran | cond | sub | pod | time | code |
---|---|---|---|---|---|---|---|
1 | # Copyright (C) 2001, 2002, 2003, 2010 Free Software Foundation, Inc. | ||||||
2 | |||||||
3 | # This program is free software; you can redistribute it and/or modify | ||||||
4 | # it under the terms of the GNU General Public License as published by | ||||||
5 | # the Free Software Foundation; either version 2, or (at your option) | ||||||
6 | # any later version. | ||||||
7 | |||||||
8 | # This program is distributed in the hope that it will be useful, | ||||||
9 | # but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
10 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||||||
11 | # GNU General Public License for more details. | ||||||
12 | |||||||
13 | # You should have received a copy of the GNU General Public License | ||||||
14 | # along with this program. If not, see <http://www.gnu.org/licenses/>. | ||||||
15 | |||||||
16 | package Automake::Version; | ||||||
17 | 1171 1171 1171 | 3393 1081 2973 | use strict; | ||||
18 | 1171 1171 1171 | 4037 1118 2811 | use Automake::ChannelDefs; | ||||
19 | |||||||
20 - 62 | =head1 NAME Automake::Version - version comparison =head1 SYNOPSIS use Automake::Version; print "Version $version is older than required version $required\n" if Automake::Version::check ($version, $required); =head1 DESCRIPTION This module provides support for comparing versions string as they are used in Automake. A version is a string that looks like C<MAJOR.MINOR[.MICRO][ALPHA][-FORK]> where C<MAJOR>, C<MINOR>, and C<MICRO> are digits, C<ALPHA> is a character, and C<FORK> any alphanumeric word. Usually, C<ALPHA> is used to label alpha releases or intermediate snapshots, C<FORK> is used for git branches or patched releases, and C<MICRO> is used for bug fixes releases on the C<MAJOR.MINOR> branch. For the purpose of ordering, C<1.4> is the same as C<1.4.0>, but C<1.4g> is the same as C<1.4.99g>. The C<FORK> identifier is ignored in the ordering, except when it looks like C<-pMINOR[ALPHA]>: some versions were labeled like C<1.4-p3a>, this is the same as an alpha release labeled C<1.4.3a>. Yes, it's horrible, but Automake did not support two-dot versions in the past. =head2 FUNCTIONS =over 4 =item C<split ($version)> Split the string C<$version> into the corresponding C<(MAJOR, MINOR, MICRO, ALPHA, FORK)> tuple. For instance C<'1.4g'> would be split into C<(1, 4, 99, 'g', '')>. Return C<()> on error. =cut | ||||||
63 | |||||||
64 | sub split ($) | ||||||
65 | { | ||||||
66 | 510 | 1 | 691 | my ($ver) = @_; | |||
67 | |||||||
68 | # Special case for versions like 1.4-p2a. | ||||||
69 | 510 | 2432 | if ($ver =~ /^(\d+)\.(\d+)(?:-p(\d+)([a-z]+)?)$/) | ||||
70 | { | ||||||
71 | 57 | 354 | return ($1, $2, $3, $4 || '', ''); | ||||
72 | } | ||||||
73 | # Common case. | ||||||
74 | elsif ($ver =~ /^(\d+)\.(\d+)(?:\.(\d+))?([a-z])?(?:-([A-Za-z0-9]+))?$/) | ||||||
75 | { | ||||||
76 | 421 | 5489 | return ($1, $2, $3 || (defined $4 ? 99 : 0), $4 || '', $5 || ''); | ||||
77 | } | ||||||
78 | 32 | 65 | return (); | ||||
79 | } | ||||||
80 | |||||||
81 - 88 | =item C<compare (\@LVERSION, \@RVERSION)> Compare two version tuples, as returned by C<split>. Return 1, 0, or -1, if C<LVERSION> is found to be respectively greater than, equal to, or less than C<RVERSION>. =cut | ||||||
89 | |||||||
90 | sub compare (\@\@) | ||||||
91 | { | ||||||
92 | 227 227 | 1 | 209 554 | my @l = @{$_[0]}; | |||
93 | 227 227 | 226 506 | my @r = @{$_[1]}; | ||||
94 | |||||||
95 | 227 | 364 | for my $i (0, 1, 2) | ||||
96 | { | ||||||
97 | 598 | 1448 | return 1 if ($l[$i] > $r[$i]); | ||||
98 | 521 | 1342 | return -1 if ($l[$i] < $r[$i]); | ||||
99 | } | ||||||
100 | 81 | 132 | for my $i (3, 4) | ||||
101 | { | ||||||
102 | 138 | 300 | return 1 if ($l[$i] gt $r[$i]); | ||||
103 | 130 | 335 | return -1 if ($l[$i] lt $r[$i]); | ||||
104 | } | ||||||
105 | 57 | 168 | return 0; | ||||
106 | } | ||||||
107 | |||||||
108 - 116 | =item C<check($VERSION, $REQUIRED)> Handles the logic of requiring a version number in Automake. C<$VERSION> should be Automake's version, while C<$REQUIRED> is the version required by the user input. Return 0 if the required version is satisfied, 1 otherwise. =cut | ||||||
117 | |||||||
118 | sub check ($$) | ||||||
119 | { | ||||||
120 | 127 | 1 | 224 | my ($version, $required) = @_; | |||
121 | 127 | 208 | my @version = Automake::Version::split ($version); | ||||
122 | 127 | 284 | my @required = Automake::Version::split ($required); | ||||
123 | |||||||
124 | 127 | 488 | prog_error "version is incorrect: $version" | ||||
125 | if $#version == -1; | ||||||
126 | |||||||
127 | # This should not happen, because process_option_list and split_version | ||||||
128 | # use similar regexes. | ||||||
129 | 123 | 279 | prog_error "required version is incorrect: $required" | ||||
130 | if $#required == -1; | ||||||
131 | |||||||
132 | # If we require 3.4n-foo then we require something | ||||||
133 | # >= 3.4n, with the `foo' fork identifier. | ||||||
134 | 119 | 366 | return 1 | ||||
135 | if ($required[4] ne '' && $required[4] ne $version[4]); | ||||||
136 | |||||||
137 | 111 | 250 | return 0 > compare (@version, @required); | ||||
138 | } | ||||||
139 | |||||||
140 | 1; | ||||||
141 | |||||||
142 | ### Setup "GNU" style for perl-mode and cperl-mode. | ||||||
143 | ## Local Variables: | ||||||
144 | ## perl-indent-level: 2 | ||||||
145 | ## perl-continued-statement-offset: 2 | ||||||
146 | ## perl-continued-brace-offset: 0 | ||||||
147 | ## perl-brace-offset: 0 | ||||||
148 | ## perl-brace-imaginary-offset: 0 | ||||||
149 | ## perl-label-offset: -2 | ||||||
150 | ## cperl-indent-level: 2 | ||||||
151 | ## cperl-brace-offset: 0 | ||||||
152 | ## cperl-continued-brace-offset: 0 | ||||||
153 | ## cperl-label-offset: -2 | ||||||
154 | ## cperl-extra-newline-before-brace: t | ||||||
155 | ## cperl-merge-trailing-else: nil | ||||||
156 | ## cperl-continued-statement-offset: 2 | ||||||
157 | ## End: |