Skip to content

Commit 9bab088

Browse files
Ronald Tseronaldtse
authored andcommitted
fix(assemble): support single-url entries (sha-verified download)
Index entries without a parts list (url + sha256 only) were assembled as empty artifacts, instant-failing every hf-publish run for them.
1 parent 2b3b984 commit 9bab088

2 files changed

Lines changed: 20 additions & 0 deletions

File tree

‎scripts/assemble_release.py‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ def _download(url: str, expected_sha: str, label: str) -> bytes:
2929
def assemble(entry: dict, out: Path, index_dir: Path | None = None) -> Path:
3030
parts = entry.get("parts") or []
3131
chunks: list[bytes] = []
32+
if not parts and entry.get("url"):
33+
chunks = [_download(entry["url"], entry.get("sha256", ""), entry["url"].rsplit("/", 1)[-1])]
3234
for p in parts:
3335
name = p["url"].rsplit("/", 1)[-1]
3436
chunks.append(_download(p["url"], p["sha256"], name))

‎tests/test_assemble_release.py‎

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,24 @@ def test_sha_mismatch_rejected(self):
5959
with self.assertRaisesRegex(ValueError, "sha256"):
6060
assemble(self._entry(base, self.bad_sha), out)
6161

62+
def test_single_url_entry_assembles_and_verifies(self):
63+
base = self._serve(_files_handler({"x-1.0.zip": self.whole}))
64+
d = tempfile.TemporaryDirectory()
65+
self.addCleanup(d.cleanup)
66+
out = Path(d.name) / "x.zip"
67+
entry = {"url": f"{base}/x-1.0.zip", "sha256": self.sha, "filename": "x-1.0.zip"}
68+
assemble(entry, out)
69+
self.assertEqual(out.read_bytes(), self.whole)
70+
71+
def test_single_url_entry_sha_mismatch_rejected(self):
72+
base = self._serve(_files_handler({"x-1.0.zip": self.whole}))
73+
d = tempfile.TemporaryDirectory()
74+
self.addCleanup(d.cleanup)
75+
out = Path(d.name) / "x.zip"
76+
entry = {"url": f"{base}/x-1.0.zip", "sha256": self.bad_sha, "filename": "x-1.0.zip"}
77+
with self.assertRaisesRegex(ValueError, "sha256"):
78+
assemble(entry, out)
79+
6280
def test_part_sha_mismatch_rejected(self):
6381
parts = {"x.part-00": b"X" * 1024, "x.part-01": PART_B}
6482
base = self._serve(_files_handler(parts))

0 commit comments

Comments
 (0)