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 a7d2797 Fix a bug with displaying draft candidate releases
a7d2797 is described below
commit a7d2797b7998d81fd919f561f654fa0f2be22bf1
Author: Sean B. Palmer <[email protected]>
AuthorDate: Fri May 30 18:39:06 2025 +0100
Fix a bug with displaying draft candidate releases
---
atr/routes/announce.py | 1 +
atr/routes/draft.py | 13 ++-
atr/routes/preview.py | 1 +
atr/routes/revisions.py | 5 +-
atr/templates/voting-selected-revision.html | 172 +++++++++++++++-------------
5 files changed, 103 insertions(+), 89 deletions(-)
diff --git a/atr/routes/announce.py b/atr/routes/announce.py
index 40b6e10..2f9fef5 100644
--- a/atr/routes/announce.py
+++ b/atr/routes/announce.py
@@ -86,6 +86,7 @@ async def selected(session: routes.CommitterSession,
project_name: str, version_
announce_form = await
_create_announce_form_instance(util.permitted_recipients(session.uid))
# Hidden fields
announce_form.preview_name.data = release.name
+ # There must be a revision to announce
announce_form.preview_revision.data = release.unwrap_revision_number
# Variables used in defaults for subject and body
diff --git a/atr/routes/draft.py b/atr/routes/draft.py
index d5a5739..61b42ee 100644
--- a/atr/routes/draft.py
+++ b/atr/routes/draft.py
@@ -444,12 +444,13 @@ async def view(session: routes.CommitterSession,
project_name: str, version_name
release = await session.release(project_name, version_name)
# Convert async generator to list
- file_stats = [
- stat
- async for stat in util.content_list(
- util.get_unfinished_dir(), project_name, version_name,
release.unwrap_revision_number
- )
- ]
+ revision_number = release.latest_revision_number
+ file_stats = []
+ if revision_number is not None:
+ file_stats = [
+ stat
+ async for stat in util.content_list(util.get_unfinished_dir(),
project_name, version_name, revision_number)
+ ]
# Sort the files by FileStat.path
file_stats.sort(key=lambda fs: fs.path)
diff --git a/atr/routes/preview.py b/atr/routes/preview.py
index 8eeb713..a861539 100644
--- a/atr/routes/preview.py
+++ b/atr/routes/preview.py
@@ -150,6 +150,7 @@ async def view(session: routes.CommitterSession,
project_name: str, version_name
release = await session.release(project_name, version_name,
phase=models.ReleasePhase.RELEASE_PREVIEW)
# Convert async generator to list
+ # There must be a revision on a preview
file_stats = [
stat
async for stat in util.content_list(
diff --git a/atr/routes/revisions.py b/atr/routes/revisions.py
index 105f380..eefeb7a 100644
--- a/atr/routes/revisions.py
+++ b/atr/routes/revisions.py
@@ -49,7 +49,10 @@ async def selected(session: routes.CommitterSession,
project_name: str, version_
release_dir = util.release_directory_base(release)
# Determine the current revision
- latest_revision_number = release.unwrap_revision_number
+ latest_revision_number = release.latest_revision_number
+ if latest_revision_number is None:
+ # TODO: Set an error message, and redirect to the release page?
+ ...
# Oldest to newest, to build diffs relative to previous revision
async with db.session() as data_for_revisions:
diff --git a/atr/templates/voting-selected-revision.html
b/atr/templates/voting-selected-revision.html
index 31cc06e..43857f9 100644
--- a/atr/templates/voting-selected-revision.html
+++ b/atr/templates/voting-selected-revision.html
@@ -46,101 +46,109 @@
</div>
{% endif %}
- {{ forms.errors_summary(form) }}
- <form method="post"
- id="vote-initiate-form"
- class="atr-canary py-4 px-5"
- action="{{ as_url(routes.voting.selected_revision,
project_name=release.project.name, version_name=release.version,
revision=release.unwrap_revision_number) }}"
- novalidate>
- {{ form.hidden_tag() }}
-
- {{ form.release_name }}
- <div class="mb-4">
- <div class="row mb-3 pb-3 border-bottom">
- {{ forms.label(form.mailing_list, col="md3-high") }}
- <div class="col-md-9">
- <div class="d-flex gap-4 mb-2">
- {% for subfield in form.mailing_list %}
- <div class="form-check">
- {{ subfield(class_='form-check-input') }}
- {{ subfield.label(class_='form-check-label') }}
- </div>
- {% endfor %}
+ {% set revision_number = release.latest_revision_number %}
+ {% if revision_number %}
+ {{ forms.errors_summary(form) }}
+ <form method="post"
+ id="vote-initiate-form"
+ class="atr-canary py-4 px-5"
+ action="{{ as_url(routes.voting.selected_revision,
project_name=release.project.name, version_name=release.version,
revision=revision_number) }}"
+ novalidate>
+ {{ form.hidden_tag() }}
+
+ {{ form.release_name }}
+ <div class="mb-4">
+ <div class="row mb-3 pb-3 border-bottom">
+ {{ forms.label(form.mailing_list, col="md3-high") }}
+ <div class="col-md-9">
+ <div class="d-flex gap-4 mb-2">
+ {% for subfield in form.mailing_list %}
+ <div class="form-check">
+ {{ subfield(class_='form-check-input') }}
+ {{ subfield.label(class_='form-check-label') }}
+ </div>
+ {% endfor %}
+ </div>
+ {{ forms.errors(form.mailing_list) }}
+ {{ forms.description(form.mailing_list, classes="form-text
text-muted") }}
</div>
- {{ forms.errors(form.mailing_list) }}
- {{ forms.description(form.mailing_list, classes="form-text
text-muted") }}
</div>
- </div>
- <div class="row mb-3 pb-3 border-bottom">
- {{ forms.label(form.vote_duration, col="md3") }}
- <div class="col-md-9">
- {{ forms.widget(form.vote_duration, classes="form-select w-75") }}
- {{ forms.errors(form.vote_duration) }}
- {{ forms.description(form.vote_duration, classes="form-text
text-muted") }}
+ <div class="row mb-3 pb-3 border-bottom">
+ {{ forms.label(form.vote_duration, col="md3") }}
+ <div class="col-md-9">
+ {{ forms.widget(form.vote_duration, classes="form-select w-75") }}
+ {{ forms.errors(form.vote_duration) }}
+ {{ forms.description(form.vote_duration, classes="form-text
text-muted") }}
+ </div>
</div>
- </div>
- <div class="row mb-3 pb-3 border-bottom">
- {{ forms.label(form.subject, col="md3") }}
- <div class="col-md-9">
- {{ forms.widget(form.subject, classes="form-control w-75") }}
- {{ forms.errors(form.subject) }}
+ <div class="row mb-3 pb-3 border-bottom">
+ {{ forms.label(form.subject, col="md3") }}
+ <div class="col-md-9">
+ {{ forms.widget(form.subject, classes="form-control w-75") }}
+ {{ forms.errors(form.subject) }}
+ </div>
</div>
- </div>
- <div class="row mb-3 pb-3">
- {{ forms.label(form.body, col="md3") }}
- <div class="col-md-9">
- <ul class="nav nav-tabs" id="emailBodyTab" role="tablist">
- <li class="nav-item" role="presentation">
- <button class="nav-link active"
- id="edit-body-tab"
- data-bs-toggle="tab"
- data-bs-target="#edit-body-pane"
- type="button"
- role="tab"
- aria-controls="edit-body-pane"
- aria-selected="true">Edit</button>
- </li>
- <li class="nav-item" role="presentation">
- <button class="nav-link"
- id="text-preview-body-tab"
- data-bs-toggle="tab"
- data-bs-target="#text-preview-body-pane"
- type="button"
- role="tab"
- aria-controls="text-preview-body-pane"
- aria-selected="false">Text preview</button>
- </li>
- </ul>
- <div class="tab-content" id="emailBodyTabContent">
- <div class="tab-pane fade show active"
- id="edit-body-pane"
- role="tabpanel"
- aria-labelledby="edit-body-tab">
- {{ forms.widget(form.body, classes="form-control font-monospace
mt-2", rows="20") }}
- {{ forms.errors(form.body) }}
- {{ forms.description(form.body, classes="form-text text-muted")
}}
- </div>
- <div class="tab-pane fade"
- id="text-preview-body-pane"
- role="tabpanel"
- aria-labelledby="text-preview-body-tab">
- <pre class="mt-2 p-3 bg-light border rounded font-monospace
overflow-auto"><code id="text-preview-content">Loading preview...</code></pre>
+ <div class="row mb-3 pb-3">
+ {{ forms.label(form.body, col="md3") }}
+ <div class="col-md-9">
+ <ul class="nav nav-tabs" id="emailBodyTab" role="tablist">
+ <li class="nav-item" role="presentation">
+ <button class="nav-link active"
+ id="edit-body-tab"
+ data-bs-toggle="tab"
+ data-bs-target="#edit-body-pane"
+ type="button"
+ role="tab"
+ aria-controls="edit-body-pane"
+ aria-selected="true">Edit</button>
+ </li>
+ <li class="nav-item" role="presentation">
+ <button class="nav-link"
+ id="text-preview-body-tab"
+ data-bs-toggle="tab"
+ data-bs-target="#text-preview-body-pane"
+ type="button"
+ role="tab"
+ aria-controls="text-preview-body-pane"
+ aria-selected="false">Text preview</button>
+ </li>
+ </ul>
+ <div class="tab-content" id="emailBodyTabContent">
+ <div class="tab-pane fade show active"
+ id="edit-body-pane"
+ role="tabpanel"
+ aria-labelledby="edit-body-tab">
+ {{ forms.widget(form.body, classes="form-control
font-monospace mt-2", rows="20") }}
+ {{ forms.errors(form.body) }}
+ {{ forms.description(form.body, classes="form-text
text-muted") }}
+ </div>
+ <div class="tab-pane fade"
+ id="text-preview-body-pane"
+ role="tabpanel"
+ aria-labelledby="text-preview-body-tab">
+ <pre class="mt-2 p-3 bg-light border rounded font-monospace
overflow-auto"><code id="text-preview-content">Loading preview...</code></pre>
+ </div>
</div>
</div>
</div>
- </div>
- </div>
+ </div>
- <div class="mt-4 col-md-9 offset-md-3 px-1">
- {{ form.submit(class_='btn btn-primary') }}
- <a href="{{ as_url(routes.compose.selected,
project_name=release.project.name, version_name=release.version) }}"
- class="btn btn-link text-secondary">Cancel</a>
+ <div class="mt-4 col-md-9 offset-md-3 px-1">
+ {{ form.submit(class_='btn btn-primary') }}
+ <a href="{{ as_url(routes.compose.selected,
project_name=release.project.name, version_name=release.version) }}"
+ class="btn btn-link text-secondary">Cancel</a>
+ </div>
+ </form>
+ {% else %}
+ <div class="p-3 mb-4 bg-danger-subtle border border-danger rounded">
+ <i class="bi bi-exclamation-triangle-fill"></i>
+ <strong>Error:</strong> This release has no revisions. Please create a
revision first.
</div>
- </form>
+ {% endif %}
{% endblock content %}
{% block javascripts %}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]