app/views/templates/future_release.html.twig (323 lines of code) (raw):
{% extends 'base.html.twig' %}
{% block head_additions %}
{% set meta_description = 'Follow Firefox trains and major milestones easily!' %}
<meta name="description" content="{{ meta_description }}">
<meta property="twitter:description" content="{{ meta_description }}">
<meta property="og:url" content="https://whattrainisitnow.com/release/">
<meta http-equiv="refresh" content="7200">
{% endblock %}
{% block header %}
{% include 'release_nav.html.twig' %}
{% endblock %}
{% block main %}
{% if not fallback_content %}
{% if release == constant('BETA') %}
{% set alert = 'Version shipping to users on the <b class="text-success-emphasis">Beta</b> channel' %}
{% set channel = 'beta' %}
{% set rollout = '
<span
data-bs-toggle="tooltip"
data-bs-placement="top"
data-bs-html="true"
title="This is the background update rate.<br><b>Not the uptake rate!</b>"
>
<sup class="fw-normal fst-italic text-secondary border-bottom">(' ~ beta_rollout ~ '% rollout)</sup>
</span>
'
%}
{% elseif release == constant('NIGHTLY') %}
{% set alert = 'Version shipping to users on the <b class="text-success-emphasis">Nightly</b> channel' %}
{% set channel = 'nightly' %}
{% elseif release == constant('BETA') - 1 and release == constant('RELEASE') +1 %}
{% set alert = '<b class="text-danger">Release candidate</b> about to be released.' %}
{% set channel = 'future' %}
{% else %}
{% set alert = 'Future version, development not started yet' %}
{% set channel = 'future' %}
{% endif %}
{% if release == '147' %}
{% set alert = alert ~ '
<div class="alert alert-warning d-flex align-top p-2" role="alert">
<svg class="bi flex-shrink-0 me-2 text-warning" width="24" height="24" role="img" aria-label="Warning:">
<use xlink:href="#exclamation-triangle-fill"/>
<symbol id="exclamation-triangle-fill" fill="currentColor" viewBox="0 0 16 16">
<path d="M8.982 1.566a1.13 1.13 0 0 0-1.96 0L.165 13.233c-.457.778.091 1.767.98 1.767h13.713c.889 0 1.438-.99.98-1.767L8.982 1.566zM8 5c.535 0 .954.462.9.995l-.35 3.507a.552.552 0 0 1-1.1 0L7.1 5.995A.905.905 0 0 1 8 5zm.002 6a1 1 0 1 1 0 2 1 1 0 0 1 0-2z"/>
</symbol>
</svg>
</svg>
<div>
Beta milestones might be adjusted to EOY staff availability.
</div>
</div>
'%}
{% endif %}
<div class="w-50 alert alert-primary mx-auto text-center" role="alert">{{ alert|raw }}
{% if channel == 'nightly'%}
{% if nightly_updates %}
<div class="text-success"><small>Automatic Updates are enabled</small></div>
{% else %}
<div>
<small class="text-danger">Automatic Updates are temporarily disabled</small>
{% if nightly_emergency %}
<br class="mt-2"><small>→ {{ nightly_emergency|raw }}</small>
{% endif %}
</div>
{% endif %}
{% endif %}
</div>
{% set table_header = 'text-secondary-emphasis fw-semibold' %}
<table class="table table-light table-fxt-clean table-sm mb-3 w-50 justify-content-center">
<tr class='table-warning'>
<th class="{{ table_header }}">Release Date</th><td title="{{ release_date|format_date('full') }}">{{ release_date|format_date('long') }}</td>
</tr>
<tr>
<th class="{{ table_header }}">Release Owner</th><td>{{ release_owner }}</td>
</tr>
{% if OLDER_ESR %}
<tr>
<th class="{{ table_header }}">Corresponding ESR releases</th>
{% if OLDER_ESR|number_format == 115 %}
<td>{{ ESR }} ·
<span
data-bs-toggle="tooltip" data-bs-placement="bottom" data-bs-html="true"
title="ESR 115 support is extended for <i>Windows 7-8.1</i> and <i>macOS 10.12-10.14</i> up to <b>September 2025</b>."
class='text-muted'>
{{ OLDER_ESR }}<sup class="text-danger">?</sup></span>
</td>
{% elseif ESR_115 != '' %}
<td>{{ ESR }} · {{ OLDER_ESR }} ·
<span
data-bs-toggle="tooltip" data-bs-placement="bottom" data-bs-html="true"
title="ESR 115 support is extended for <i>Windows 7-8.1</i> and <i>macOS 10.12-10.14</i> up to <b>September 2025</b>."
class='text-muted'>
{{ ESR_115 }}<sup class="text-danger">?</sup></span>
</td>
{% else %}
<td>{{ ESR }} · {{ OLDER_ESR }}</td>
{% endif %}
</tr>
{% else %}
<tr>
<th class="{{ table_header }}">Corresponding ESR release</th>
<td>{{ ESR }}</td>
</tr>
{% endif %}
{% if channel == 'beta' %}
<tr>
<th class="{{ table_header }}">Current Beta</th>
<td>
{% if date() > date(cycle_dates.rc_gtb) %}
{{ constant('FIREFOX_BETA')|number_format(1) }} <small>Release Candidate</small>
{% else %}
{{ constant('FIREFOX_BETA') }}
{% endif %}
{% if beta_rollout != -1 %}
{{ rollout|raw }}
{% endif %}
</td>
</tr>
<tr>
<th class="{{ table_header }}">Bugs fixed in Nightly</th>
<td>{{ nightly_fixes.bug_fixes|length }}</td>
</tr>
{% endif %}
{% if channel == 'nightly' %}
<tr>
<th class="{{ table_header }}">Latest BuildID</th>
<td>{{ latest_nightly }}</td>
</tr>
{% endif %}
<tr>
<th class="{{ table_header }}">Nightly cycle length</th><td>{{ nightly_cycle_length|number_format }} weeks</td>
</tr>
<tr>
<th class="{{ table_header }}">Beta cycle length</th><td>{{ beta_cycle_length|number_format }} weeks</td>
</tr>
{% if release == '140' %}
<tr class="table-warning">
<td colspan="2" class="text-center fw-bold">{{ release }} is the next <abbr title="Extended Support Release" class="initialism">ESR</abbr></td>
</tr>
{% endif %}
{% if channel == 'nightly' %}
<tr>
<th class="{{ table_header }}">Release notes</th>
<td><a href="https://www.mozilla.org/firefox/nightly/notes/">Nightly notes</a></td>
</tr>
{% endif %}
{% if channel == 'beta' %}
<tr>
<th class="{{ table_header }}">Release notes</th>
<td><a href="https://www.mozilla.org/firefox/beta/notes/">Beta notes</a></td>
</tr>
{% endif %}
</table>
{% set btb = ' <small class="text-secondary fw-light">Go to build</small>' %}
{% set cycle_labels = {
nightly_start: 'Nightly starts',
a11y_request_deadline: 'Deadline to request accessibility engineering review',
qa_request_deadline: 'Deadline to request manual QA',
qa_feature_done: 'Build ready for QA',
qa_feature_done_1: 'Build ready for QA in nightly',
qa_feature_done_2: 'Build ready for QA in beta',
soft_code_freeze: 'Soft Code Freeze starts',
qa_pre_merge_done: 'QA pre-merge regression testing done',
qa_test_plan_due: 'QA Test Plan approval due',
string_freeze: 'String Freeze starts',
merge_day: 'Merge day',
beta_1: 'Beta 1' ~ btb,
beta_2: 'Beta 2' ~ btb,
beta_3: 'Beta 3' ~ btb,
sumo_1: '<abbr title="support.mozilla.org">SUMO</abbr> content creation',
beta_4: 'Beta 4' ~ btb,
beta_5: 'Beta 5' ~ btb,
beta_6: 'Beta 6' ~ btb,
beta_7: 'Beta 7' ~ btb,
beta_8: 'Beta 8' ~ btb,
qa_pre_rc_signoff: 'Pre-release QA sign-off',
beta_9: 'Beta 9' ~ btb,
sumo_2: '<abbr title="support.mozilla.org">SUMO</abbr> content localization',
beta_10: 'Beta 10' ~ btb,
beta_11: 'Beta 11' ~ btb,
beta_12: 'Beta 12' ~ btb,
beta_13: 'Beta 13' ~ btb,
beta_14: 'Beta 14' ~ btb,
beta_15: 'Beta 15' ~ btb,
rc_gtb: 'Release Candidate' ~ btb,
rc: 'Release Candidate',
release: 'Release day!',
mobile_dot_release: 'Potential mobile dot release',
planned_dot_release: 'Planned dot release'
}
%}
{% set cycle_descriptions = {
nightly_start: 'The first day of the cycle is <i>Merge Day</i>. After merging mozilla-central to mozilla-beta, we bump the nightly version number on mozilla-central and a new development cycle starts for Firefox. A new Firefox Nightly is shipped every 12 hours.',
a11y_request_deadline: 'Accessibility engineering review has been requested (<a href="https://firefox-source-docs.mozilla.org/bug-mgmt/processes/accessibility-review.html#requesting-engineering-review">using the <code>a11y-review</code> flag on Bugzilla</a>) for new (or significantly redesigned) UI that requires assessment to determine whether it is accessible to people with disabilities.',
qa_request_deadline: 'QA has been informed (via a Jira ticket) about features that require manual testing during the nightly and/or beta cycle. <br>Feature technical documentation is also required to draft Test Plans and Test Cases.',
qa_feature_done: 'Features with a QA request are ready for testing to assess feature quality and provide a formal test report by the end of Week 2 of the nightly cycle.',
qa_feature_done_1: 'Features with a QA request are ready for testing to assess feature quality and provide a formal test report by the end of Week 3 of the nightly cycle.',
qa_feature_done_2: 'If nightly testing was skipped then features should be in a testable state by this date for beta testing.',
soft_code_freeze: 'We are nearing the end of the nightly cycle. Don\'t land new untested features. Risky changes should be avoided after 8:00 AM UTC until after the nightly version bump on <i>Merge Day</i>.',
qa_pre_merge_done: 'QA assess build readiness for shipping to Beta by running a set of Regression test cases and shares a test report.',
qa_test_plan_due: 'The QA team appreciates an earlier sign-off from the project teams. The approval milestone will be the final deadline for any feature Test Plan sign-offs. No feedback/sign-off on QAs Feature Test Plan could result in misalignment on testing scope, incomplete test coverage and invalid bugs.',
string_freeze: 'In order to ensure that our localizers have adequate time to translate strings, please make sure that all string changes have landed by end of day.',
merge_day: 'This is the day in the release cycle when we merge mozilla-central into mozilla-beta. This is the end of the development cycle for Firefox ' ~ release ~ ' and the beginning of our Beta stabilization cycle.',
beta_1: 'Built manually just after the merge. It is rolled out to 25% of our beta population. Some experimental features are still activated to watch their behavior on a wider population. These experimental features will be deactivated mid-cycle. Uplift requests are open.',
beta_2: 'First automated beta of the cycle. It is rolled out to 50% of our beta population. Build starts at 13:00 UTC. <br>Stabilization work via uplifts.',
beta_3: 'Beta rollout bumped to 100% provided stability is good. Build starts at 13:00 UTC. Stabilization work via uplifts.',
sumo_1: 'User affecting changes were identified and provided to the support.mozilla.org team. The support content for this release can now be created and will be translated before RC week.',
beta_4: 'Build starts at 13:00 UTC. Stabilization work via uplifts.',
beta_5: 'Build starts at 13:00 UTC. Stabilization work via uplifts.',
beta_6: 'On a regular 4 weeks beta cycle, Beta 6 is the last beta with experimental features still activated. Build starts at 13:00 UTC. Stabilization work via uplifts.',
beta_7: 'Experimental features are no longer activated at compile time. Build starts at 13:00 UTC. Stabilization work via uplifts.',
beta_8: 'Last week of the beta cycle. Build starts at 13:00 UTC. Stabilization work via uplifts.',
qa_pre_rc_signoff: 'A week before the final sign-off, QA shares preliminary test reports for each feature riding the train. This pre-release sign-off can be <abbr title="No quality concerns">Green</abbr>, <abbr title="Moderate quality concerns">Yellow</abbr> or <abbr title="Severe quality concerns">Red</abbr>.',
beta_9: 'On a regular 4 weeks beta cycle, this is the last beta and thus the end of beta uplifts, including <a href="https://firefox-source-docs.mozilla.org/bug-mgmt/processes/security-approval.html">security bugs</a> for this release (<code>sec-approval+</code> on Bugzilla). Build starts at 13:00 UTC.',
sumo_2: 'New content on support.mozilla.org team is finalized, uploaded to the server and provided to our localization teams internationally.',
beta_10: 'Extra beta usually due to a longer beta cycle. Build starts at 13:00 UTC. Stabilization work via uplifts.',
beta_11: 'Extra beta usually due to a longer beta cycle. Build starts at 13:00 UTC. Stabilization work via uplifts.',
beta_12: 'Extra beta usually due to a longer beta cycle. Build starts at 13:00 UTC. Stabilization work via uplifts.',
beta_13: 'Extra beta usually due to a longer beta cycle. Build starts at 13:00 UTC. Stabilization work via uplifts.',
beta_14: 'Extra beta usually due to a longer beta cycle. Build starts at 13:00 UTC. Stabilization work via uplifts.',
beta_15: 'Extra beta usually due to a longer beta cycle. Build starts at 13:00 UTC. Stabilization work via uplifts.',
rc_gtb: 'We merge our mozilla-beta repository to mozilla-release and close mozilla-beta until the next merge day. We then build our Release Candidate from mozilla-release. This is the build we intend to ship a week later unless we need to build a second Release Candidate to fix a major quality or business critical issue.',
rc: 'Our Release Candidate is shipped to all of our beta population.',
release: 'We ship Firefox ' ~ release ~ ' at ' ~ date(cycle_dates.release)|format_date(pattern='HH:mm') ~ ' UTC (6AM PST) at 25% rollout.',
mobile_dot_release: 'One week after the release, we evaluate shipping a mobile-only dot release to address identified issues. We can also enable new features on a on a case by case basis if they are suitable for uplift. The decision on shipping or not this dot release for Android and/or iOS, is on the release management team.',
planned_dot_release: 'Two weeks after the release, we ship a desktop and/or mobile dot release to address identified quality issues with safe fixes ready. We can also enable new features on a on a case by case basis if they are suitable for uplift. We may have to ship other dot releases before that date. If this is the case and post-release quality issues are already fixed and shipped, the decision on shipping or not the planned dot release is on the release management team.'
}
%}
{% set next_milestone = true %}
<table class="table table-light table-fxt-clean table-hover table-sm w-50 justify-content-center mb-3">
<tr>
<th colspan="2" class="text-center table-warning force-default-bg fw-semibold">Milestones<br><small class="fw-normal">Desktop, Android & iOS</small></th>
</tr>
{% for key, value in cycle_dates %}
{% if key != 'version' %}
{% set extra = '' %}
{% if key == 'soft_code_freeze' %}
{% set extra = ' <small class="badge bg-warning text-dark fw-semibold">Draft beta release notes</small>' %}
{% endif %}
{% if key == 'beta_6' %}
{% set extra = ' <small class="badge bg-warning text-dark fw-semibold">Last early beta</small>' %}
{% endif %}
{% if key == 'beta_9' %}
{% set extra = ' <small class="badge bg-warning text-dark fw-semibold">Last beta uplifts <span class="fw-light">(sec-approval request deadline)</span></small>' %}
{% endif %}
{% if key == 'rc' %}
{% set extra = ' <small class="badge bg-warning text-dark fw-semibold">Release notes finalized</small>' %}
{% endif %}
<tr>
{% if date(value) < date() %}
{% if key starts with 'beta' and key == 'beta_1' %}
<th class="text-muted fw-light">
<details>
<summary><a href="https://hg.mozilla.org/releases/mozilla-beta/pushloghtml?fromchange=FIREFOX_BETA_{{constant('FIREFOX_BETA')|number_format}}_BASE&tochange=FIREFOX_{{constant('FIREFOX_BETA')|number_format}}_0b1_RELEASE" class="link-secondary" title="Mercurial changelog">{{ cycle_labels[key]|raw }}{{ extra|raw }}</a></summary>
<p>{{ cycle_descriptions[key]|raw }}</p>
</details>
</th>
{% elseif key starts with 'beta' and key != 'beta_1' %}
<th class="text-muted fw-light">
<details>
<summary><a href="https://hg.mozilla.org/releases/mozilla-beta/pushloghtml?fromchange=FIREFOX_{{constant('FIREFOX_BETA')|number_format}}_0b{{ key|replace({'beta_':''}) -1 }}_RELEASE&tochange=FIREFOX_{{constant('FIREFOX_BETA')|number_format}}_0b{{ key|replace({'beta_':''}) }}_RELEASE" class="link-secondary" title="Mercurial changelog">{{ cycle_labels[key]|raw }}{{ extra|raw }}</a></summary>
<p>{{ cycle_descriptions[key]|raw }}</p>
</details>
</th>
{% else %}
<th class="text-muted fw-light">
<details>
<summary>{{ cycle_labels[key]|raw }}{{ extra|raw }}</summary>
<p>{{ cycle_descriptions[key]|raw }}</p>
</details>
</th>
{% endif %}
{% else %}
<th class="{{ table_header }}">
<details{{ next_milestone and channel in ['nightly', 'beta'] ? ' open' }}>
<summary>{{ cycle_labels[key]|raw }}{{ extra|raw }}</summary>
<p>{{ cycle_descriptions[key]|raw }}</p>
</details>
</th>
{% set next_milestone = false %}
{% endif %}
<td {{ date(value) < date() ? ' class="text-muted fw-light"' }}>
<span
class="schedule_date"
data-bs-toggle="tooltip"
data-bs-placement="left"
data-bs-html="true"
title="{{ value|format_date('relative_full')}} <br><b> {{ deadlines[key]['message'] ?? '' }}"
>{{ value|format_date(pattern='MMMM d') }}</span>{% if value|format_date(pattern='YYYY-MM-dd') in wellness_days %}<span
data-bs-toggle="tooltip" data-bs-placement="bottom" data-bs-html="true"
title="Wellness day. <br>Reduced availability of Mozilla Staff."
class='text-muted'><sup class="text-danger">?</sup></span>
{% set wellness_days = wellness_days | filter((v) => v != value|format_date(pattern='YYYY-MM-dd')) %}
{% endif %}
<br><small class="fst-italic text-end">{{ deadlines[key]['message']}}</small>
</td>
</tr>
{% endif %}
{% endfor %}
</table>
{% endif %}
{{ fallback_content|raw }}
{% endblock %}
{% block footer %}
{% if not fallback_content %}
{% include 'footer_UTC_warning.html.twig' %}
<footer class="d-flex justify-content-center text-white-50 mt-0">Working days exclude week-ends and the current day</footer>
{% endif %}
<script nonce="{{constant('NONCE')}}">
$(function () {
$('[data-bs-toggle="tooltip"]').tooltip()
})
$('span.schedule_date').click(function (){
var current_row = $(this).closest('tr');
var details_in_row = current_row.find('details');
if (details_in_row.attr('open')) {
details_in_row.removeAttr('open');
} else {
details_in_row.attr('open', 'open')
};
});
</script>
{% endblock %}