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]