commit:     639e36f7af044be17849c1067a8cd9f831df9095
Author:     Michał Górny <mgorny <AT> gentoo <DOT> org>
AuthorDate: Tue Mar 17 10:37:02 2020 +0000
Commit:     Michał Górny <mgorny <AT> gentoo <DOT> org>
CommitDate: Fri Aug  7 10:39:56 2020 +0000
URL:        https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=639e36f7

python*-r1.eclass: Check for invalid impl patterns

Check for invalid implementation patterns passed to python_gen*
functions, python_setup, etc.  Currently the functions silently ignore
pattern mismatches which is fine for patterns matching historical
implementations but also hides errors in patterns.

After this change, each pattern must match at least one current or
historical implementation.  If no match is found, the function dies
indicating developer's mistake.

Signed-off-by: Michał Górny <mgorny <AT> gentoo.org>

 eclass/python-r1.eclass        |  6 ++++++
 eclass/python-single-r1.eclass |  4 ++++
 eclass/python-utils-r1.eclass  | 34 ++++++++++++++++++++++++++++++++++
 3 files changed, 44 insertions(+)

diff --git a/eclass/python-r1.eclass b/eclass/python-r1.eclass
index 8c3ff5b0809..40944684ec8 100644
--- a/eclass/python-r1.eclass
+++ b/eclass/python-r1.eclass
@@ -297,6 +297,7 @@ _python_gen_usedep() {
 
        local impl matches=()
 
+       _python_verify_patterns "${@}"
        for impl in "${_PYTHON_SUPPORTED_IMPLS[@]}"; do
                if _python_impl_matches "${impl}" "${@}"; then
                        matches+=(
@@ -380,6 +381,7 @@ python_gen_useflags() {
 
        local impl matches=()
 
+       _python_verify_patterns "${@}"
        for impl in "${_PYTHON_SUPPORTED_IMPLS[@]}"; do
                if _python_impl_matches "${impl}" "${@}"; then
                        matches+=( "python_targets_${impl}" )
@@ -428,6 +430,7 @@ python_gen_cond_dep() {
        local dep=${1}
        shift
 
+       _python_verify_patterns "${@}"
        for impl in "${_PYTHON_SUPPORTED_IMPLS[@]}"; do
                if _python_impl_matches "${impl}" "${@}"; then
                        # substitute ${PYTHON_USEDEP} if used
@@ -486,6 +489,7 @@ python_gen_impl_dep() {
        local PYTHON_REQ_USE=${1}
        shift
 
+       _python_verify_patterns "${@}"
        for impl in "${_PYTHON_SUPPORTED_IMPLS[@]}"; do
                if _python_impl_matches "${impl}" "${@}"; then
                        local PYTHON_PKG_DEP
@@ -564,6 +568,7 @@ python_gen_any_dep() {
        shift
 
        local i PYTHON_PKG_DEP out=
+       _python_verify_patterns "${@}"
        for i in "${_PYTHON_SUPPORTED_IMPLS[@]}"; do
                if _python_impl_matches "${i}" "${@}"; then
                        local 
PYTHON_USEDEP="python_targets_${i}(-),python_single_target_${i}(+)"
@@ -751,6 +756,7 @@ python_setup() {
 
        # (reverse iteration -- newest impl first)
        local found
+       _python_verify_patterns "${@}"
        for (( i = ${#_PYTHON_SUPPORTED_IMPLS[@]} - 1; i >= 0; i-- )); do
                local impl=${_PYTHON_SUPPORTED_IMPLS[i]}
 

diff --git a/eclass/python-single-r1.eclass b/eclass/python-single-r1.eclass
index 6fedc7cdf4e..dc032379cd8 100644
--- a/eclass/python-single-r1.eclass
+++ b/eclass/python-single-r1.eclass
@@ -291,6 +291,7 @@ _python_gen_usedep() {
 
        local impl matches=()
 
+       _python_verify_patterns "${@}"
        for impl in "${_PYTHON_SUPPORTED_IMPLS[@]}"; do
                if _python_impl_matches "${impl}" "${@}"; then
                        matches+=(
@@ -333,6 +334,7 @@ python_gen_useflags() {
 
        local impl matches=()
 
+       _python_verify_patterns "${@}"
        for impl in "${_PYTHON_SUPPORTED_IMPLS[@]}"; do
                if _python_impl_matches "${impl}" "${@}"; then
                        matches+=( "python_single_target_${impl}" )
@@ -382,6 +384,7 @@ python_gen_cond_dep() {
        local dep=${1}
        shift
 
+       _python_verify_patterns "${@}"
        for impl in "${_PYTHON_SUPPORTED_IMPLS[@]}"; do
                if _python_impl_matches "${impl}" "${@}"; then
                        # substitute ${PYTHON_SINGLE_USEDEP} if used
@@ -445,6 +448,7 @@ python_gen_impl_dep() {
        local PYTHON_REQ_USE=${1}
        shift
 
+       _python_verify_patterns "${@}"
        for impl in "${_PYTHON_SUPPORTED_IMPLS[@]}"; do
                if _python_impl_matches "${impl}" "${@}"; then
                        local PYTHON_PKG_DEP

diff --git a/eclass/python-utils-r1.eclass b/eclass/python-utils-r1.eclass
index 9bad72a77e9..87cb662c64f 100644
--- a/eclass/python-utils-r1.eclass
+++ b/eclass/python-utils-r1.eclass
@@ -45,6 +45,18 @@ _PYTHON_ALL_IMPLS=(
 )
 readonly _PYTHON_ALL_IMPLS
 
+# @ECLASS-VARIABLE: _PYTHON_HISTORICAL_IMPLS
+# @INTERNAL
+# @DESCRIPTION:
+# All historical Python implementations that are no longer supported.
+_PYTHON_HISTORICAL_IMPLS=(
+       jython2_7
+       pypy pypy1_{8,9} pypy2_0
+       python2_{5,6}
+       python3_{1,2,3,4,5}
+)
+readonly _PYTHON_HISTORICAL_IMPLS
+
 # @ECLASS-VARIABLE: PYTHON_COMPAT_NO_STRICT
 # @INTERNAL
 # @DESCRIPTION:
@@ -89,6 +101,28 @@ _python_impl_supported() {
        esac
 }
 
+# @FUNCTION: _python_verify_patterns
+# @USAGE: <pattern>...
+# @INTERNAL
+# @DESCRIPTION:
+# Verify whether the patterns passed to the eclass function are correct
+# (i.e. can match any valid implementation).  Dies on wrong pattern.
+_python_verify_patterns() {
+       debug-print-function ${FUNCNAME} "${@}"
+
+       local impl pattern
+       for pattern; do
+               [[ ${pattern} == -[23] ]] && continue
+
+               for impl in "${_PYTHON_ALL_IMPLS[@]}" 
"${_PYTHON_HISTORICAL_IMPLS[@]}"
+               do
+                       [[ ${impl} == ${pattern/./_} ]] && continue 2
+               done
+
+               die "Invalid implementation pattern: ${pattern}"
+       done
+}
+
 # @FUNCTION: _python_set_impls
 # @INTERNAL
 # @DESCRIPTION:

Reply via email to