Skip to content

Commit 6eaa3c2

Browse files
committed
Fix broken Windows zipapp
Signed-off-by: Bernát Gábor <[email protected]>
1 parent 228b615 commit 6eaa3c2

File tree

6 files changed

+47
-59
lines changed

6 files changed

+47
-59
lines changed

docs/changelog/2783.bugfix.rst

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
Upgrade embedded wheels:
2+
3+
* setuptools to ``75.2.0`` from ``75.1.0``

pyproject.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,7 @@ lint.ignore = [
132132
"S104", # Possible binding to all interfaces
133133
"S404", # Using subprocess is alright
134134
"S603", # subprocess calls are fine
135+
"PLW1510", # no need for check for subprocess
135136
]
136137
lint.per-file-ignores."src/virtualenv/activation/python/activate_this.py" = [
137138
"F821", # ignore undefined template string placeholders

src/virtualenv/seed/wheels/embed/__init__.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,37 +13,37 @@
1313
},
1414
"3.8": {
1515
"pip": "pip-24.2-py3-none-any.whl",
16-
"setuptools": "setuptools-75.1.0-py3-none-any.whl",
16+
"setuptools": "setuptools-75.2.0-py3-none-any.whl",
1717
"wheel": "wheel-0.44.0-py3-none-any.whl",
1818
},
1919
"3.9": {
2020
"pip": "pip-24.2-py3-none-any.whl",
21-
"setuptools": "setuptools-75.1.0-py3-none-any.whl",
21+
"setuptools": "setuptools-75.2.0-py3-none-any.whl",
2222
"wheel": "wheel-0.44.0-py3-none-any.whl",
2323
},
2424
"3.10": {
2525
"pip": "pip-24.2-py3-none-any.whl",
26-
"setuptools": "setuptools-75.1.0-py3-none-any.whl",
26+
"setuptools": "setuptools-75.2.0-py3-none-any.whl",
2727
"wheel": "wheel-0.44.0-py3-none-any.whl",
2828
},
2929
"3.11": {
3030
"pip": "pip-24.2-py3-none-any.whl",
31-
"setuptools": "setuptools-75.1.0-py3-none-any.whl",
31+
"setuptools": "setuptools-75.2.0-py3-none-any.whl",
3232
"wheel": "wheel-0.44.0-py3-none-any.whl",
3333
},
3434
"3.12": {
3535
"pip": "pip-24.2-py3-none-any.whl",
36-
"setuptools": "setuptools-75.1.0-py3-none-any.whl",
36+
"setuptools": "setuptools-75.2.0-py3-none-any.whl",
3737
"wheel": "wheel-0.44.0-py3-none-any.whl",
3838
},
3939
"3.13": {
4040
"pip": "pip-24.2-py3-none-any.whl",
41-
"setuptools": "setuptools-75.1.0-py3-none-any.whl",
41+
"setuptools": "setuptools-75.2.0-py3-none-any.whl",
4242
"wheel": "wheel-0.44.0-py3-none-any.whl",
4343
},
4444
"3.14": {
4545
"pip": "pip-24.2-py3-none-any.whl",
46-
"setuptools": "setuptools-75.1.0-py3-none-any.whl",
46+
"setuptools": "setuptools-75.2.0-py3-none-any.whl",
4747
"wheel": "wheel-0.44.0-py3-none-any.whl",
4848
},
4949
}

tasks/__main__zipapp.py

Lines changed: 33 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,10 @@
44
import os
55
import sys
66
import zipfile
7+
from importlib.abc import SourceLoader
8+
from importlib.util import spec_from_file_location
79

810
ABS_HERE = os.path.abspath(os.path.dirname(__file__))
9-
NEW_IMPORT_SYSTEM = sys.version_info[0] >= 3 # noqa: PLR2004
1011

1112

1213
class VersionPlatformSelect:
@@ -69,18 +70,34 @@ def _register_distutils_finder(self):
6970
if "distlib" not in self.modules:
7071
return
7172

73+
class Resource:
74+
def __init__(self, content) -> None:
75+
self.bytes = content
76+
self.is_container = False
77+
7278
class DistlibFinder:
7379
def __init__(self, path, loader) -> None:
7480
self.path = path
7581
self.loader = loader
7682

7783
def find(self, name):
78-
class Resource:
79-
def __init__(self, content) -> None:
80-
self.bytes = content
81-
82-
full_path = os.path.join(self.path, name)
83-
return Resource(self.loader.get_data(full_path))
84+
return Resource(self.loader.get_data(os.path.join(self.path, name)))
85+
86+
def iterator(self, resource_name):
87+
resource = self.find(resource_name)
88+
if resource is not None:
89+
todo = [resource]
90+
while todo:
91+
resource = todo.pop(0)
92+
yield resource
93+
if resource.is_container:
94+
rname = resource.name
95+
for name in resource.resources:
96+
child = self.find(f"{rname}/{name}" if rname else name)
97+
if child.is_container:
98+
todo.append(child)
99+
else:
100+
yield child
84101

85102
from distlib.resources import register_finder # noqa: PLC0415
86103

@@ -113,41 +130,15 @@ def locate_file(self, path):
113130
return _VER_DISTRIBUTION_CLASS
114131

115132

116-
if NEW_IMPORT_SYSTEM:
117-
from importlib.abc import SourceLoader
118-
from importlib.util import spec_from_file_location
119-
120-
class VersionedFindLoad(VersionPlatformSelect, SourceLoader):
121-
def find_spec(self, fullname, path, target=None): # noqa: ARG002
122-
zip_path = self.find_mod(fullname)
123-
if zip_path is not None:
124-
return spec_from_file_location(name=fullname, loader=self)
125-
return None
126-
127-
def module_repr(self, module):
128-
raise NotImplementedError
129-
130-
else:
131-
from imp import new_module
132-
133-
class VersionedFindLoad(VersionPlatformSelect):
134-
def find_module(self, fullname, path=None): # noqa: ARG002
135-
return self if self.find_mod(fullname) else None
136-
137-
def load_module(self, fullname):
138-
filename = self.get_filename(fullname)
139-
code = self.get_data(filename)
140-
mod = sys.modules.setdefault(fullname, new_module(fullname))
141-
mod.__file__ = filename
142-
mod.__loader__ = self
143-
is_package = filename.endswith("__init__.py")
144-
if is_package:
145-
mod.__path__ = [os.path.dirname(filename)]
146-
mod.__package__ = fullname
147-
else:
148-
mod.__package__ = fullname.rpartition(".")[0]
149-
exec(code, mod.__dict__) # noqa: S102
150-
return mod
133+
class VersionedFindLoad(VersionPlatformSelect, SourceLoader):
134+
def find_spec(self, fullname, path, target=None): # noqa: ARG002
135+
zip_path = self.find_mod(fullname)
136+
if zip_path is not None:
137+
return spec_from_file_location(name=fullname, loader=self)
138+
return None
139+
140+
def module_repr(self, module):
141+
raise NotImplementedError
151142

152143

153144
def run():

tasks/upgrade_wheels.py

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,8 @@ def run(): # noqa: C901
6666

6767
added = collect_package_versions(new_packages)
6868
removed = collect_package_versions(remove_packages)
69-
7069
outcome = (1 if STRICT else 0) if (added or removed) else 0
70+
print(f"Outcome {outcome} added {added} removed {removed}") # noqa: T201
7171
lines = ["Upgrade embedded wheels:", ""]
7272
for key, versions in added.items():
7373
text = f"* {key} to {fmt_version(versions)}"
@@ -119,15 +119,8 @@ def get_embed_wheel(distribution, for_py_version):
119119
)
120120
dest_target = DEST / "__init__.py"
121121
dest_target.write_text(msg, encoding="utf-8")
122-
123-
subprocess.run(
124-
[sys.executable, "-m", "ruff", "check", str(dest_target), "--fix", "--unsafe-fixes"],
125-
check=False,
126-
)
127-
subprocess.run(
128-
[sys.executable, "-m", "ruff", "format", str(dest_target), "--preview"],
129-
check=False,
130-
)
122+
subprocess.run([sys.executable, "-m", "ruff", "format", str(dest_target), "--preview"])
123+
subprocess.run([sys.executable, "-m", "ruff", "check", str(dest_target), "--fix", "--unsafe-fixes"])
131124

132125
raise SystemExit(outcome)
133126

0 commit comments

Comments
 (0)