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 |