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]