source: trunk/essentials/sys-devel/automake-1.10/lib/Automake/Version.pm

Last change on this file was 3147, checked in by bird, 18 years ago

automake 1.10

File size: 4.3 KB
Line 
1# Copyright (C) 2001, 2002, 2003 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, write to the Free Software
15# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
16# 02110-1301, USA.
17
18package Automake::Version;
19use strict;
20use Automake::ChannelDefs;
21
22=head1 NAME
23
24Automake::Version - version comparison
25
26=head1 SYNOPSIS
27
28 use Automake::Version;
29
30 print "Version $version is older than required version $required\n"
31 if Automake::Version::check ($version, $required);
32
33=head1 DESCRIPTION
34
35This module provides support for comparing versions string
36as they are used in Automake.
37
38A version is a string that looks like
39C<MAJOR.MINOR[.MICRO][ALPHA][-FORK]> where C<MAJOR>, C<MINOR>, and
40C<MICRO> are digits, C<ALPHA> is a character, and C<FORK> any
41alphanumeric word.
42
43Usually, C<ALPHA> is used to label alpha releases or intermediate
44snapshots, C<FORK> is used for CVS branches or patched releases, and
45C<MICRO> is used for bug fixes releases on the C<MAJOR.MINOR> branch.
46
47For the purpose of ordering, C<1.4> is the same as C<1.4.0>, but
48C<1.4g> is the same as C<1.4.99g>. The C<FORK> identifier is ignored
49in the ordering, except when it looks like C<-pMINOR[ALPHA]>: some
50versions were labeled like C<1.4-p3a>, this is the same as an alpha
51release labeled C<1.4.3a>. Yes, it's horrible, but Automake did not
52support two-dot versions in the past.
53
54=head2 FUNCTIONS
55
56=over 4
57
58=item C<split ($version)>
59
60Split the string C<$version> into the corresponding C<(MAJOR, MINOR,
61MICRO, ALPHA, FORK)> tuple. For instance C<'1.4g'> would be split
62into C<(1, 4, 99, 'g', '')>. Return C<()> on error.
63
64=cut
65
66sub split ($)
67{
68 my ($ver) = @_;
69
70 # Special case for versions like 1.4-p2a.
71 if ($ver =~ /^(\d+)\.(\d+)(?:-p(\d+)([a-z]+)?)$/)
72 {
73 return ($1, $2, $3, $4 || '', '');
74 }
75 # Common case.
76 elsif ($ver =~ /^(\d+)\.(\d+)(?:\.(\d+))?([a-z])?(?:-([A-Za-z0-9]+))?$/)
77 {
78 return ($1, $2, $3 || (defined $4 ? 99 : 0), $4 || '', $5 || '');
79 }
80 return ();
81}
82
83=item C<compare (\@LVERSION, \@RVERSION)>
84
85Compare two version tuples, as returned by C<split>.
86
87Return 1, 0, or -1, if C<LVERSION> is found to be respectively
88greater than, equal to, or less than C<RVERSION>.
89
90=cut
91
92sub compare (\@\@)
93{
94 my @l = @{$_[0]};
95 my @r = @{$_[1]};
96
97 for my $i (0, 1, 2)
98 {
99 return 1 if ($l[$i] > $r[$i]);
100 return -1 if ($l[$i] < $r[$i]);
101 }
102 for my $i (3, 4)
103 {
104 return 1 if ($l[$i] gt $r[$i]);
105 return -1 if ($l[$i] lt $r[$i]);
106 }
107 return 0;
108}
109
110=item C<check($VERSION, $REQUIRED)>
111
112Handles the logic of requiring a version number in Automake.
113C<$VERSION> should be Automake's version, while C<$REQUIRED>
114is the version required by the user input.
115
116Return 0 if the required version is satisfied, 1 otherwise.
117
118=cut
119
120sub check ($$)
121{
122 my ($version, $required) = @_;
123 my @version = Automake::Version::split ($version);
124 my @required = Automake::Version::split ($required);
125
126 prog_error "version is incorrect: $version"
127 if $#version == -1;
128
129 # This should not happen, because process_option_list and split_version
130 # use similar regexes.
131 prog_error "required version is incorrect: $required"
132 if $#required == -1;
133
134 # If we require 3.4n-foo then we require something
135 # >= 3.4n, with the `foo' fork identifier.
136 return 1
137 if ($required[4] ne '' && $required[4] ne $version[4]);
138
139 return 0 > compare (@version, @required);
140}
141
1421;
143
144### Setup "GNU" style for perl-mode and cperl-mode.
145## Local Variables:
146## perl-indent-level: 2
147## perl-continued-statement-offset: 2
148## perl-continued-brace-offset: 0
149## perl-brace-offset: 0
150## perl-brace-imaginary-offset: 0
151## perl-label-offset: -2
152## cperl-indent-level: 2
153## cperl-brace-offset: 0
154## cperl-continued-brace-offset: 0
155## cperl-label-offset: -2
156## cperl-extra-newline-before-brace: t
157## cperl-merge-trailing-else: nil
158## cperl-continued-statement-offset: 2
159## End:
Note: See TracBrowser for help on using the repository browser.