Skip to content

Commit a801103

Browse files
committed
fix: .metadata file is actually METADATA, and core_metadata sha is of that
1 parent 69f4a1d commit a801103

File tree

3 files changed

+19
-10
lines changed

3 files changed

+19
-10
lines changed

.github/workflows/build.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ jobs:
6767
with:
6868
path: dist
6969
- run: python3 -um make_index --rebuild --pypi-url https://pypi.devinfra.sentry.io --dest index
70-
- run: tree index
70+
- run: cat index/simple/dumb-pypi/index.html
7171

7272
# - uses: google-github-actions/auth@ba79af03959ebeac9769e648f473a284504d9193 # v2.1.10
7373
# with:

make_index.py

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,14 +31,18 @@ def _make_info(filename: str) -> dict[str, Any]:
3131
with open(filename, "rb") as f:
3232
sha256 = hashlib.sha256(f.read()).hexdigest()
3333

34+
metadata_bytes = b""
35+
3436
with zipfile.ZipFile(filename) as zipf:
3537
(metadata,) = (
3638
name
3739
for name in zipf.namelist()
3840
if name.endswith(".dist-info/METADATA") and name.count("/") == 1
3941
)
4042
with zipf.open(metadata) as f:
41-
info = email.message_from_binary_file(f)
43+
metadata_bytes = f.read()
44+
metadata_sha256 = hashlib.sha256(metadata_bytes).hexdigest()
45+
info = email.message_from_bytes(metadata_bytes)
4246

4347
dist_info = {
4448
"requires_dist": info.get_all("requires-dist"),
@@ -48,7 +52,8 @@ def _make_info(filename: str) -> dict[str, Any]:
4852
return {
4953
"filename": os.path.basename(filename),
5054
"hash": f"sha256={sha256}",
51-
"core_metadata": f"sha256={sha256}",
55+
"core_metadata": f"sha256={metadata_sha256}",
56+
"_metadata": metadata_bytes,
5257
"upload_timestamp": t,
5358
"uploaded_by": f"git@{h}",
5459
**{k: v for k, v in dist_info.items() if v},
@@ -93,11 +98,14 @@ def main(argv: Sequence[str] | None = None) -> int:
9398

9499
seen.add(basename)
95100
package_info = _make_info(filename)
101+
102+
metadata_data = package_info.pop("_metadata")
103+
96104
new_packages.append(package_info)
97105
shutil.copy(filename, wheels_dir)
98106

99-
with open(f"{wheels_dir}/{basename}.metadata", "w") as f:
100-
f.write(package_info["core_metadata"])
107+
with open(f"{wheels_dir}/{basename}.metadata", "wb") as f:
108+
f.write(metadata_data)
101109

102110
with tempfile.TemporaryDirectory() as tmpdir:
103111
prev_json = os.path.join(tmpdir, "previous.json")

tests/make_index_test.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ def test_make_info_empty_wheel_metadata(tmp_path):
3131
assert ret == {
3232
"filename": "a-1-py3-none-any.whl",
3333
"hash": "sha256=64f7f4664408d711c17ad28c1d3ba7dd155501e67c8632fafc8a525ba3ebc527",
34-
"core_metadata": "sha256=64f7f4664408d711c17ad28c1d3ba7dd155501e67c8632fafc8a525ba3ebc527",
34+
"core_metadata": "sha256=d4528dc2d072c0e6d65addae8b5700fd29253b9eb9a9214aba539447d6f29fae",
3535
"upload_timestamp": mock.ANY,
3636
"uploaded_by": re_assert.Matches(r"^git@[a-f0-9]{7}"),
3737
}
@@ -58,7 +58,7 @@ def test_make_info_full_wheel_metadata(tmp_path):
5858
"jsonschema",
5959
"packaging (==21.3) ; extra = 'p'",
6060
],
61-
"core_metadata": "sha256=4e6da08b56614db68d4139aca043731c1fed51496ef168b5be2c67737dfe9f9a",
61+
"core_metadata": "sha256=a015186125a83e6667547b156f8c6813e72fbab48c4ae635ac3c3a5f1d86aa9f",
6262
"requires_python": ">= 3.7, != 3.7.0",
6363
"upload_timestamp": mock.ANY,
6464
"uploaded_by": re_assert.Matches(r"^git@[a-f0-9]{7}"),
@@ -86,17 +86,18 @@ def test_main_new_package(tmp_path):
8686
assert dest.joinpath("packages.json").exists()
8787
assert dest.joinpath(f"wheels/{wheel_name}").exists()
8888

89-
sha = "64f7f4664408d711c17ad28c1d3ba7dd155501e67c8632fafc8a525ba3ebc527"
89+
wheel_sha = "64f7f4664408d711c17ad28c1d3ba7dd155501e67c8632fafc8a525ba3ebc527"
90+
metadata_sha = "d4528dc2d072c0e6d65addae8b5700fd29253b9eb9a9214aba539447d6f29fae"
9091

9192
with open(dest.joinpath("simple/a/index.html")) as f:
9293
index_html = re.sub(r"\s+", " ", f.read())
9394
assert (
94-
f'<a href="http://example.com/wheels/{wheel_name}#sha256={sha}" data-core-metadata="sha256={sha}" >a-1-py3-none-any.whl</a>'
95+
f'<a href="http://example.com/wheels/{wheel_name}#sha256={wheel_sha}" data-core-metadata="sha256={metadata_sha}" >a-1-py3-none-any.whl</a>'
9596
in index_html
9697
)
9798

9899
with open(dest.joinpath(f"wheels/{wheel_name}.metadata")) as f:
99-
assert f.read() == f"sha256={sha}"
100+
assert f.read() == "Name: a\nVersion: 1\n"
100101

101102

102103
def test_main_multiple_provide_same_package_first_wins(tmp_path):

0 commit comments

Comments
 (0)