{% if can_cancel %}<formclass="inline"method="post"action="{{ repo.url }}/flow/{{ run.number }}/cancel"onsubmit="returnconfirm('Cancel run #{{ run.number }}? Jobs still running are stopped.')"><inputtype="hidden"name="_csrf"value="{{ shell.csrf }}"><buttontype="submit"class="small danger-btn">CANCEL</button></form>{% endif %}
<sectionclass="panel"><divclass="strip bad">The pipeline is not valid, so nothing ran.</div><preclass="snippet">{{ run.error }}</pre><pclass="small mute">Run <code>flow check</code> locally to see the same problems.</p></section>
{% if can_rerun && l.j.done() %}<formclass="tiny inline job-rerun"method="post"action="{{ repo.url }}/flow/{{ run.number }}/jobs/{{ l.j.name }}/rerun"><inputtype="hidden"name="_csrf"value="{{ shell.csrf }}"><buttontype="submit"class="small"title="Run {{ l.j.name }} again in this run, with the jobs that depend on it; what it depends on keeps its results">RE-RUN THIS JOB</button></form>{% endif %}
{% if !l.artifacts.is_empty() %}<ulclass="flow-artifacts small">{% for a in l.artifacts %}<li><ahref="{{ repo.url }}/flow/{{ run.number }}/artifacts/{{ l.j.name }}/{{ a.name }}">{{ a.name }}</a><spanclass="mute">{{ a.path }} · {{ a.size|bytes }} · blob <codetitle="{{ a.blob }}">{{ a.blob|short }}</code></span>{% if l.j.status != "passed" %} <spanclass="warn"title="Kept with when "always": the job did not pass, so its receipt does not name this file">· from a job that did not pass, not in its receipt</span>{% endif %}{% if !releases.is_empty() && l.j.status == "passed" %} <formclass="tiny inline"method="post"action="{{ repo.url }}/flow/{{ run.number }}/artifacts/{{ l.j.name }}/{{ a.name }}/attach"><inputtype="hidden"name="_csrf"value="{{ shell.csrf }}"><selectname="release"aria-label="Release to attach {{ a.name }} to">{% for r in releases %}<optionvalue="{{ r.id }}">{{ r.tag }}</option>{% endfor %}</select><button>Attach to release</button></form>{% endif %}</li>{% endfor %}</ul>{% endif %}
{% if !f.output.is_empty() %}<preclass="flow-log">{{ f.output }}</pre>{% endif %}
44
</details>{% endfor %}
45
{% if t.broken() > l.failures.len() as i64 %}<pclass="small mute">and {{ t.broken() - l.failures.len() as i64 }} more failures; the junit artifact has them all.</p>{% endif %}
<preclass="flow-log"data-logdata-seq="{{ l.last_seq }}">{% for seg in l.segments %}{% match seg %}{% when crate::web::flow::Segment::Line(line) %}<spanclass="ln s-{{ line.stream }}"><spanclass="t">{{ crate::web::flow::secs(line.t) }}</span>{{ line.text }}</span>
48
{% when crate::web::flow::Segment::Group(g) %}<detailsclass="log-group"data-from="{{ g.from_t }}"{% ifg.to_t.is_none() %} opendata-open-group{% endif %}><summaryclass="ln"><spanclass="t">{{ crate::web::flow::secs(g.from_t) }}</span>{{ g.title }}{% if let Some(e) = g.to_t %} <spanclass="took">{{ crate::web::flow::secs(e - g.from_t) }}</span>{% endif %}</summary>{% for line in g.lines %}<spanclass="ln s-{{ line.stream }}"><spanclass="t">{{ crate::web::flow::secs(line.t) }}</span>{{ line.text }}</span>