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 92d71fe  Show revisions for release previews
92d71fe is described below

commit 92d71fe05ce2d20eee861d762b0bed9786de5fab
Author: Sean B. Palmer <[email protected]>
AuthorDate: Wed Apr 23 18:36:13 2025 +0100

    Show revisions for release previews
---
 atr/routes/draft.py                         | 46 ++++++++++++++++++++---------
 atr/templates/draft-revisions.html          | 35 +++++++++++++++-------
 atr/templates/preview-announce-release.html |  9 +++---
 atr/templates/preview-refine-release.html   | 20 ++++++++-----
 4 files changed, 74 insertions(+), 36 deletions(-)

diff --git a/atr/routes/draft.py b/atr/routes/draft.py
index b814baa..d27da8c 100644
--- a/atr/routes/draft.py
+++ b/atr/routes/draft.py
@@ -711,29 +711,37 @@ async def hashgen(
     )
 
 
[email protected]("/draft/revision/set/<project_name>/<version_name>", 
methods=["POST"])
[email protected]("/revision/set/<project_name>/<version_name>", 
methods=["POST"])
 async def revision_set(session: routes.CommitterSession, project_name: str, 
version_name: str) -> response.Response:
-    """Set a specific revision as the latest for a candidate draft."""
+    """Set a specific revision as the latest for a candidate draft or release 
preview."""
     await session.check_access(project_name)
     form_data = await quart.request.form
     revision_name = form_data.get("revision_name")
     if not revision_name:
         raise base.ASFQuartException("Missing revision name", errorcode=400)
 
-    release_dir = util.get_release_candidate_draft_dir() / project_name / 
version_name
-    target_revision_dir = release_dir / revision_name
-
-    # Check that the target revision directory exists
-    if not await aiofiles.os.path.isdir(target_revision_dir):
-        raise base.ASFQuartException("Target revision directory not found", 
errorcode=404)
-
     try:
         # Target must be relative for the symlink
         # TODO: We should probably log who is doing this, to create an audit 
trail
         async with db.session() as data:
-            release = await session.release(project_name, version_name, 
data=data)
+            try:
+                release = await session.release(project_name, version_name, 
data=data)
+                release_dir = util.get_release_candidate_draft_dir() / 
project_name / version_name
+            except base.ASFQuartException:
+                release = await session.release(
+                    project_name, version_name, 
phase=models.ReleasePhase.RELEASE_PREVIEW, data=data
+                )
+                release_dir = util.get_release_preview_dir() / project_name / 
version_name
+
+            # Check that the target revision directory exists
+            target_revision_dir = release_dir / revision_name
+            if not await aiofiles.os.path.isdir(target_revision_dir):
+                raise base.ASFQuartException("Target revision directory not 
found", errorcode=404)
+
             release.revision = revision_name
             await data.commit()
+    except base.ASFQuartException as e:
+        raise e
     except Exception as e:
         logging.exception("Error setting revision:")
         return await session.redirect(
@@ -753,11 +761,19 @@ async def revision_set(session: routes.CommitterSession, 
project_name: str, vers
 
 @routes.committer("/revisions/<project_name>/<version_name>")
 async def revisions(session: routes.CommitterSession, project_name: str, 
version_name: str) -> str:
-    """Show the revision history for a release candidate draft."""
+    """Show the revision history for a release candidate draft or release 
preview."""
+    # TODO: Move this to phase.py?
     await session.check_access(project_name)
-    release = await session.release(project_name, version_name)
 
-    release_dir = util.get_release_candidate_draft_dir() / project_name / 
version_name
+    try:
+        release = await session.release(project_name, version_name)
+        release_dir = util.get_release_candidate_draft_dir() / project_name / 
version_name
+        phase_key = "draft"
+    except base.ASFQuartException:
+        release = await session.release(project_name, version_name, 
phase=models.ReleasePhase.RELEASE_PREVIEW)
+        release_dir = util.get_release_preview_dir() / project_name / 
version_name
+        phase_key = "preview"
+
     revision_dirs: list[str] = []
     with contextlib.suppress(FileNotFoundError):
         for entry in await aiofiles.os.listdir(str(release_dir)):
@@ -782,7 +798,7 @@ async def revisions(session: routes.CommitterSession, 
project_name: str, version
     async with db.session() as data:
         # Get parent links using a direct query due to the use of in_(...)
         query = sqlmodel.select(models.TextValue).where(
-            models.TextValue.ns == release.name + " draft",
+            models.TextValue.ns == release.name + f" {phase_key}",
             
db.validate_instrumented_attribute(models.TextValue.key).in_(revision_dirs),
         )
         parent_links_result = await data.execute(query)
@@ -810,10 +826,12 @@ async def revisions(session: routes.CommitterSession, 
project_name: str, version
         prev_revision_name = rev_name
 
     return await quart.render_template(
+        # TODO: Move to phase-revisions.html
         "draft-revisions.html",
         project_name=project_name,
         version_name=version_name,
         release=release,
+        phase_key=phase_key,
         revision_history=list(reversed(revision_history)),
         current_revision_name=current_revision_name,
     )
diff --git a/atr/templates/draft-revisions.html 
b/atr/templates/draft-revisions.html
index e2d2829..5a7e114 100644
--- a/atr/templates/draft-revisions.html
+++ b/atr/templates/draft-revisions.html
@@ -10,16 +10,31 @@
 
 {% block content %}
   <p class="d-flex justify-content-between align-items-center">
-    <a href="{{ as_url(routes.draft.compose, 
project_name=release.project.name, version_name=release.version) }}"
-       class="atr-back-link">← Back to Compose {{ release.short_display_name 
}}</a>
-    <span>
-      <strong class="atr-phase-one atr-phase-symbol">①</strong>
-      <span class="atr-phase-one atr-phase-label">COMPOSE</span>
-      <span class="atr-phase-arrow">→</span>
-      <span class="atr-phase-symbol-other">②</span>
-      <span class="atr-phase-arrow">→</span>
-      <span class="atr-phase-symbol-other">③</span>
-    </span>
+    {% if phase_key == "draft" %}
+      <a href="{{ as_url(routes.draft.compose, 
project_name=release.project.name, version_name=release.version) }}"
+         class="atr-back-link">← Back to Compose {{ release.short_display_name 
}}</a>
+      <span>
+        <strong class="atr-phase-one atr-phase-symbol">①</strong>
+        <span class="atr-phase-one atr-phase-label">COMPOSE</span>
+        <span class="atr-phase-arrow">→</span>
+        <span class="atr-phase-symbol-other">②</span>
+        <span class="atr-phase-arrow">→</span>
+        <span class="atr-phase-symbol-other">③</span>
+      </span>
+    {% elif phase_key == "preview" %}
+      <a href="{{ as_url(routes.preview.refine_release, 
project_name=release.project.name, version_name=release.version) }}"
+         class="atr-back-link">← Back to Refine {{ release.short_display_name 
}}</a>
+      <span>
+        <span class="atr-phase-symbol-other">①</span>
+        <span class="atr-phase-arrow">→</span>
+        <strong class="atr-phase-symbol-other">②</strong>
+        <span class="atr-phase-arrow">→</span>
+        <strong class="atr-phase-three atr-phase-symbol">③</strong>
+        <span class="atr-phase-three atr-phase-label">REFINE</span>
+      </span>
+    {% else %}
+      <a href="{{ as_url(routes.root.index) }}" class="atr-back-link">← Back 
to Select a release</a>
+    {% endif %}
   </p>
 
   <h1>
diff --git a/atr/templates/preview-announce-release.html 
b/atr/templates/preview-announce-release.html
index 8c9f99e..3113f78 100644
--- a/atr/templates/preview-announce-release.html
+++ b/atr/templates/preview-announce-release.html
@@ -46,19 +46,18 @@
       <h3 class="card-title mb-0">About this release preview</h3>
     </div>
     <div class="card-body">
-      <div class="d-flex flex-wrap gap-3 pb-3 mb-3 border-bottom 
text-secondary fs-6">
-        <span class="page-preview-meta-item">Phase: <strong 
class="atr-phase-three">③ REFINE</strong></span>
+      <div class="d-flex flex-wrap gap-3 pb-1 text-secondary fs-6">
         <span class="page-preview-meta-item">Revision: {{ release.revision 
}}</span>
         <span class="page-preview-meta-item">Created: {{ 
release.created.strftime("%Y-%m-%d %H:%M:%S UTC") }}</span>
       </div>
+      <!--
       <div>
-        <a title="Show files for {{ release.name }}"
-           href="{{ as_url(routes.preview.view, 
project_name=release.project.name, version_name=release.version) }}"
-           class="btn btn-sm btn-outline-secondary">
+        <a title="Show files for {{ release.name }}" href="{{ 
as_url(routes.preview.view, project_name=release.project.name, 
version_name=release.version) }}" class="btn btn-sm btn-secondary">
           <i class="fas fa-file-archive"></i>
           Show files
         </a>
       </div>
+      -->
     </div>
   </div>
 
diff --git a/atr/templates/preview-refine-release.html 
b/atr/templates/preview-refine-release.html
index 3efcce1..7c337fa 100644
--- a/atr/templates/preview-refine-release.html
+++ b/atr/templates/preview-refine-release.html
@@ -35,18 +35,24 @@
         <span class="page-preview-meta-item">Created: {{ 
release.created.strftime("%Y-%m-%d %H:%M:%S UTC") }}</span>
       </div>
       <div>
-        <a title="Announce and distribute {{ release.name }}"
-           href="{{ as_url(routes.preview.announce_release, 
project_name=release.project.name, version_name=release.version) }}"
-           class="btn btn-sm btn-primary me-2">
-          <i class="fas fa-check-circle"></i>
-          Announce and distribute
-        </a>
         <a title="Show files for {{ release.name }}"
            href="{{ as_url(routes.preview.view, 
project_name=release.project.name, version_name=release.version) }}"
-           class="btn btn-sm btn-secondary">
+           class="btn btn-sm btn-secondary me-2">
           <i class="fas fa-file-archive"></i>
           Show files
         </a>
+        <a title="Show revisions for {{ release.name }}"
+           href="{{ as_url(routes.draft.revisions, 
project_name=release.project.name, version_name=release.version) }}"
+           class="btn btn-sm btn-secondary me-2">
+          <i class="fas fa-history"></i>
+          Show revisions
+        </a>
+        <a title="Announce and distribute {{ release.name }}"
+           href="{{ as_url(routes.preview.announce_release, 
project_name=release.project.name, version_name=release.version) }}"
+           class="btn btn-sm btn-success">
+          <i class="fas fa-check-circle"></i>
+          Announce and distribute
+        </a>
       </div>
     </div>
   </div>


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

Reply via email to