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 fd7cd5f Allow a release to be marked as announced, and add associated
browser tests
fd7cd5f is described below
commit fd7cd5fcdfdd26770e3a84a0a073d7f33cbe80b3
Author: Sean B. Palmer <[email protected]>
AuthorDate: Mon Apr 14 15:14:34 2025 +0100
Allow a release to be marked as announced, and add associated browser tests
---
atr/routes/release.py | 21 +++++++++++++++++++++
atr/templates/releases.html | 13 +++++++++++--
playwright/test.py | 25 +++++++++++++++++++------
3 files changed, 51 insertions(+), 8 deletions(-)
diff --git a/atr/routes/release.py b/atr/routes/release.py
index 8e8b890..89ec6dd 100644
--- a/atr/routes/release.py
+++ b/atr/routes/release.py
@@ -95,6 +95,27 @@ async def releases(session: routes.CommitterSession) -> str:
)
[email protected]("/release/mark-announced/<project_name>/<version_name>",
methods=["POST"])
+async def mark_announced(session: routes.CommitterSession, project_name: str,
version_name: str) -> response.Response:
+ """Mark a release as announced."""
+ async with db.session() as data:
+ release_name = models.release_name(project_name, version_name)
+ release = await data.release(name=release_name, _project=True).get()
+
+ if not release:
+ return await session.redirect(releases, error=f"Release
{release_name} not found.")
+
+ if release.phase != models.ReleasePhase.RELEASE_BEFORE_ANNOUNCEMENT:
+ return await session.redirect(
+ releases, error=f"Release {release_name} is not in the 'before
announcement' phase."
+ )
+
+ release.phase = models.ReleasePhase.RELEASE_AFTER_ANNOUNCEMENT
+ await data.commit()
+
+ return await session.redirect(releases, success=f"Release {release_name}
marked as announced.")
+
+
@routes.committer("/release/view/<project_name>/<version_name>")
async def view(session: routes.CommitterSession, project_name: str,
version_name: str) -> response.Response | str:
"""View all the files in the rsync upload directory for a release."""
diff --git a/atr/templates/releases.html b/atr/templates/releases.html
index 44abaef..e922aec 100644
--- a/atr/templates/releases.html
+++ b/atr/templates/releases.html
@@ -30,14 +30,23 @@
{% for release in releases %}
<div class="card mb-3 bg-light">
<div class="card-body">
- <h3 class="card-title mb-2">{{ release.committee.display_name }}</h3>
+ <h3 class="card-title mb-2">{{ release.project.display_name }} {{
release.version }}</h3>
<div class="d-flex flex-wrap gap-3 pb-3 mb-2 border-bottom
text-secondary fs-6">
- <span class="release-meta-item">Version: {{ release.version
}}</span>
<span class="release-meta-item">Stage: {{
release.stage.value.upper() }}</span>
<span class="release-meta-item">Phase: {{
release.phase.value.upper() }}</span>
<span class="release-meta-item">Created: {{
release.created.strftime("%Y-%m-%d %H:%M:%S UTC") }}</span>
</div>
<div class="d-flex gap-3 align-items-center pt-2">
+ {% if release.phase.value.upper() == "RELEASE_BEFORE_ANNOUNCEMENT"
%}
+ <form method="post"
+ action="{{ as_url(routes.release.mark_announced,
project_name=release.project.name, version_name=release.version) }}"
+ class="d-inline-block m-0">
+ <button class="btn btn-primary"
+ title="Mark {{ release.project.display_name }} {{
release.version }} as announced">
+ Mark as announced
+ </button>
+ </form>
+ {% endif %}
<a class="btn btn-outline-primary"
href="{{ as_url(routes.release.view,
project_name=release.project.name, version_name=release.version) }}">View
files</a>
</div>
diff --git a/playwright/test.py b/playwright/test.py
index 236f8d2..d4a2cf5 100644
--- a/playwright/test.py
+++ b/playwright/test.py
@@ -328,15 +328,28 @@ def test_lifecycle_07_promote_preview(page:
sync_api.Page) -> None:
def test_lifecycle_08_release_exists(page: sync_api.Page) -> None:
logging.info("Checking for release tooling-0.1 on the /releases page")
- release_card_locator = page.locator('div.card:has(h3:has-text("tooling"))')
+ release_card_locator = page.locator('div.card:has(h3:has-text("Apache
Tooling 0.1"))')
sync_api.expect(release_card_locator).to_be_visible()
- logging.info("Found card for project tooling")
+ logging.info("Found card for tooling-0.1 release")
+ logging.info("Release tooling-0.1 confirmed exists on /releases page")
- version_locator =
release_card_locator.locator('span.release-meta-item:has-text("Version: 0.1")')
- sync_api.expect(version_locator).to_be_visible()
- logging.info("Found version 0.1 within the tooling project card")
+ logging.info("Locating the announcement marking button for tooling-0.1")
+ mark_announced_button_locator = page.locator('button[title="Mark Apache
Tooling 0.1 as announced"]')
+ sync_api.expect(mark_announced_button_locator).to_be_visible()
- logging.info("Release tooling-0.1 confirmed exists on /releases page")
+ logging.info("Activating the button to mark the release as announced")
+ mark_announced_button_locator.click()
+
+ logging.info("Waiting for navigation back to /releases after marking as
announced")
+ wait_for_path(page, "/releases")
+ logging.info("Navigation back to /releases completed successfully")
+
+ logging.info("Verifying release tooling-0.1 phase is now
RELEASE_AFTER_ANNOUNCEMENT")
+ release_card_locator = page.locator('div.card:has(h3:has-text("Apache
Tooling 0.1"))')
+ sync_api.expect(release_card_locator).to_be_visible()
+ phase_locator =
release_card_locator.locator('span.release-meta-item:has-text("Phase:
RELEASE_AFTER_ANNOUNCEMENT")')
+ sync_api.expect(phase_locator).to_be_visible()
+ logging.info("Phase confirmed as RELEASE_AFTER_ANNOUNCEMENT")
def test_login(page: sync_api.Page, credentials: Credentials) -> None:
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]