app/views/templates/beta.html.twig (184 lines of code) (raw):

{% extends 'base.html.twig' %} {% block head_additions %} {% set meta_description = 'State of Firefox Beta for Desktop' %} <meta name="description" content="{{ meta_description }}"> <meta property="twitter:description" content="{{ meta_description }}"> <meta property="og:url" content="https://whattrainisitnow.com/beta/"> {% endblock %} {% block header %} <header class="mx-auto"> <h1>Current Desktop beta cycle: <a href="/release/?version=beta" class="link-info">{{ constant('BETA') }}</a></h1> </header> {% endblock %} {% set tooltip_defaults = ' data-bs-toggle="tooltip" data-bs-placement="bottom" data-bs-html="true" ' %} {% block main %} <table class="table table-fxt-clean table-sm w-50 justify-content-center" id="summary"> <tr> <th class="align-middle w-10 text-center force-default-bg fw-semibold">Uplifts by Product<br><span class="badge text-dark bg-warning-subtle fw-semibold">{{ uplift_count }} uplifts</span></th> <td class="align-middle w-75 force-default-bg"> <ul class="list-group list-group-horizontal mx-auto btn-group bg-success"> {% for product, data in stats %} <li class="btn btn-light p-0 m-0"> <a href="{{ data['bugzilla'] }}" class="d-block w-100 h-50">{{ product }} </a><span class="badge text-dark bg-warning-subtle fw-semibold d-inline-block mt-2">{{ data['bugs']|length }}</span></li> {% endfor %} </ul> </td> </tr> </table> <br> {%- set android_products = ['Firefox for Android', 'GeckoView', 'Focus'] -%} {% for key, values in beta.uplifts %} {% if key == constant('BETA') ~ ".0rc0" %} <p class="bg-info w-25 border-0 text-center mx-auto p-0 text-dark fs-6 rounded"><small>Last beta shipped</small></p> {% endif %} {% if key == constant('BETA') ~ ".0rc1" %} <p class="bg-info w-25 border-0 text-center mx-auto p-0 text-dark fs-6 rounded"><small>Beta to release merge</small></p> {% endif %} <ul class="list-group list-group-horizontal d-flex flex-row w-75 mx-auto mb-3"> <li class="list-group-item bg-success-subtle fw-semibold border-0 version"> {% if key == constant('BETA') ~ ".0rc0" %} No build {% else %} <a href="{{ values['hg_link'] }}" class="text-dark">{{ key }}</a> {% endif %} </li> <li class="list-group-item text-dark bg-white border-0 flex-fill w-25"> {% if bug_list[key]|length == 1 %} <a href="{{ bugs_link[key] }}" class="text-dark">1 bug uplifted</a> {% elseif bug_list[key]|length > 1 %} <a href="{{ bugs_link[key] }}" class="text-dark">{{ bug_list[key]|length }} bugs uplifted</a> {% if key == constant('BETA') ~ ".0rc0" %} <small class="fst-italic"> (on the beta branch, those will ship in rc1)</small> {% endif %} {% else %} No uplifts {% endif %} {% if loop.first %} <small class="fst-italic">(contains all the patches landed during the nightly cycle)</small> {% endif %} {% if key|split('b')[1] > beta.count and 'rc' not in key %} <small class="fst-italic">(upcoming beta, not shipped yet)</small> {% endif %} </li> {% if key != constant('BETA') ~ ".0rc0" %} {% if key|split('b')[1] <= beta.count %} <li class="list-group-item text-light border-0 bg-warning-subtle"> <a class="text-dark" data-bs-toggle="collapse" aria-expanded="false" href="#collapseCrashes{{ key }}"> <span class="text-collapsed ">Show crashes</span> <span class="text-expanded ">Hide crashes</span> </a> </li> {% endif %} {% endif %} {% if values['total']|length > 0 %} <li class="list-group-item text-dark border-0 bg-info"> <a class="text-dark" data-bs-toggle="collapse" aria-expanded="false" href="#collapseBugs{{ key }}"> <span class="text-collapsed">Show bug fixes</span> <span class="text-expanded">Hide bug fixes</span> </a> </li> {% endif %} </ul> <div class="collapse w-75 w-auto" id="collapseCrashes{{ key }}"> <ol class="w-75 m-auto pt-1 mb-3 text-dark bg-white table-fxt-clean "> {% for sig in beta.crashes[key].signatures|slice(0, 7) %} {% if sig.term in known_top_crashes %} {% set button, alert ='btn btn-info btn-sm', 'Known top crash' %} {% elseif ((sig.count/beta.crashes[key].total)*100)|number_format(2) > 10 %} {% set button, alert = 'btn btn-danger btn-sm', 'Top crash' %} {% else %} {% set button, alert = '', '' %} {% endif %} {% if sig.term in crash_bugs|keys %} {% set crash_bug_button, crash_bug_link = 'btn btn-success btn-sm', '<a class="text-light" href="https://bugzilla.mozilla.org/' ~ crash_bugs[sig.term] ~ '">' ~ crash_bugs[sig.term] ~ '</a>' %} {% else %} {% set crash_bug_button, crash_bug_link = '', '' %} {% endif %} {% if beta.crashes[key].signatures %} <li class="mb-1"> <a href="https://crash-stats.mozilla.org/signature/?signature={{ sig.term }}" title="Go to Crash Stats"><img src="/assets/img/socorro.png" width="16" height="16" alt=""/></a> <a class="text-dark" href="https://crash-stop-addon.herokuapp.com/sumup.html?s={{ sig.term }}">{{ sig.term }}</a> <span class="fw-normal" title="{{ sig.count }}">({{ ((sig.count/beta.crashes[key].total)*100)|number_format(2) }}%)</span> <span class="{{ button }}">{{ alert }}</span> <span class="{{ crash_bug_button }}">{{ crash_bug_link|raw }}</span> </li> {% endif %} {% endfor %} </ol> </div> <div class="collapse" id="collapseBugs{{ key }}"> <table class="table table-light table-fxt-clean table-hover table-sm w-75 justify-content-center mb-3"> <caption class="text-center text-light caption-top fw-semibold"> Uplifts and Backouts {% if values['total']|length > 0 %} <a href="{{ bugs_link[key] }}" {{ tooltip_defaults|raw }} title="Open this list on <b>Bugzilla</b>" class="bzlink" target="_blank"><svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="orange"><path d="M480-200q66 0 113-47t47-113v-160q0-66-47-113t-113-47q-66 0-113 47t-47 113v160q0 66 47 113t113 47Zm-80-120h160v-80H400v80Zm0-160h160v-80H400v80Zm80 40Zm0 320q-65 0-120.5-32T272-240H160v-80h84q-3-20-3.5-40t-.5-40h-80v-80h80q0-20 .5-40t3.5-40h-84v-80h112q14-23 31.5-43t40.5-35l-64-66 56-56 86 86q28-9 57-9t57 9l88-86 56 56-66 66q23 15 41.5 34.5T688-640h112v80h-84q3 20 3.5 40t.5 40h80v80h-80q0 20-.5 40t-3.5 40h84v80H688q-32 56-87.5 88T480-120Z"/></svg></a> {% endif %} </caption> <thead> <tr class="text-start table-warning force-default-bg fw-semibold"> <th>Bug</th> <th>Component</th> <th>Summary</th> </tr> </thead> <tbody> {%- for details in bug_list[key] -%} {%- set alert_link = '' -%} {%- set alert_title = '' -%} {%- set alert_row = '' -%} {%- set product = '' -%} {%- if details.product in android_products -%} {%- set product = 'android' -%} {%- endif -%} {%- set pill_level = 'text-bg-light border' -%} {%- if details.type == 'enhancement' -%} {%- set alert_link ='bz-enhancement' -%} {%- set alert_title =' title="Bug marked as Enhancement"' -%} {%- else -%} {%- set alert_title =' title="Bug marked as Task or Defect"' -%} {%- endif -%} {%- if bug_list_karma[details.id].score > 8 -%} {%- set pill_level ='text-bg-warning' -%} {%- endif -%} {%- if bug_list_karma[details.id].score > 15 -%} {%- set alert_row ='fw-bold' -%} {%- set pill_level ='text-bg-danger' -%} {%- endif -%} <tr class="{{ alert_row }}"> <td class="{{ product }}"><a href="https://bugzilla.mozilla.org/{{ details.id }}" class="text-end text-nowrap bug-link link-primary {{ alert_link }}" {{ alert_title|raw }}>{{ details.id }}</a></td> <td><a href="https://bugzilla.mozilla.org/{{ details.id }}" class="bug-link link-dark">{{ details.component }}</a></td> <td><a href="https://bugzilla.mozilla.org/{{ details.id }}" class="bug-link link-dark">{{ details.summary }}</a></td> </tr> {% endfor %} </tbody> </table> </div> {% endfor %} {% endblock %} {% block footer %} <footer></footer> <script nonce="{{constant('NONCE')}}"> $(document).ready(function() { $(document).on("click", "table thead tr th", function() { var table = $(this).parents("table"); var rows = table.find("> tbody > tr").toArray().sort(TableComparer($(this).index())); var header_direction = $(this).hasClass("sort-asc") ? "sort-desc" : "sort-asc"; if (header_direction == "sort-desc") { rows = rows.reverse(); } table.append(rows); table.find("th").removeClass("sort-asc sort-desc"); $(this).addClass(header_direction); }); }); function TableComparer(index) { var value = function (row, index) { return $(row).children("td").eq(index).children(":first-child").text(); }; return function(a, b) { var val_a = value(a, index); var val_b = value(b, index); return ($.isNumeric(val_a) && $.isNumeric(val_b)) ? val_a - val_b : val_a.toString().localeCompare(val_b); } } $(function () { $('[data-bs-toggle="tooltip"]').tooltip() }) </script> {% endblock %}