commit: 99cc42fbfa03d6c79fa003b8f490f99e29615f8b
Author: Michał Górny <mgorny <AT> gentoo <DOT> org>
AuthorDate: Thu Sep 21 06:57:19 2017 +0000
Commit: Michał Górny <mgorny <AT> gentoo <DOT> org>
CommitDate: Thu Sep 21 07:04:28 2017 +0000
URL: https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=99cc42fb
eapi7-ver.eclass: Verify input for ver_test
eclass/eapi7-ver.eclass | 78 +++++++++++++++++++++++++++++++++++++++++++++++
eclass/tests/eapi7-ver.sh | 18 +++++------
2 files changed, 87 insertions(+), 9 deletions(-)
diff --git a/eclass/eapi7-ver.eclass b/eclass/eapi7-ver.eclass
index e833835a56e..94184c484b0 100644
--- a/eclass/eapi7-ver.eclass
+++ b/eclass/eapi7-ver.eclass
@@ -176,6 +176,81 @@ ver_rs() {
echo "${comp[*]}"
}
+# @FUNCTION: _ver_validate
+# @USAGE: <comp[0]>...
+# @DESCRIPTION:
+# Verify that the version component array passed as the argument
+# validates according to the PMS version rules. Returns 0 if it does,
+# 1 otherwise.
+_ver_validate() {
+ local prev=start
+
+ while [[ ${1} || ${2} ]]; do
+ local s=${1}
+ local c=${2}
+
+ if [[ -z ${s} ]]; then
+ if [[ ${c} == [0-9]* ]]; then
+ # number without preceding sep may be either:
+ case ${prev} in
+ # a. 1st version number
+ start) prev=numeric;;
+ # b. _foo suffix number
+ suffix) prev=suffix_num;;
+ # c. -rN revision number
+ revision) prev=revision_num;;
+ *) return 1;;
+ esac
+ elif [[ -n ${c} ]]; then
+ # letter without preceding sep = letter after
version
+ [[ ${prev} == numeric ]] || return 1
+ [[ ${#c} -eq 1 ]] || return 1
+ prev=letter
+ fi
+ elif [[ -z ${c} ]]; then
+ # trailing suffix?
+ return 1
+ elif [[ ${s} == . ]]; then
+ # number preceded by dot = numeric component
+ [[ ${prev} == numeric ]] || return 1
+ elif [[ ${s} == _ ]]; then
+ # _ implies _foo suffix
+ case ${prev} in
+ numeric|letter|suffix|suffix_num) ;;
+ *) return 1;;
+ esac
+
+ case ${c} in
+ alpha) ;;
+ beta) ;;
+ rc) ;;
+ pre) ;;
+ p) ;;
+ *) return 1;;
+ esac
+ prev=suffix
+ elif [[ ${s} == - ]]; then
+ # - implies revision
+ case ${prev} in
+ numeric|letter|suffix|suffix_num) ;;
+ *) return 1;;
+ esac
+
+ [[ ${c} == r ]] || return 1
+ prev=revision
+ else
+ return 1
+ fi
+
+ shift 2
+ done
+
+ # empty version string?
+ [[ ${prev} != start ]] || return 1
+
+ return 0
+}
+
# @FUNCTION: ver_test
# @USAGE: [<v1>] <op> <v2>
# @DESCRIPTION:
@@ -216,6 +291,9 @@ ver_test() {
compb=( "${comp[@]}" )
_ver_split "${va}"
+ _ver_validate "${comp[@]}" || die "${FUNCNAME}: invalid version: ${va}"
+ _ver_validate "${compb[@]}" || die "${FUNCNAME}: invalid version: ${vb}"
+
local i sa sb ca cb wa wb result=0
for (( i = 0;; i += 2 )); do
sa=${comp[i]}
diff --git a/eclass/tests/eapi7-ver.sh b/eclass/tests/eapi7-ver.sh
index 1ad99a246e1..144bb2bddc3 100755
--- a/eclass/tests/eapi7-ver.sh
+++ b/eclass/tests/eapi7-ver.sh
@@ -161,12 +161,12 @@ txf ver_test 1 lt 2
txf ver_test 1 -foo 2
# Malformed versions
-#txf ver_test "" -ne 1
-#txf ver_test 1. -ne 1
-#txf ver_test 1ab -ne 1
-#txf ver_test b -ne 1
-#txf ver_test 1-r1_pre -ne 1
-#txf ver_test 1-pre1 -ne 1
-#txf ver_test 1_foo -ne 1
-#txf ver_test 1_pre1.1 -ne 1
-#txf ver_test 1-r1.0 -ne 1
+txf ver_test "" -ne 1
+txf ver_test 1. -ne 1
+txf ver_test 1ab -ne 1
+txf ver_test b -ne 1
+txf ver_test 1-r1_pre -ne 1
+txf ver_test 1-pre1 -ne 1
+txf ver_test 1_foo -ne 1
+txf ver_test 1_pre1.1 -ne 1
+txf ver_test 1-r1.0 -ne 1