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: