Sign in

Search issue titles and bodies, change requests and comments. Private repositories you cannot read are not included.

vole
Clone

Read only, no credentials:

https://rodent.software/vole.git

Write over SSH with a registered key:

git clone ssh://git@rodent.software:2222/vole.git

A free and open-source forge that lives in your Git repo.

Serve changes at /r/<repo>/changes

8fb7aabf534adf208cd795724b1e3d287dc62f5a · Keenan Nemetz · 3d ago · parent b492b557

Serve changes at /r/<repo>/changes

The metadata tree and the interface say changes; the browser was the last
place spelling the route requests. Rename every method on that subtree and
the URLs the server builds: redirects, activity and search results, the
number alias, code links, templates, and the CLI's page links.

The old route is gone rather than aliased. Nothing has been publicly
released, so there is no bookmark or client to keep working, and a redirect
would leave two spellings of the same page in the code.

Refs #204 (01M6S6685JFG8S64ZFF452217W).

server/web/templates/requests.html +31−31

@@ -1,13 +1,13 @@
1 1 {{define "requests"}}
2 2 {{template "header" .}}
3 {{template "repohead" (nav .Page "requests")}}
3 {{template "repohead" (nav .Page "changes")}}
4 4
5 5 <div class="page-head">
6 6 <div class="page-head-main">
7 7 <h1>Changes</h1>
8 8 <p class="page-sub">Proposed updates to the project, reviewed and approved before they are merged.</p>
9 9 </div>
10 {{if .CanOpen}}<div class="page-head-actions"><a class="button" href="/r/{{.Name}}/requests/new">{{icon "plus"}}New change</a></div>{{end}}
10 {{if .CanOpen}}<div class="page-head-actions"><a class="button" href="/r/{{.Name}}/changes/new">{{icon "plus"}}New change</a></div>{{end}}
11 11 </div>
12 12
13 13 {{template "change_list" .}}
@@ -21,18 +21,18 @@
21 21 {{/* One row: state chips on the left, search on the right. The chips live
22 22 inside the form so a search keeps the state, and the whole row is replaced
23 23 with the server's rendering after a search or a chip click. */}}
24 <form method="get" action="/r/{{.Name}}/requests" class="filters" role="search" hx-get="/r/{{.Name}}/requests" hx-target="#change-list" hx-swap="outerHTML" hx-push-url="true">
24 <form method="get" action="/r/{{.Name}}/changes" class="filters" role="search" hx-get="/r/{{.Name}}/changes" hx-target="#change-list" hx-swap="outerHTML" hx-push-url="true">
25 25 <div class="chips" hx-boost="true" hx-target="#change-list" hx-swap="outerHTML" hx-push-url="true">
26 <a class="chip{{if eq .State "open"}} active{{end}}" href="/r/{{.Name}}/requests?state=open{{if .Query}}&amp;q={{urlquery .Query}}{{end}}">Open <span class="chip-count">{{.Open}}</span></a>
27 <a class="chip{{if eq .State "merged"}} active{{end}}" href="/r/{{.Name}}/requests?state=merged{{if .Query}}&amp;q={{urlquery .Query}}{{end}}">Merged <span class="chip-count">{{.Merged}}</span></a>
28 <a class="chip{{if eq .State "closed"}} active{{end}}" href="/r/{{.Name}}/requests?state=closed{{if .Query}}&amp;q={{urlquery .Query}}{{end}}">Closed <span class="chip-count">{{.Closed}}</span></a>
29 <a class="chip{{if eq .State "all"}} active{{end}}" href="/r/{{.Name}}/requests?state=all{{if .Query}}&amp;q={{urlquery .Query}}{{end}}">All <span class="chip-count">{{.Total}}</span></a>
26 <a class="chip{{if eq .State "open"}} active{{end}}" href="/r/{{.Name}}/changes?state=open{{if .Query}}&amp;q={{urlquery .Query}}{{end}}">Open <span class="chip-count">{{.Open}}</span></a>
27 <a class="chip{{if eq .State "merged"}} active{{end}}" href="/r/{{.Name}}/changes?state=merged{{if .Query}}&amp;q={{urlquery .Query}}{{end}}">Merged <span class="chip-count">{{.Merged}}</span></a>
28 <a class="chip{{if eq .State "closed"}} active{{end}}" href="/r/{{.Name}}/changes?state=closed{{if .Query}}&amp;q={{urlquery .Query}}{{end}}">Closed <span class="chip-count">{{.Closed}}</span></a>
29 <a class="chip{{if eq .State "all"}} active{{end}}" href="/r/{{.Name}}/changes?state=all{{if .Query}}&amp;q={{urlquery .Query}}{{end}}">All <span class="chip-count">{{.Total}}</span></a>
30 30 </div>
31 31 <input type="hidden" name="state" value="{{.State}}">
32 32 <div class="filters-search">
33 33 <input name="q" type="search" placeholder="Search title, description and author" aria-label="Search title, description and author" value="{{.Query}}">
34 34 <button type="submit">{{icon "search"}}Search</button>
35 {{if .Filtered}}<a class="button secondary" href="/r/{{.Name}}/requests" hx-get="/r/{{.Name}}/requests" hx-target="#change-list" hx-swap="outerHTML" hx-push-url="true">{{icon "x"}}Clear</a>{{end}}
35 {{if .Filtered}}<a class="button secondary" href="/r/{{.Name}}/changes" hx-get="/r/{{.Name}}/changes" hx-target="#change-list" hx-swap="outerHTML" hx-push-url="true">{{icon "x"}}Clear</a>{{end}}
36 36 </div>
37 37 </form>
38 38
@@ -47,7 +47,7 @@
47 47 <tr>
48 48 <td class="fit">{{template "change_status" .Status}}</td>
49 49 <td>
50 <a class="row-title" href="/r/{{$.Name}}/requests/{{.ID}}">{{.Title}}</a>
50 <a class="row-title" href="/r/{{$.Name}}/changes/{{.ID}}">{{.Title}}</a>
51 51 <div class="row-meta">
52 52 <span class="sha">{{num .Number}}</span>
53 53 <span>opened by {{template "userlink" (user .Author)}} {{since .Created.Unix}}</span>
@@ -66,14 +66,14 @@
66 66 {{else if and (eq .State "open") .Total}}
67 67 <div class="empty-state">
68 68 <p>No open changes.{{if .Merged}} {{.Merged}} merged.{{end}}{{if .Closed}} {{.Closed}} closed.{{end}}</p>
69 {{if .Merged}}<a href="/r/{{.Name}}/requests?state=merged" hx-get="/r/{{.Name}}/requests?state=merged" hx-target="#change-list" hx-swap="outerHTML" hx-push-url="true">View merged changes</a>{{end}}
69 {{if .Merged}}<a href="/r/{{.Name}}/changes?state=merged" hx-get="/r/{{.Name}}/changes?state=merged" hx-target="#change-list" hx-swap="outerHTML" hx-push-url="true">View merged changes</a>{{end}}
70 70 {{if and .Merged .Closed}} · {{end}}
71 {{if .Closed}}<a href="/r/{{.Name}}/requests?state=closed" hx-get="/r/{{.Name}}/requests?state=closed" hx-target="#change-list" hx-swap="outerHTML" hx-push-url="true">View closed changes</a>{{end}}
71 {{if .Closed}}<a href="/r/{{.Name}}/changes?state=closed" hx-get="/r/{{.Name}}/changes?state=closed" hx-target="#change-list" hx-swap="outerHTML" hx-push-url="true">View closed changes</a>{{end}}
72 72 </div>
73 73 {{else if .Filtered}}
74 74 <div class="empty-state">
75 75 <p>No changes match this filter.</p>
76 <a href="/r/{{.Name}}/requests" hx-get="/r/{{.Name}}/requests" hx-target="#change-list" hx-swap="outerHTML" hx-push-url="true">Clear filters</a>
76 <a href="/r/{{.Name}}/changes" hx-get="/r/{{.Name}}/changes" hx-target="#change-list" hx-swap="outerHTML" hx-push-url="true">Clear filters</a>
77 77 </div>
78 78 {{else}}
79 79 <div class="empty-state">
@@ -95,7 +95,7 @@
95 95
96 96 {{define "request_changes"}}
97 97 <section id="request-changes"{{if .Live}} hx-swap-oob="outerHTML"{{end}}>
98 <h2 class="with-more"><span>{{icon "file"}}Changes</span>{{if .FileCount}} <a class="more" href="/r/{{.Name}}/requests/{{.Request.ID}}/files">View changes</a>{{end}}</h2>
98 <h2 class="with-more"><span>{{icon "file"}}Changes</span>{{if .FileCount}} <a class="more" href="/r/{{.Name}}/changes/{{.Request.ID}}/files">View changes</a>{{end}}</h2>
99 99 {{if .FileCount}}
100 100 <p class="muted">{{.FileCount}} file(s) changed{{if .Added}} · <span class="adds">+{{.Added}}</span>{{end}}{{if .Removed}} · <span class="dels">−{{.Removed}}</span>{{end}}{{if .AlreadyMerged}} · merged into {{.Request.Base}}{{end}}</p>
101 101 {{else if .AlreadyMerged}}
@@ -111,7 +111,7 @@
111 111 target picker, or an open composer is not thrown away. */}}
112 112 {{define "request_aside"}}
113 113 <div id="request-aside"
114 hx-get="/r/{{.Name}}/requests/{{.Request.ID}}/live"
114 hx-get="/r/{{.Name}}/changes/{{.Request.ID}}/live"
115 115 hx-trigger="every 20s [document.visibilityState === 'visible']"
116 116 hx-sync="this:replace"
117 117 hx-swap="none">
@@ -174,7 +174,7 @@
174 174
175 175 {{define "request_target"}}
176 176 {{if .CanRetarget}}
177 <form method="post" action="/r/{{.Name}}/requests/{{.Request.ID}}/target" class="request-target">
177 <form method="post" action="/r/{{.Name}}/changes/{{.Request.ID}}/target" class="request-target">
178 178 <input type="hidden" name="csrf" value="{{.CSRF}}">
179 179 <div class="target-fields">
180 180 <label class="target-field">
@@ -225,7 +225,7 @@
225 225
226 226 {{define "request_checks"}}
227 227 <section id="request-checks"{{if .Live}} hx-swap-oob="outerHTML"{{end}}>
228 <h2 class="with-more"><span>{{icon "circle-check"}}Checks{{template "help" "Workflow runs for the commit under review. If the base branch requires checks, a failing or missing run blocks landing."}}</span> <a class="more" href="/r/{{.Name}}/requests/{{.Request.ID}}/runs">View runs</a></h2>
228 <h2 class="with-more"><span>{{icon "circle-check"}}Checks{{template "help" "Workflow runs for the commit under review. If the base branch requires checks, a failing or missing run blocks landing."}}</span> <a class="more" href="/r/{{.Name}}/changes/{{.Request.ID}}/runs">View runs</a></h2>
229 229 {{with .ContributorCI}}
230 230 <p class="muted">CI is waiting for a maintainer to allow <code>{{.Ref}}</code> at this commit.</p>
231 231 {{end}}
@@ -291,7 +291,7 @@
291 291 <span class="side-meta">{{who .Author}}{{if not .Created.IsZero}}<span>{{since .Created.Unix}}</span>{{end}}</span>
292 292 </a>
293 293 {{if $.CanEditIssues}}
294 <form method="post" action="/r/{{$.Name}}/requests/{{$.Request.ID}}/issues" hx-post="/r/{{$.Name}}/requests/{{$.Request.ID}}/issues" hx-target="#request-issues" hx-swap="outerHTML">
294 <form method="post" action="/r/{{$.Name}}/changes/{{$.Request.ID}}/issues" hx-post="/r/{{$.Name}}/changes/{{$.Request.ID}}/issues" hx-target="#request-issues" hx-swap="outerHTML">
295 295 <input type="hidden" name="csrf" value="{{$.CSRF}}">
296 296 <input type="hidden" name="issue" value="{{.ID}}">
297 297 <button class="link request-unlink" type="submit" name="action" value="remove" title="Unlink this issue" aria-label="Unlink {{num .Number}} from this change">{{icon "unlink"}}</button>
@@ -305,7 +305,7 @@
305 305 {{end}}
306 306 {{if .CanEditIssues}}
307 307 <div class="request-issue-picker">
308 <form class="request-issue-search" hx-get="/r/{{.Name}}/requests/{{.Request.ID}}/issues/search" hx-trigger="input changed delay:250ms, search, submit" hx-target="#request-issue-results" hx-swap="innerHTML">
308 <form class="request-issue-search" hx-get="/r/{{.Name}}/changes/{{.Request.ID}}/issues/search" hx-trigger="input changed delay:250ms, search, submit" hx-target="#request-issue-results" hx-swap="innerHTML">
309 309 <input id="request-issue-search" name="q" type="search" placeholder="Search by title, #number, or ULID" aria-label="Search issues by title, number, or ULID" autocomplete="off">
310 310 </form>
311 311 <div id="request-issue-results" class="request-issue-results" aria-live="polite"></div>
@@ -322,7 +322,7 @@
322 322 {{else if .Results}}
323 323 <div class="request-issue-matches">
324 324 {{range .Results}}
325 <form method="post" action="/r/{{$.Name}}/requests/{{$.Request.ID}}/issues" class="request-issue-match" hx-post="/r/{{$.Name}}/requests/{{$.Request.ID}}/issues" hx-target="#request-issues" hx-swap="outerHTML">
325 <form method="post" action="/r/{{$.Name}}/changes/{{$.Request.ID}}/issues" class="request-issue-match" hx-post="/r/{{$.Name}}/changes/{{$.Request.ID}}/issues" hx-target="#request-issues" hx-swap="outerHTML">
326 326 <input type="hidden" name="csrf" value="{{$.CSRF}}">
327 327 <input type="hidden" name="issue" value="{{.ID}}">
328 328 <button type="submit" name="action" value="add" title="Link {{num .Number}}">
@@ -341,7 +341,7 @@
341 341 {{define "request_inline_comment"}}
342 342 <tr class="inline-comment">
343 343 <td colspan="4">
344 <form method="post" action="/r/{{.Name}}/requests/{{.Request.ID}}/comments" class="inline-comment-form">
344 <form method="post" action="/r/{{.Name}}/changes/{{.Request.ID}}/comments" class="inline-comment-form">
345 345 <input type="hidden" name="csrf" value="{{.CSRF}}">
346 346 <input type="hidden" name="path" value="{{.Target.Path}}">
347 347 <input type="hidden" name="line" value="{{.Target.Line}}">
@@ -366,9 +366,9 @@
366 366 <span class="page-num">{{num .Number}}</span>
367 367 <h1 class="details-title-view" data-details-title-view{{if .Details.Title.Active}} hidden{{end}}>{{.Request.Title}}</h1>
368 368 {{if .CanEdit}}
369 <a class="title-edit-toggle" href="/r/{{.Name}}/requests/{{.Request.ID}}/edit"{{if .Details.Inline}} data-title-edit{{end}}{{if .Details.Title.Active}} hidden{{end}} aria-label="Edit title" title="Edit title">{{icon "pencil"}}</a>
369 <a class="title-edit-toggle" href="/r/{{.Name}}/changes/{{.Request.ID}}/edit"{{if .Details.Inline}} data-title-edit{{end}}{{if .Details.Title.Active}} hidden{{end}} aria-label="Edit title" title="Edit title">{{icon "pencil"}}</a>
370 370 {{if .Details.Inline}}
371 <form class="title-edit-form" data-title-edit-form method="post" action="/r/{{.Name}}/requests/{{.Request.ID}}/edit" hx-post="/r/{{.Name}}/requests/{{.Request.ID}}/edit" hx-target="#request-head" hx-swap="outerHTML" hx-disabled-elt="find button[type='submit']"{{if not .Details.Title.Active}} hidden{{end}}>
371 <form class="title-edit-form" data-title-edit-form method="post" action="/r/{{.Name}}/changes/{{.Request.ID}}/edit" hx-post="/r/{{.Name}}/changes/{{.Request.ID}}/edit" hx-target="#request-head" hx-swap="outerHTML" hx-disabled-elt="find button[type='submit']"{{if not .Details.Title.Active}} hidden{{end}}>
372 372 <input type="hidden" name="csrf" value="{{.CSRF}}">
373 373 <input type="hidden" name="field" value="title">
374 374 <input class="details-title-input" type="text" name="title" required maxlength="200" aria-label="Title" value="{{if .Details.Title.Active}}{{.Details.Title.Value}}{{else}}{{.Request.Title}}{{end}}" data-title-edit-input{{if .Details.Title.Active}} autofocus{{end}}>
@@ -414,7 +414,7 @@
414 414 </form>
415 415 {{end}}{{end}}
416 416 {{if .CanApprove}}
417 <form method="post" action="/r/{{.Name}}/requests/{{.Request.ID}}/approve" hx-post="/r/{{.Name}}/requests/{{.Request.ID}}/approve" hx-swap="none" hx-disabled-elt="find button[type='submit']">
417 <form method="post" action="/r/{{.Name}}/changes/{{.Request.ID}}/approve" hx-post="/r/{{.Name}}/changes/{{.Request.ID}}/approve" hx-swap="none" hx-disabled-elt="find button[type='submit']">
418 418 <input type="hidden" name="csrf" value="{{.CSRF}}">
419 419 <input type="hidden" name="base" value="{{.Request.Base}}">
420 420 <input type="hidden" name="head" value="{{.Request.Head}}">
@@ -422,18 +422,18 @@
422 422 </form>
423 423 {{end}}
424 424 {{if .MergeArmed}}
425 <form method="post" action="/r/{{.Name}}/requests/{{.Request.ID}}/merge/cancel">
425 <form method="post" action="/r/{{.Name}}/changes/{{.Request.ID}}/merge/cancel">
426 426 <input type="hidden" name="csrf" value="{{.CSRF}}">
427 427 <button class="secondary" type="submit">{{icon "circle-x"}}Cancel merge</button>
428 428 </form>
429 429 {{else if .CanMerge}}
430 <form method="post" action="/r/{{.Name}}/requests/{{.Request.ID}}/merge">
430 <form method="post" action="/r/{{.Name}}/changes/{{.Request.ID}}/merge">
431 431 <input type="hidden" name="csrf" value="{{.CSRF}}">
432 432 <button class="success" type="submit"{{if .MergeBlocked}} disabled{{end}}>{{icon "git-merge"}}{{if .MergePending}}Merge when ready{{else}}Merge{{end}}</button>
433 433 </form>
434 434 {{end}}
435 435 {{if .CanClose}}
436 <form method="post" action="/r/{{.Name}}/requests/{{.Request.ID}}/state">
436 <form method="post" action="/r/{{.Name}}/changes/{{.Request.ID}}/state">
437 437 <input type="hidden" name="csrf" value="{{.CSRF}}">
438 438 <input type="hidden" name="state" value="{{if eq .Request.State "open"}}closed{{else}}open{{end}}">
439 439 <button class="{{if eq .Request.State "open"}}danger{{else}}secondary{{end}}" type="submit">{{if eq .Request.State "open"}}{{icon "circle-x"}}Close{{else}}{{icon "rotate-ccw"}}Reopen{{end}}</button>
@@ -445,9 +445,9 @@
445 445
446 446 {{define "request_tabs"}}
447 447 <nav class="subtabs" aria-label="Change sections">
448 <a class="{{if eq .Tab "conversation"}}active{{end}}" href="/r/{{.Name}}/requests/{{.Request.ID}}"{{if eq .Tab "conversation"}} aria-current="page"{{end}}>{{icon "message-square"}}Conversation</a>
449 <a class="{{if eq .Tab "files"}}active{{end}}" href="/r/{{.Name}}/requests/{{.Request.ID}}/files"{{if eq .Tab "files"}} aria-current="page"{{end}}>{{icon "file"}}Changes <span class="chip-count">{{.FileCount}}</span></a>
450 <a class="{{if eq .Tab "runs"}}active{{end}}" href="/r/{{.Name}}/requests/{{.Request.ID}}/runs"{{if eq .Tab "runs"}} aria-current="page"{{end}}>{{icon "play"}}Runs <span class="chip-count">{{len .Checks}}</span></a>
448 <a class="{{if eq .Tab "conversation"}}active{{end}}" href="/r/{{.Name}}/changes/{{.Request.ID}}"{{if eq .Tab "conversation"}} aria-current="page"{{end}}>{{icon "message-square"}}Conversation</a>
449 <a class="{{if eq .Tab "files"}}active{{end}}" href="/r/{{.Name}}/changes/{{.Request.ID}}/files"{{if eq .Tab "files"}} aria-current="page"{{end}}>{{icon "file"}}Changes <span class="chip-count">{{.FileCount}}</span></a>
450 <a class="{{if eq .Tab "runs"}}active{{end}}" href="/r/{{.Name}}/changes/{{.Request.ID}}/runs"{{if eq .Tab "runs"}} aria-current="page"{{end}}>{{icon "play"}}Runs <span class="chip-count">{{len .Checks}}</span></a>
451 451 </nav>
452 452 {{end}}
453 453
@@ -469,7 +469,7 @@
469 469 {{if .Description}}{{.Description}}{{else}}<p class="muted">No description.</p>{{end}}
470 470 </div>
471 471 {{if .CanEdit}}
472 <form class="comment-edit-form details-edit-form" data-comment-edit-form method="post" action="/r/{{.Name}}/requests/{{.Request.ID}}/edit" hx-post="/r/{{.Name}}/requests/{{.Request.ID}}/edit" hx-target="#request-description" hx-swap="outerHTML" hx-disabled-elt="find button[type='submit']"{{if not .Details.Description.Active}} hidden{{end}}>
472 <form class="comment-edit-form details-edit-form" data-comment-edit-form method="post" action="/r/{{.Name}}/changes/{{.Request.ID}}/edit" hx-post="/r/{{.Name}}/changes/{{.Request.ID}}/edit" hx-target="#request-description" hx-swap="outerHTML" hx-disabled-elt="find button[type='submit']"{{if not .Details.Description.Active}} hidden{{end}}>
473 473 <input type="hidden" name="csrf" value="{{.CSRF}}">
474 474 <input type="hidden" name="field" value="body">
475 475 {{if .Details.Description.Error}}<p class="error">{{.Details.Description.Error}}</p>{{end}}
@@ -485,7 +485,7 @@
485 485
486 486 {{define "request"}}
487 487 {{template "header" .}}
488 {{template "repohead" (nav .Page "requests")}}
488 {{template "repohead" (nav .Page "changes")}}
489 489 {{template "request_head" .}}
490 490 {{template "request_tabs" .}}
491 491