summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichał Górny <mgorny@gentoo.org>2020-03-17 11:37:02 +0100
committerMichał Górny <mgorny@gentoo.org>2020-08-07 12:39:56 +0200
commit639e36f7af044be17849c1067a8cd9f831df9095 (patch)
tree3d463e514bc5881c65b7b13d36a49d7a2f339b4e
parentpackage.mask: Last rite app-i18n/sunpinyin & revdeps (diff)
downloadgentoo-639e36f7af044be17849c1067a8cd9f831df9095.tar.gz
gentoo-639e36f7af044be17849c1067a8cd9f831df9095.tar.bz2
gentoo-639e36f7af044be17849c1067a8cd9f831df9095.zip
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@gentoo.org>
-rw-r--r--eclass/python-r1.eclass6
-rw-r--r--eclass/python-single-r1.eclass4
-rw-r--r--eclass/python-utils-r1.eclass34
3 files changed, 44 insertions, 0 deletions
diff --git a/eclass/python-r1.eclass b/eclass/python-r1.eclass
index 8c3ff5b08095..40944684ec8b 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 6fedc7cdf4e0..dc032379cd84 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 9bad72a77e98..87cb662c64fd 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: