fix(forgejo-package-prune): correct version enumeration + network robustness
Forgejo has no per-package /versions endpoint — the list endpoint returns one entry per (name, version). build_delete_plans now groups list results by name instead of calling a 404ing /versions sub-path. Removed dead list_versions/_paginate. Added retry + longer timeout to _api_request for slow/large registry listings (container list was timing out). Updated fixture test to the grouped model. Dry-run now clean: 29 candidate deletions across 5 container packages, 0 errors (was 53× HTTP 404). ACTIVITY-WP-0020 T02 fix; enable/apply still gated on protection-coverage review (T05). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
parent
20bf3d5942
commit
6f7ca31a6d
2 changed files with 43 additions and 73 deletions
|
|
@ -37,24 +37,25 @@ image:
|
|||
|
||||
def test_build_delete_plans_respects_depth_and_protection(self) -> None:
|
||||
protected = {("container", "vergabe-teilnahme", "old-prod")}
|
||||
versions = [
|
||||
{"version": "v4", "created_at": "2026-07-12T10:00:00Z"},
|
||||
{"version": "v3", "created_at": "2026-07-11T10:00:00Z"},
|
||||
{"version": "v2", "created_at": "2026-07-10T10:00:00Z"},
|
||||
{"version": "v1", "created_at": "2026-07-09T10:00:00Z"},
|
||||
{"version": "old-prod", "created_at": "2026-07-08T10:00:00Z"},
|
||||
# Forgejo's package list endpoint returns one entry per (name, version);
|
||||
# build_delete_plans groups these by name (no separate /versions call).
|
||||
packages = [
|
||||
{"name": "vergabe-teilnahme", "version": "v4", "created_at": "2026-07-12T10:00:00Z"},
|
||||
{"name": "vergabe-teilnahme", "version": "v3", "created_at": "2026-07-11T10:00:00Z"},
|
||||
{"name": "vergabe-teilnahme", "version": "v2", "created_at": "2026-07-10T10:00:00Z"},
|
||||
{"name": "vergabe-teilnahme", "version": "v1", "created_at": "2026-07-09T10:00:00Z"},
|
||||
{"name": "vergabe-teilnahme", "version": "old-prod", "created_at": "2026-07-08T10:00:00Z"},
|
||||
]
|
||||
|
||||
with mock.patch.object(prune, "list_packages", return_value=[{"name": "vergabe-teilnahme"}]):
|
||||
with mock.patch.object(prune, "list_versions", return_value=versions):
|
||||
plans, errors = prune.build_delete_plans(
|
||||
base_url="https://forgejo.example",
|
||||
token="token",
|
||||
owner="coulomb",
|
||||
package_types=["container"],
|
||||
max_versions=3,
|
||||
protected=protected,
|
||||
)
|
||||
with mock.patch.object(prune, "list_packages", return_value=packages):
|
||||
plans, errors = prune.build_delete_plans(
|
||||
base_url="https://forgejo.example",
|
||||
token="token",
|
||||
owner="coulomb",
|
||||
package_types=["container"],
|
||||
max_versions=3,
|
||||
protected=protected,
|
||||
)
|
||||
|
||||
self.assertEqual(errors, [])
|
||||
deletable = {(p.name, p.version) for p in plans if not p.protected}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue