distutils-r1.eclass: Warn if *-nspkg.pth files are installed
authorMichał Górny <mgorny@gentoo.org>
Fri, 5 May 2017 21:08:37 +0000 (23:08 +0200)
committerMichał Górny <mgorny@gentoo.org>
Tue, 16 May 2017 17:11:29 +0000 (19:11 +0200)
Add a check for *-nspkg.pth files indicating implicit setuptools
namespace hack. While they kept namespaces somewhat working without
requiring explicit support in ebuilds, they were unreliable. They
frequently required additional hacks (distutils_install_for_testing) to
get the tests working, and they have proven even more broken for Python
3.5+.

For this reason, those files were deprecated in favor of proper,
explicit namespace support. If they are found to exist, the developer
should ensure to remove them to avoid issues.

eclass/distutils-r1.eclass

index 3be67bbf2a210108a2adf122da48d8b035a0ad1b..5df7234332d3f8e62e830de919244f150e8a9813 100644 (file)
@@ -789,6 +789,33 @@ distutils-r1_src_test() {
        fi
 }
 
+# @FUNCTION: _distutils-r1_check_namespace_pth
+# @INTERNAL
+# @DESCRIPTION:
+# Check if any *-nspkg.pth files were installed (by setuptools)
+# and warn about the policy non-conformance if they were.
+_distutils-r1_check_namespace_pth() {
+       local f pth=()
+
+       while IFS= read -r -d '' f; do
+               pth+=( "${f}" )
+       done < <(find "${ED}" -name '*-nspkg.pth' -print0)
+
+       if [[ ${pth[@]} ]]; then
+               ewarn "The following *-nspkg.pth files were found installed:"
+               ewarn
+               for f in "${pth[@]}"; do
+                       ewarn "  ${f#${ED%/}}"
+               done
+               ewarn
+               ewarn "The presence of those files may break namespaces in Python 3.5+. Please"
+               ewarn "read our documentation on reliable handling of namespaces and update"
+               ewarn "the ebuild accordingly:"
+               ewarn
+               ewarn "  https://wiki.gentoo.org/wiki/Project:Python/Namespace_packages"
+       fi
+}
+
 distutils-r1_src_install() {
        debug-print-function ${FUNCNAME} "${@}"
 
@@ -812,6 +839,8 @@ distutils-r1_src_install() {
 
                "${cmd}" "QA: python_install_all() didn't call distutils-r1_python_install_all"
        fi
+
+       _distutils-r1_check_namespace_pth
 }
 
 # -- distutils.eclass functions --