commit:     cf582a6d842973915d1cec5c05a8b4c311b78288
Author:     Michał Górny <mgorny <AT> gentoo <DOT> org>
AuthorDate: Sat Aug  5 06:59:39 2023 +0000
Commit:     Michał Górny <mgorny <AT> gentoo <DOT> org>
CommitDate: Sun Aug  6 06:42:27 2023 +0000
URL:        https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=cf582a6d

python-utils-r1.eclass: Check for occluded packages before testing

Add a check for installed packages being occluded by the working
directory when calling epytest and eunittest.  This is primarily meant
to detect C extensions being missed.

Signed-off-by: Michał Górny <mgorny <AT> gentoo.org>
Closes: https://github.com/gentoo/gentoo/pull/32181
Signed-off-by: Michał Górny <mgorny <AT> gentoo.org>

 eclass/python-utils-r1.eclass | 51 +++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 51 insertions(+)

diff --git a/eclass/python-utils-r1.eclass b/eclass/python-utils-r1.eclass
index 2555ce12d066..27157a003ab2 100644
--- a/eclass/python-utils-r1.eclass
+++ b/eclass/python-utils-r1.eclass
@@ -1231,6 +1231,55 @@ _python_check_EPYTHON() {
        fi
 }
 
+# @FUNCTION: _python_check_occluded_packages
+# @INTERNAL
+# @DESCRIPTION:
+# Check if the current directory does not contain any incomplete
+# package sources that would block installed packages from being used
+# (and effectively e.g. make it impossible to load compiled extensions).
+_python_check_occluded_packages() {
+       debug-print-function ${FUNCNAME} "${@}"
+
+       # DO NOT ENABLE THIS unless you're going to check for false
+       # positives before filing bugs.
+       [[ ! ${PYTHON_EXPERIMENTAL_QA} ]] && return
+
+       type -P diff &>/dev/null || return
+       [[ -z ${BUILD_DIR} || ! -d ${BUILD_DIR}/install ]] && return
+
+       local sitedir="${BUILD_DIR}/install$(python_get_sitedir)"
+       # avoid unnecessarily checking if we are inside install dir
+       [[ ${sitedir} -ef . ]] && return
+
+       local f fn diff
+       for f in "${sitedir}"/*/; do
+               f=${f%/}
+               fn=${f##*/}
+
+               # skip metadata directories
+               [[ ${fn} == *.dist-info || ${fn} == *.egg-info ]] && continue
+
+               if [[ -d ${fn} ]]; then
+                       diff=$(diff -dupr -x "__pycache__" "${fn}" 
"${sitedir}/${fn}")
+                       if [[ -n ${diff} ]]; then
+                               eqawarn "The directory ${fn} occludes package 
installed for ${EPYTHON}."
+                               echo
+                               echo ">>> Diff:"
+                               echo "${diff}"
+                               echo "<<< End-of-diff"
+                               echo
+
+                               if [[ ! ${_PYTHON_WARNED_OCCLUDED_PACKAGES} ]]; 
then
+                                       eqawarn "The complete build log 
includes diffs."
+                                       eqawarn "For more information on 
occluded packages, please see:"
+                                       eqawarn 
"https://projects.gentoo.org/python/guide/test.html#importerrors-for-c-extensions";
+                                       _PYTHON_WARNED_OCCLUDED_PACKAGES=1
+                               fi
+                       fi
+               fi
+       done
+}
+
 # @VARIABLE: EPYTEST_DESELECT
 # @DEFAULT_UNSET
 # @DESCRIPTION:
@@ -1261,6 +1310,7 @@ epytest() {
        debug-print-function ${FUNCNAME} "${@}"
 
        _python_check_EPYTHON
+       _python_check_occluded_packages
 
        local color
        case ${NOCOLOR} in
@@ -1345,6 +1395,7 @@ eunittest() {
        debug-print-function ${FUNCNAME} "${@}"
 
        _python_check_EPYTHON
+       _python_check_occluded_packages
 
        # unittest fails with "no tests" correctly since Python 3.12
        local runner=unittest

Reply via email to