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 1d3ee5a  Add automatic descriptions to all revisions
1d3ee5a is described below

commit 1d3ee5a0eeb4846c63bca1088bcf5ec11ba5dd31
Author: Sean B. Palmer <[email protected]>
AuthorDate: Thu May 15 19:47:55 2025 +0100

    Add automatic descriptions to all revisions
---
 atr/revision.py                       |  8 ++++++--
 atr/routes/draft.py                   | 12 ++++++++----
 atr/routes/finish.py                  |  3 ++-
 atr/routes/keys.py                    |  3 ++-
 atr/routes/revisions.py               |  3 ++-
 atr/routes/start.py                   |  3 ++-
 atr/routes/upload.py                  |  4 +++-
 atr/ssh.py                            |  3 ++-
 atr/tasks/svn.py                      |  5 ++++-
 atr/templates/revisions-selected.html |  8 +++++++-
 10 files changed, 38 insertions(+), 14 deletions(-)

diff --git a/atr/revision.py b/atr/revision.py
index 374051b..e733d6d 100644
--- a/atr/revision.py
+++ b/atr/revision.py
@@ -34,7 +34,11 @@ _LOGGER: Final = logging.getLogger(__name__)
 
 @contextlib.asynccontextmanager
 async def create_and_manage(
-    project_name: str, version_name: str, asf_uid: str, create_directory: bool 
= True
+    project_name: str,
+    version_name: str,
+    asf_uid: str,
+    create_directory: bool = True,
+    description: str | None = None,
 ) -> AsyncGenerator[tuple[pathlib.Path, str]]:
     """Manage the creation and symlinking of a mutable release revision."""
     base_dir = util.get_unfinished_dir()
@@ -62,7 +66,7 @@ async def create_and_manage(
             # parent_name is automatically computed in an event listener
             # parent is automatically computed in an event listener
             child=None,
-            description=None,
+            description=description,
         )
         data.add(new_revision)
         await data.commit()
diff --git a/atr/routes/draft.py b/atr/routes/draft.py
index 4b7d3c7..9a25431 100644
--- a/atr/routes/draft.py
+++ b/atr/routes/draft.py
@@ -140,7 +140,8 @@ async def delete_file(session: routes.CommitterSession, 
project_name: str, versi
     metadata_files_deleted = 0
 
     try:
-        async with revision.create_and_manage(project_name, version_name, 
session.uid) as (
+        description = "File deletion through web interface"
+        async with revision.create_and_manage(project_name, version_name, 
session.uid, description=description) as (
             new_revision_dir,
             new_revision_number,
         ):
@@ -195,7 +196,8 @@ async def fresh(session: routes.CommitterSession, 
project_name: str, version_nam
     # Restart checks by creating a new identical draft revision
     # This doesn't make sense unless the checks themselves have been updated
     # Therefore we only show the button for this to admins
-    async with revision.create_and_manage(project_name, version_name, 
session.uid) as (
+    description = "Empty revision to restart all checks for the whole release 
candidate draft"
+    async with revision.create_and_manage(project_name, version_name, 
session.uid, description=description) as (
         _new_revision_dir,
         _new_revision_number,
     ):
@@ -227,7 +229,8 @@ async def hashgen(
     rel_path = pathlib.Path(file_path)
 
     try:
-        async with revision.create_and_manage(project_name, version_name, 
session.uid) as (
+        description = "Hash generation through web interface"
+        async with revision.create_and_manage(project_name, version_name, 
session.uid, description=description) as (
             new_revision_dir,
             new_revision_number,
         ):
@@ -285,7 +288,8 @@ async def sbomgen(
         raise base.ASFQuartException("SBOM generation is only supported for 
.tar.gz files", errorcode=400)
 
     try:
-        async with revision.create_and_manage(project_name, version_name, 
session.uid) as (
+        description = "SBOM generation through web interface"
+        async with revision.create_and_manage(project_name, version_name, 
session.uid, description=description) as (
             new_revision_dir,
             new_revision_number,
         ):
diff --git a/atr/routes/finish.py b/atr/routes/finish.py
index 7303f77..1f27269 100644
--- a/atr/routes/finish.py
+++ b/atr/routes/finish.py
@@ -109,7 +109,8 @@ async def _move_file(
         target_dir_rel = pathlib.Path(form.target_directory.data)
 
         try:
-            async with revision.create_and_manage(project_name, version_name, 
session.uid) as (
+            description = "File move through web interface"
+            async with revision.create_and_manage(project_name, version_name, 
session.uid, description=description) as (
                 new_revision_dir,
                 new_revision_number,
             ):
diff --git a/atr/routes/keys.py b/atr/routes/keys.py
index 5a564a1..0393c3c 100644
--- a/atr/routes/keys.py
+++ b/atr/routes/keys.py
@@ -189,7 +189,8 @@ async def import_selected_revision(
         message += f" failed to upload {error_count} keys for {', 
'.join(submitted_committees)}"
     # Remove the KEYS file if 100% imported
     if (success_count > 0) and (error_count == 0):
-        async with revision.create_and_manage(project_name, version_name, 
session.uid) as (
+        description = "Removed KEYS file after successful import through web 
interface"
+        async with revision.create_and_manage(project_name, version_name, 
session.uid, description=description) as (
             new_revision_dir,
             _new_revision_number,
         ):
diff --git a/atr/routes/revisions.py b/atr/routes/revisions.py
index a8926b3..014c533 100644
--- a/atr/routes/revisions.py
+++ b/atr/routes/revisions.py
@@ -115,7 +115,8 @@ async def selected_post(session: routes.CommitterSession, 
project_name: str, ver
                 f"Revision {selected_revision_number} is not a preview 
revision", errorcode=400
             )
 
-    async with revision.create_and_manage(project_name, version_name, 
session.uid) as (
+    description = f"Copy of revision {selected_revision_number} through web 
interface"
+    async with revision.create_and_manage(project_name, version_name, 
session.uid, description=description) as (
         new_revision_dir,
         new_revision_number,
     ):
diff --git a/atr/routes/start.py b/atr/routes/start.py
index 89d40c6..307fcd8 100644
--- a/atr/routes/start.py
+++ b/atr/routes/start.py
@@ -92,7 +92,8 @@ async def create_release_draft(project_name: str, version: 
str, asf_uid: str) ->
 
         await data.refresh(release)
 
-    async with revision.create_and_manage(project_name, version, asf_uid) as (
+    description = "Creation of empty release candidate draft through web 
interface"
+    async with revision.create_and_manage(project_name, version, asf_uid, 
description=description) as (
         _new_revision_dir,
         _new_revision_number,
     ):
diff --git a/atr/routes/upload.py b/atr/routes/upload.py
index 6a60291..cdbd7c2 100644
--- a/atr/routes/upload.py
+++ b/atr/routes/upload.py
@@ -135,7 +135,9 @@ async def _upload_files(
     files: Sequence[datastructures.FileStorage],
 ) -> int:
     """Process and save the uploaded files into a new draft revision."""
-    async with revision.create_and_manage(project_name, version_name, asf_uid) 
as (
+    number_of_files = len(files)
+    description = f"Upload of {number_of_files} file{'' if number_of_files == 
1 else 's'} through web interface"
+    async with revision.create_and_manage(project_name, version_name, asf_uid, 
description=description) as (
         new_revision_dir,
         _new_revision_number,
     ):
diff --git a/atr/ssh.py b/atr/ssh.py
index 81d5e7d..ba68196 100644
--- a/atr/ssh.py
+++ b/atr/ssh.py
@@ -483,7 +483,8 @@ async def _step_07b_process_validated_rsync_write(
             return
 
         # Create the draft revision directory structure
-        async with revision.create_and_manage(project_name, version_name, 
asf_uid) as (
+        description = "File synchronisation through ssh, using rsync"
+        async with revision.create_and_manage(project_name, version_name, 
asf_uid, description=description) as (
             new_revision_dir,
             new_revision,
         ):
diff --git a/atr/tasks/svn.py b/atr/tasks/svn.py
index 2710beb..1d8e2bf 100644
--- a/atr/tasks/svn.py
+++ b/atr/tasks/svn.py
@@ -69,7 +69,10 @@ async def _import_files_core(args: SvnImport) -> str:
     # We have to use a temporary directory otherwise SVN thinks it's a pegged 
revision
     temp_export_dir_name = ".svn-export.tmp"
 
-    async with revision.create_and_manage(args.project_name, 
args.version_name, args.asf_uid) as (
+    description = "Import of files from subversion"
+    async with revision.create_and_manage(
+        args.project_name, args.version_name, args.asf_uid, 
description=description
+    ) as (
         new_revision_dir,
         new_revision_number,
     ):
diff --git a/atr/templates/revisions-selected.html 
b/atr/templates/revisions-selected.html
index 3be8dc9..be448ac 100644
--- a/atr/templates/revisions-selected.html
+++ b/atr/templates/revisions-selected.html
@@ -62,9 +62,15 @@
           </span>
         </div>
         <div class="card-body">
+          {% if revision.description %}
+            <p class="mb-2">
+              <strong><!-- Description: -->{{ revision.description }}</strong>
+            </p>
+          {% endif %}
           {% if revision.parent %}
             <p class="small text-muted mb-2">
-              Changes from parent revision: <a href="#{{ 
revision.parent.number }}">{{ revision.parent.number }}</a>
+              Changes from <a href="#{{ revision.parent.number }}"
+    title="Revision {{ revision.parent.number }}">previous revision</a>:
             </p>
           {% else %}
             <p class="small text-muted mb-2">Initial revision</p>


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

Reply via email to