commit:     94b98bb0d11bfda14193cdb9c01c4c10d6e6f7ba
Author:     Kent Fredric <kentfredric <AT> gmail <DOT> com>
AuthorDate: Sun Jun 21 00:14:19 2015 +0000
Commit:     Kent Fredric <kentfredric <AT> gmail <DOT> com>
CommitDate: Sun Jun 21 00:23:28 2015 +0000
URL:        https://gitweb.gentoo.org/proj/perl-overlay.git/commit/?id=94b98bb0

[eclass] Add perl-version.eclass which can turn normalised forms into floats

 eclass/perl-version.eclass | 91 ++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 91 insertions(+)

diff --git a/eclass/perl-version.eclass b/eclass/perl-version.eclass
new file mode 100644
index 0000000..97022e2
--- /dev/null
+++ b/eclass/perl-version.eclass
@@ -0,0 +1,91 @@
+# Copyright 1999-2015 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Header: $
+
+# @ECLASS: perl-versions.eclass
+# @MAINTAINER:
+# p...@gentoo.org
+# Kent Fredric <ken...@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
+}
+

Reply via email to