This is an automated email from the ASF dual-hosted git repository.

sbp pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/tooling-trusted-release.git


The following commit(s) were added to refs/heads/main by this push:
     new 9ba0a14  Move the code to delete an empty directory to the release 
writer
9ba0a14 is described below

commit 9ba0a14141b9b59ff1a53fd83d1c0f68c10c914a
Author: Sean B. Palmer <[email protected]>
AuthorDate: Thu Sep 11 20:02:32 2025 +0100

    Move the code to delete an empty directory to the release writer
---
 atr/routes/finish.py           | 21 ++++++---------------
 atr/storage/writers/release.py | 17 +++++++++++++++++
 2 files changed, 23 insertions(+), 15 deletions(-)

diff --git a/atr/routes/finish.py b/atr/routes/finish.py
index 365815b..7f02784 100644
--- a/atr/routes/finish.py
+++ b/atr/routes/finish.py
@@ -38,6 +38,7 @@ import atr.revision as revision
 import atr.routes as routes
 import atr.routes.mapping as mapping
 import atr.routes.root as root
+import atr.storage as storage
 import atr.template as template
 import atr.util as util
 
@@ -264,25 +265,15 @@ async def _delete_empty_directory(
     respond: Respond,
 ) -> tuple[quart_response.Response, int] | response.Response:
     try:
-        description = f"Delete empty directory {dir_to_delete_rel} via web 
interface"
-        async with revision.create_and_manage(
-            project_name, version_name, session.uid, description=description
-        ) as creating:
-            path_to_remove = creating.interim_path / dir_to_delete_rel
-            
path_to_remove.resolve().relative_to(creating.interim_path.resolve())
-            if not await aiofiles.os.path.isdir(path_to_remove):
-                raise revision.FailedError(f"Path '{dir_to_delete_rel}' is not 
a directory.")
-            if await aiofiles.os.listdir(path_to_remove):
-                raise revision.FailedError(f"Directory '{dir_to_delete_rel}' 
is not empty.")
-            # TODO: Move to the storage interface
-            await aiofiles.os.rmdir(path_to_remove)
-
+        async with storage.write(session.uid) as write:
+            wacp = await write.as_project_committee_member(project_name)
+            created_error = await 
wacp.release.delete_empty_directory(project_name, version_name, 
dir_to_delete_rel)
     except Exception:
         log.exception(f"Unexpected error deleting directory 
{dir_to_delete_rel} for {project_name}/{version_name}")
         return await respond(500, "An unexpected error occurred.")
 
-    if creating.failed is not None:
-        return await respond(400, str(creating.failed))
+    if created_error is not None:
+        return await respond(400, created_error)
     return await respond(200, f"Deleted empty directory 
'{dir_to_delete_rel}'.")
 
 
diff --git a/atr/storage/writers/release.py b/atr/storage/writers/release.py
index 5c438ee..be0fb2f 100644
--- a/atr/storage/writers/release.py
+++ b/atr/storage/writers/release.py
@@ -92,6 +92,23 @@ class CommitteeParticipant(FoundationCommitter):
         ) as _creating:
             yield _creating
 
+    async def delete_empty_directory(
+        self, project_name: str, version_name: str, dir_to_delete_rel: 
pathlib.Path
+    ) -> str | None:
+        description = f"Delete empty directory {dir_to_delete_rel} via web 
interface"
+        async with self.create_and_manage_revision(project_name, version_name, 
description) as creating:
+            path_to_remove = creating.interim_path / dir_to_delete_rel
+            
path_to_remove.resolve().relative_to(creating.interim_path.resolve())
+            if not await aiofiles.os.path.isdir(path_to_remove):
+                raise revision.FailedError(f"Path '{dir_to_delete_rel}' is not 
a directory.")
+            if await aiofiles.os.listdir(path_to_remove):
+                raise revision.FailedError(f"Directory '{dir_to_delete_rel}' 
is not empty.")
+            # TODO: Move to the storage interface
+            await aiofiles.os.rmdir(path_to_remove)
+        if creating.failed is not None:
+            return str(creating.failed)
+        return None
+
     async def delete_file(self, project_name: str, version: str, 
rel_path_to_delete: pathlib.Path) -> int:
         metadata_files_deleted = 0
         description = "File deletion through web interface"


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to