Gentoo Archives: gentoo-commits

From: "Ulrich Müller" <ulm@g.o>
To: gentoo-commits@l.g.o
Subject: [gentoo-commits] repo/gentoo:master commit in: eclass/tests/, eclass/
Date: Tue, 26 Sep 2017 18:46:37
Message-Id: 1506451587.7175c90c8c4bc1332899dffa6b5fa7a7b30ad2a4.ulm@gentoo
1 commit: 7175c90c8c4bc1332899dffa6b5fa7a7b30ad2a4
2 Author: Ulrich Müller <ulm <AT> gentoo <DOT> org>
3 AuthorDate: Sat Sep 23 08:58:43 2017 +0000
4 Commit: Ulrich Müller <ulm <AT> gentoo <DOT> org>
5 CommitDate: Tue Sep 26 18:46:27 2017 +0000
6 URL: https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=7175c90c
7
8 eapi7-ver.eclass: Use lexicographic rather than arithmetic comparison.
9
10 This removes the 2**63-1 limit for integer components.
11
12 eclass/eapi7-ver.eclass | 36 ++++++++++++++++++++++++++----------
13 eclass/tests/eapi7-ver.sh | 2 +-
14 2 files changed, 27 insertions(+), 11 deletions(-)
15
16 diff --git a/eclass/eapi7-ver.eclass b/eclass/eapi7-ver.eclass
17 index 5ca8b8143af..7eb070c6817 100644
18 --- a/eclass/eapi7-ver.eclass
19 +++ b/eclass/eapi7-ver.eclass
20 @@ -174,6 +174,28 @@ ver_rs() {
21 echo "${comp[*]}"
22 }
23
24 +# @FUNCTION: _ver_compare_int
25 +# @USAGE: <a> <b>
26 +# @RETURN: 0 if <a> -eq <b>, 1 if <a> -lt <b>, 3 if <a> -gt <b>
27 +# @INTERNAL
28 +# @DESCRIPTION:
29 +# Compare two non-negative integers <a> and <b>, of arbitrary length.
30 +# If <a> is equal to, less than, or greater than <b>, return 0, 1, or 3
31 +# as exit status, respectively.
32 +_ver_compare_int() {
33 + local a=$1 b=$2 d=$(( ${#1}-${#2} ))
34 +
35 + # Zero-pad to equal length if necessary.
36 + if [[ ${d} -gt 0 ]]; then
37 + printf -v b "%0${d}d%s" 0 "${b}"
38 + elif [[ ${d} -lt 0 ]]; then
39 + printf -v a "%0$(( -d ))d%s" 0 "${a}"
40 + fi
41 +
42 + [[ ${a} > ${b} ]] && return 3
43 + [[ ${a} == "${b}" ]]
44 +}
45 +
46 # @FUNCTION: _ver_compare
47 # @USAGE: <va> <vb>
48 # @RETURN: 1 if <va> < <vb>, 2 if <va> = <vb>, 3 if <va> > <vb>
49 @@ -200,10 +222,7 @@ _ver_compare() {
50
51 # Compare numeric components (PMS algorithm 3.2)
52 # First component
53 - a=${an%%.*}
54 - b=${bn%%.*}
55 - [[ 10#${a} -gt 10#${b} ]] && return 3
56 - [[ 10#${a} -lt 10#${b} ]] && return 1
57 + _ver_compare_int "${an%%.*}" "${bn%%.*}" || return
58
59 while [[ ${an} == *.* && ${bn} == *.* ]]; do
60 # Other components (PMS algorithm 3.3)
61 @@ -218,8 +237,7 @@ _ver_compare() {
62 [[ ${a} > ${b} ]] && return 3
63 [[ ${a} < ${b} ]] && return 1
64 else
65 - [[ ${a} -gt ${b} ]] && return 3
66 - [[ ${a} -lt ${b} ]] && return 1
67 + _ver_compare_int "${a}" "${b}" || return
68 fi
69 done
70 [[ ${an} == *.* ]] && return 3
71 @@ -237,8 +255,7 @@ _ver_compare() {
72 a=${as%%_*}
73 b=${bs%%_*}
74 if [[ ${a%%[0-9]*} == "${b%%[0-9]*}" ]]; then
75 - [[ 10#${a##*[a-z]} -gt 10#${b##*[a-z]} ]] && return 3
76 - [[ 10#${a##*[a-z]} -lt 10#${b##*[a-z]} ]] && return 1
77 + _ver_compare_int "${a##*[a-z]}" "${b##*[a-z]}" || return
78 else
79 # Check for p first
80 [[ ${a%%[0-9]*} == p ]] && return 3
81 @@ -256,8 +273,7 @@ _ver_compare() {
82 fi
83
84 # Compare revision components (PMS algorithm 3.7)
85 - [[ 10#${ar#-r} -gt 10#${br#-r} ]] && return 3
86 - [[ 10#${ar#-r} -lt 10#${br#-r} ]] && return 1
87 + _ver_compare_int "${ar#-r}" "${br#-r}" || return
88
89 return 2
90 }
91
92 diff --git a/eclass/tests/eapi7-ver.sh b/eclass/tests/eapi7-ver.sh
93 index fd085a415b6..d4aa4fdbd28 100755
94 --- a/eclass/tests/eapi7-ver.sh
95 +++ b/eclass/tests/eapi7-ver.sh
96 @@ -150,7 +150,7 @@ teqr 0 ver_test 1.010 -eq 1.01
97 teqr 0 ver_test 1.01 -lt 1.1
98 teqr 0 ver_test 1.2_pre08-r09 -eq 1.2_pre8-r9
99 teqr 0 ver_test 0 -lt 576460752303423488 # 2**59
100 -#teqr 0 ver_test 0 -lt 9223372036854775808 # 2**63 fails, integer rollover
101 +teqr 0 ver_test 0 -lt 9223372036854775808 # 2**63
102
103 # Bad number or ordering of arguments
104 txf ver_test 1