python3: Ensure stale empty python module directories don't break the build

There are two issues inside importlib. Firstly, the modules are accessed in
on disk order. This means behaviour seen on one system might not reproduce
on another and is a real headache.

Secondly, empty directories left behind by previous modules might be looked
at. This has caused a long string of different issues for us.

As a result, patch this to a behaviour which works for us. Upstream discussion
can follow later, this is breaking builds for too many people to leave unpatched.

[YOCTO #14816]

(From OE-Core rev: e5944a38db513e033c3a3e9313267055f7254be7)

Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
Richard Purdie
2022-05-27 17:05:44 +01:00
parent 14256b7670
commit 012f2db86b
2 changed files with 33 additions and 0 deletions

View File

@@ -0,0 +1,32 @@
There are two issues here. Firstly, the modules are accessed in on disk order. This
means behaviour seen on one system might not reproduce on another and is a real headache.
Secondly, empty directories left behind by previous modules might be looked at. This
has caused a long string of different issues for us.
As a result, patch this to a behaviour which works for us.
Upstream-Status: Pending [need to talk to upstream to see if they'll take one or both fixes]
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Index: Python-3.10.4/Lib/importlib/metadata/__init__.py
===================================================================
--- Python-3.10.4.orig/Lib/importlib/metadata/__init__.py
+++ Python-3.10.4/Lib/importlib/metadata/__init__.py
@@ -819,7 +819,14 @@ class Lookup:
self.infos = FreezableDefaultDict(list)
self.eggs = FreezableDefaultDict(list)
- for child in path.children():
+ for child in sorted(path.children()):
+ childpath = pathlib.Path(path.root, child)
+ try:
+ if childpath.is_dir() and not any(childpath.iterdir()):
+ # Empty directories aren't interesting
+ continue
+ except PermissionError:
+ continue
low = child.lower()
if low.endswith((".dist-info", ".egg-info")):
# rpartition is faster than splitext and suitable for this purpose.