From db38453a54c592098a59684ccfb8b87a91da9bc5 Mon Sep 17 00:00:00 2001 From: emil User Date: Tue, 14 Jul 2026 12:34:35 +0000 Subject: [PATCH] DEVX-139: fix: URL-encode package names and versions in clean_images API calls --- src/devx/tools/clean_images.py | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/devx/tools/clean_images.py b/src/devx/tools/clean_images.py index b7dec61..05ef755 100644 --- a/src/devx/tools/clean_images.py +++ b/src/devx/tools/clean_images.py @@ -5,6 +5,13 @@ Queries the Gitea API for all versions of a package (container type) and deletes all but the most recent N versions. The ``latest`` tag is always preserved if present. +.. note:: + This tool only deletes package versions via the Gitea API. The underlying + blob files on the Gitea server's filesystem are NOT removed by this tool + (Gitea 1.26.x has no built-in garbage collection). The production VM's + daily cleanup script (``cleanup_gitea.py``) handles filesystem blob GC + by querying the database for referenced blobs and removing orphaned files. + Usage:: # Clean up ci-base images, keep last 2 versions @@ -57,7 +64,10 @@ def list_package_versions( Returns a list of version dicts, each containing at least ``version`` and ``created_at`` fields. """ - url = f"{api_url}/packages/{owner}?type=container&name={name}" + from urllib.parse import quote + + encoded_name = quote(name, safe="") + url = f"{api_url}/packages/{owner}?type=container&name={encoded_name}" headers = {"Authorization": f"token {token}"} all_versions: list[dict[str, Any]] = [] page = 1 @@ -96,7 +106,11 @@ def delete_package_version( Returns True on success, False on failure. """ - url = f"{api_url}/packages/{owner}/{package_type}/{name}/{version}" + from urllib.parse import quote + + encoded_name = quote(name, safe="") + encoded_version = quote(version, safe="") + url = f"{api_url}/packages/{owner}/{package_type}/{encoded_name}/{encoded_version}" headers = {"Authorization": f"token {token}"} for attempt in range(max_retries): try: