summaryrefslogtreecommitdiff
blob: 0a76c5beade025324898779f912192cbd3b093db (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
# Copyright 1999-2015 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2

# @ECLASS: perl-versions.eclass
# @MAINTAINER:
# perl@gentoo.org
# Kent Fredric <kentnl@cpan.org>
# @BLURB: Perl versioning functions
# @DESCRIPTION:
# The perl-version eclass contains an assortment of functions for denormalizing versions
# in order to streamline version bumps and minimise risk of accidental failure to update
# MODULE_VERSION and unify all the ways of turning arbitrary normalised versions back into
# a form used upstream.

# expand-tail 5 => 005
# expand-tail 5.5 => 005005
perl-version-expand-tail() {
	local tail=$1
	if [ -z "${tail}" ]; then
		echo '000';
		return;
	fi
	# Tail with no segments
	if [ "${tail%%.*}" = "${tail}" ]; then
		printf "%03d" "$tail"
		return;
	fi
	local head="${tail%%.*}"
	local rest=$( perl-version-expand-tail "${tail#*.}" )
	printf "%03d%s" $head $rest;
	return;
}

# float 5.1   => 5.001
# float 5.10  => 5.010
# float 5.100 => 5.100
# float 5.1.1 => 5.001001
perl-version-float() {
	local version=$1
	local major=${version%%.*}
	local tail=${version#*.}
	if [ "$tail" = "$version" ]; then
		tail=000;
	else
		tail=$( perl-version-expand-tail "${tail}" )
	fi
	printf "%s.%s" "$major" "$tail";
	return;
}

# float_n 5.201.505.200 8 => 5.20150520
perl-version-float_n() {
	local version=$1
	local mantissa=$2
	local major=${version%%.*}
	if [ "$mantissa" -lt 1 ]; then
		printf "%s" $major;
		return;
	fi
	local tail=${version#*.}
	if [ "$tail" = "$version" ]; then
		tail=000;
	else
		tail=$( perl-version-expand-tail "${tail}" )
	fi
	if [ "${#tail}" -lt $mantissa ]; then
		local pad=$(( $mantissa - ${#tail} ));
		printf "%s.%s%0${pad}d" "${major}" "${tail}" 0
		return
	fi
	printf "%s.%s" "${major}" "${tail:0:$mantissa}"
}

# denormalize 5.201.505.200 float_n 8 => 5.20150520
perl-version-denormalize() {
	local version=$1;
	local scheme=$2;
	shift
	shift
	case "${scheme}" in
		"float_n")
			perl-version-float_n $version "$@"
			return
			;;
		*)
			die "Unknown version scheme ${scheme}"
			;;
	esac
}