{% if let Some(n) = notice %}<pclass="note">{{ n }}</p>{% endif %}
16
{% if let Some(e) = error %}<pclass="error">{{ e }}</p>{% endif %}
17
{% if conflicted %}<divclass="strip bad">Landing would carry {{ conflicts.len()|plural("conflict", "conflicts") }}. Any collaborator can push a resolution change to the source; the proposal follows it. <ahref="?tab=files#conflicts">See them</a></div>{% endif %}
18
{% if landed_already && p.state != "landed" %}<divclass="strip warn">Every change is already in {{ p.target }}.</div>{% endif %}
<spanclass="small mute">projected state <codetitle="{{ state_hash }}">{{ state_hash|short }}</code> · {{ heads.len()|plural("head", "heads") }} · <ahref="{{ repo.url }}/tree/{% if let Some(h) = heads.first() %}{{ h }}{% endif %}">browse</a> · <ahref="{{ api_url }}">json</a></span>
26
</div>
27
28
{% if tab == "changes" %}
29
{% if changes.is_empty() %}<pclass="empty">Nothing to add: the target already has everything.</p>{% endif %}
30
{% for c in changes %}{% call m::change_row(repo, c) %}{% endfor %}
31
32
{% else if tab == "files" %}
33
{% if !conflicts.is_empty() %}
34
<sectionclass="panel"id="conflicts"><h2>Conflicts the landing would carry</h2>
35
{% for c in conflicts %}<p><strong>{{ c.path }}</strong><spanclass="tag bad">{{ c.kind }}</span></p>{% if let Some(t) = c.marked %}<preclass="marked">{{ t }}</pre>{% endif %}{% endfor %}
<tdclass="t">{% call m::line_text(l) %}{% if let Some(n) = l.new_no %}{% if shell.user.is_some() && p.is_open() %}<detailsclass="linecomment"><summarytitle="Comment on this line">+</summary>
<formmethod="post"action="{{ repo.url }}/proposal/{{ p.number }}/comment"><inputtype="hidden"name="_csrf"value="{{ shell.csrf }}"><inputtype="hidden"name="path"value="{{ f.path }}"><inputtype="hidden"name="line"value="{{ n }}"><textareaname="body"rows="3"requiredplaceholder="Anchored to this line's atom; it follows the line through rebases."></textarea><buttontype="submit">COMMENT</button></form></details>{% endif %}{% endif %}</td>
51
</tr>
52
{% if let Some(n) = l.new_no %}{% if let Some(idxs) = placed.get(&crate::web::proposals::key(&f.path, n)) %}
53
<trclass="ctx"><tdcolspan="4"class="thread">
54
{% for i in idxs %}{% let c = comments[*i] %}
55
<divclass="comment{% if c.row.resolved %} resolved{% endif %}"><spanclass="who">{{ c.row.author }}</span><timeclass="mute"title="{{ c.row.created_ms|when_i }}">{{ c.row.created_ms|ago_i }}</time>{% if c.row.resolved %} <spanclass="tag">resolved</span>{% endif %}
<sectionclass="panel"><h2>Comments on lines that are gone</h2>
68
{% for i in outdated %}{% let c = comments[*i] %}<divclass="comment"><spanclass="who">{{ c.row.author }}</span> on <code>{{ c.row.path }}</code><timeclass="mute">{{ c.row.created_ms|ago_i }}</time><divclass="body">{{ c.body_html|safe }}</div></div>{% endfor %}
69
</section>
70
{% endif %}
71
72
{% else %}
73
<divclass="side-layout">
74
<div>
75
{% if !p.body.is_empty() %}<articleclass="doc">{{ body_html|safe }}</article>{% endif %}
76
{% for c in comments %}{% if c.row.anchor_change.is_empty() %}
<pclass="small mute">An approval counts once you seal the changes from a client: <code>oxy seal --proposal {{ shell.base_url }}{{ repo.url }}/proposal/{{ p.number }}</code></p>
100
<buttontype="submit">SUBMIT REVIEW</button>
101
</form>
102
{% endif %}
103
{% endif %}
104
</div>
105
<asideclass="side">
106
<h3>Landing</h3>
107
{% if p.state == "landed" %}<p><spanclass="sig sig-valid">✔</span> landed{% if !p.landed_state.is_empty() %} at <code>{{ p.landed_state|short }}</code>{% endif %}</p>
108
{% else if p.state == "closed" %}<pclass="mute">closed</p>
109
{% else %}
110
{% if blockers.is_empty() %}<p><spanclass="sig sig-valid">✔</span> ready to land</p>{% else %}<ulclass="plain small">{% for b in blockers %}<li><spanclass="sig sig-invalid">✘</span> {{ b }}</li>{% endfor %}</ul>{% endif %}
111
{% if can_land %}
112
{% if hub_can_land %}<formmethod="post"action="{{ repo.url }}/proposal/{{ p.number }}/land"><inputtype="hidden"name="_csrf"value="{{ shell.csrf }}"><buttontype="submit">LAND</button></form>
113
{% else %}<pclass="small">This repository has a trust policy, so land from a client with your key:</p><pclass="secret">oxy proposal land {{ shell.base_url }}{{ repo.url }}/proposal/{{ p.number }}</p>{% endif %}
{% if approvals.is_empty() %}<pclass="mute small">None yet{% if requirements.required_approvals > 0 %}; {{ requirements.required_approvals }} sealed required{% endif %}.</p>{% else %}
129
<ulclass="plain">{% for a in approvals %}<li>{% if a.sealed %}<spanclass="sig sig-valid">◈</span>{% else %}<spanclass="sig sig-unsigned">○</span>{% endif %} <ahref="/{{ a.account }}">{{ a.account }}</a>{% if !a.sealed %} <spanclass="mute small">seal pending</span>{% endif %}</li>{% endfor %}</ul>{% endif %}
130
{% if !owners.is_empty() %}<h3>Code owners</h3><ulclass="plain">{% for o in owners %}<li>{{ o }}</li>{% endfor %}</ul>{% endif %}
131
{% if !depends_on.is_empty() %}<h3>Depends on</h3><ulclass="plain">{% for n in depends_on %}<li><ahref="{{ repo.url }}/proposal/{{ n }}">#{{ n }}</a></li>{% endfor %}</ul>{% endif %}