detached 5dfb71b

feat(web): add merge when ready and auto-merge state to the merge box

commit
5dfb71bb8bc24da1f3014ae2efa9b4526969ef0a
author
brice · · 2026-10-20 16:08 UTC
parent
31adb55
signature
GPG VerifiedCD88F9E564E0102646FB6077A1A07C7C7C3E349D · arch-gpg Verified for the committer email
7 files · +700 -351
M internal/adapters/web/fragments.go +5 -1
@@ -61,7 +61,7 @@ func liveEvent(we ports.WatchEvent) bool {
6161 }
6262 switch we.Event.(type) {
6363 case domain.RepoCreated, domain.RepoUpdated, domain.RepoDeleted, domain.PushEvent,
64- domain.MergeRequestOpened, domain.MergeRequestMerged, domain.MergeRequestClosed, domain.MergeRequestReady, domain.MergeRequestMergeability, domain.CommentAdded, domain.CommentEdited, domain.CommentDeleted, domain.CommentResolved,
64+ domain.MergeRequestOpened, domain.MergeRequestMerged, domain.MergeRequestClosed, domain.MergeRequestReady, domain.MergeRequestAutoMergeEnabled, domain.MergeRequestAutoMergeCancelled, domain.MergeRequestMergeability, domain.CommentAdded, domain.CommentEdited, domain.CommentDeleted, domain.CommentResolved,
6565 domain.RunUpdated, domain.JobUpdated,
6666 domain.IssueOpened, domain.IssueClosed, domain.IssueReopened, domain.IssueCommented, domain.IssueSubmitted, domain.IssuePendingRemoved:
6767 return true
@@ -189,6 +189,10 @@ func (l *liveStream) repoPage(ctx context.Context, we ports.WatchEvent) ([]fragm
189189 return l.mrNotice(ctx, ev.MergeRequest.Number, "this merge request was closed — reload")
190190 case domain.MergeRequestReady:
191191 return l.mrNotice(ctx, ev.MergeRequest.Number, "this merge request is ready for review — reload")
192+ case domain.MergeRequestAutoMergeEnabled:
193+ return l.mrNotice(ctx, ev.MergeRequest.Number, "auto-merge was enabled — reload")
194+ case domain.MergeRequestAutoMergeCancelled:
195+ return l.mrNotice(ctx, ev.MergeRequest.Number, "auto-merge was cancelled — reload")
192196 case domain.MergeRequestMergeability:
193197 if l.view != "mr" || strconv.FormatInt(ev.Number, 10) != l.n {
194198 return nil, nil
@@ -61,7 +61,7 @@ func liveEvent(we ports.WatchEvent) bool {
61 }61 }
62 switch we.Event.(type) {62 switch we.Event.(type) {
63 case domain.RepoCreated, domain.RepoUpdated, domain.RepoDeleted, domain.PushEvent,63 case domain.RepoCreated, domain.RepoUpdated, domain.RepoDeleted, domain.PushEvent,
64- domain.MergeRequestOpened, domain.MergeRequestMerged, domain.MergeRequestClosed, domain.MergeRequestReady, domain.MergeRequestMergeability, domain.CommentAdded, domain.CommentEdited, domain.CommentDeleted, domain.CommentResolved,64+ domain.MergeRequestOpened, domain.MergeRequestMerged, domain.MergeRequestClosed, domain.MergeRequestReady, domain.MergeRequestAutoMergeEnabled, domain.MergeRequestAutoMergeCancelled, domain.MergeRequestMergeability, domain.CommentAdded, domain.CommentEdited, domain.CommentDeleted, domain.CommentResolved,
65 domain.RunUpdated, domain.JobUpdated,65 domain.RunUpdated, domain.JobUpdated,
66 domain.IssueOpened, domain.IssueClosed, domain.IssueReopened, domain.IssueCommented, domain.IssueSubmitted, domain.IssuePendingRemoved:66 domain.IssueOpened, domain.IssueClosed, domain.IssueReopened, domain.IssueCommented, domain.IssueSubmitted, domain.IssuePendingRemoved:
67 return true67 return true
@@ -189,6 +189,10 @@ func (l *liveStream) repoPage(ctx context.Context, we ports.WatchEvent) ([]fragm
189 return l.mrNotice(ctx, ev.MergeRequest.Number, "this merge request was closed — reload")189 return l.mrNotice(ctx, ev.MergeRequest.Number, "this merge request was closed — reload")
190 case domain.MergeRequestReady:190 case domain.MergeRequestReady:
191 return l.mrNotice(ctx, ev.MergeRequest.Number, "this merge request is ready for review — reload")191 return l.mrNotice(ctx, ev.MergeRequest.Number, "this merge request is ready for review — reload")
192+ case domain.MergeRequestAutoMergeEnabled:
193+ return l.mrNotice(ctx, ev.MergeRequest.Number, "auto-merge was enabled — reload")
194+ case domain.MergeRequestAutoMergeCancelled:
195+ return l.mrNotice(ctx, ev.MergeRequest.Number, "auto-merge was cancelled — reload")
192 case domain.MergeRequestMergeability:196 case domain.MergeRequestMergeability:
193 if l.view != "mr" || strconv.FormatInt(ev.Number, 10) != l.n {197 if l.view != "mr" || strconv.FormatInt(ev.Number, 10) != l.n {
194 return nil, nil198 return nil, nil
M internal/adapters/web/mr.go +26 -0
@@ -11,6 +11,7 @@ import (
1111 "net/url"
1212 "strconv"
1313 "strings"
14+ "time"
1415
1516 "github.com/a-h/templ"
1617
@@ -202,6 +203,18 @@ type MergeBox struct {
202203 Fingerprint string
203204 // Error is why the last merge was refused, shown in the box.
204205 Error string
206+ // AutoAction and CancelAutoAction post to the auto-merge routes.
207+ AutoAction, CancelAutoAction string
208+ // CanAutoMerge offers "Merge when ready": the repository allows
209+ // auto-merge and the server has CI to wait for.
210+ CanAutoMerge bool
211+ // AutoMerge is the pending auto-merge, nil when off.
212+ AutoMerge *AutoMergeView
213+}
214+
215+// AutoMergeView is a pending auto-merge, ready to show.
216+type AutoMergeView struct {
217+ Mode, EnabledBy, When, WhenAt, HeadShort string
205218 }
206219
207220 // ModeOption is a merge mode the repository allows. Disabled says that the
@@ -666,9 +679,20 @@ func (s *Server) mrBox(ctx context.Context, d *repoData, res ports.MergeRequestD
666679 if m.IsDraft() {
667680 box.ReadyAction = mrHref(d.name(), m.Number, "ready")
668681 }
682+ box.AutoMerge = autoMergeView(s.cfg.Now(), m.AutoMerge)
669683 return box
670684 }
671685
686+// autoMergeView is the pending auto-merge ready to show, nil when off.
687+func autoMergeView(now time.Time, am *domain.AutoMerge) *AutoMergeView {
688+ if am == nil {
689+ return nil
690+ }
691+ v := &AutoMergeView{Mode: am.Mode.String(), EnabledBy: am.EnablerLabel, HeadShort: short(am.HeadID.String())}
692+ v.When, v.WhenAt = whenOf(now, am.EnabledAt)
693+ return v
694+}
695+
672696 // mrFacts formats the description, metadata, branch links and checks.
673697 func (s *Server) mrFacts(ctx context.Context, r *http.Request, d *repoData, p *MRPage, res ports.MergeRequestDetail) error {
674698 m := res.MergeRequest
@@ -790,6 +814,8 @@ func (s *Server) mergeBox(d *repoData, n int64, source, head string, canMarkRead
790814 CanMarkRead: canMarkRead,
791815 CanDeleteBranch: source != d.repo.DefaultBranch,
792816 Mergeability: mg,
817+ AutoAction: mrHref(d.name(), n, "auto-merge"), CancelAutoAction: mrHref(d.name(), n, "auto-merge/cancel"),
818+ CanAutoMerge: d.repo.Settings.AllowAutoMerge && s.cfg.Runs != nil,
793819 }
794820 var lines []string
795821 cmd := ""
@@ -11,6 +11,7 @@ import (
11 "net/url"11 "net/url"
12 "strconv"12 "strconv"
13 "strings"13 "strings"
14+ "time"
14 15
15 "github.com/a-h/templ"16 "github.com/a-h/templ"
16 17
@@ -202,6 +203,18 @@ type MergeBox struct {
202 Fingerprint string203 Fingerprint string
203 // Error is why the last merge was refused, shown in the box.204 // Error is why the last merge was refused, shown in the box.
204 Error string205 Error string
206+ // AutoAction and CancelAutoAction post to the auto-merge routes.
207+ AutoAction, CancelAutoAction string
208+ // CanAutoMerge offers "Merge when ready": the repository allows
209+ // auto-merge and the server has CI to wait for.
210+ CanAutoMerge bool
211+ // AutoMerge is the pending auto-merge, nil when off.
212+ AutoMerge *AutoMergeView
213+}
214+
215+// AutoMergeView is a pending auto-merge, ready to show.
216+type AutoMergeView struct {
217+ Mode, EnabledBy, When, WhenAt, HeadShort string
205 }218 }
206 219
207 // ModeOption is a merge mode the repository allows. Disabled says that the220 // ModeOption is a merge mode the repository allows. Disabled says that the
@@ -666,9 +679,20 @@ func (s *Server) mrBox(ctx context.Context, d *repoData, res ports.MergeRequestD
666 if m.IsDraft() {679 if m.IsDraft() {
667 box.ReadyAction = mrHref(d.name(), m.Number, "ready")680 box.ReadyAction = mrHref(d.name(), m.Number, "ready")
668 }681 }
682+ box.AutoMerge = autoMergeView(s.cfg.Now(), m.AutoMerge)
669 return box683 return box
670 }684 }
671 685
686+// autoMergeView is the pending auto-merge ready to show, nil when off.
687+func autoMergeView(now time.Time, am *domain.AutoMerge) *AutoMergeView {
688+ if am == nil {
689+ return nil
690+ }
691+ v := &AutoMergeView{Mode: am.Mode.String(), EnabledBy: am.EnablerLabel, HeadShort: short(am.HeadID.String())}
692+ v.When, v.WhenAt = whenOf(now, am.EnabledAt)
693+ return v
694+}
695+
672 // mrFacts formats the description, metadata, branch links and checks.696 // mrFacts formats the description, metadata, branch links and checks.
673 func (s *Server) mrFacts(ctx context.Context, r *http.Request, d *repoData, p *MRPage, res ports.MergeRequestDetail) error {697 func (s *Server) mrFacts(ctx context.Context, r *http.Request, d *repoData, p *MRPage, res ports.MergeRequestDetail) error {
674 m := res.MergeRequest698 m := res.MergeRequest
@@ -790,6 +814,8 @@ func (s *Server) mergeBox(d *repoData, n int64, source, head string, canMarkRead
790 CanMarkRead: canMarkRead,814 CanMarkRead: canMarkRead,
791 CanDeleteBranch: source != d.repo.DefaultBranch,815 CanDeleteBranch: source != d.repo.DefaultBranch,
792 Mergeability: mg,816 Mergeability: mg,
817+ AutoAction: mrHref(d.name(), n, "auto-merge"), CancelAutoAction: mrHref(d.name(), n, "auto-merge/cancel"),
818+ CanAutoMerge: d.repo.Settings.AllowAutoMerge && s.cfg.Runs != nil,
793 }819 }
794 var lines []string820 var lines []string
795 cmd := ""821 cmd := ""
M internal/adapters/web/mr.templ +23 -0
@@ -508,6 +508,20 @@ templ mergeMenu(p MRPage) {
508508 </form>
509509 } else if !p.Box.HeadGone {
510510 @mrMergeabilitySlot(p.Box.Mergeability)
511+ if p.Box.AutoMerge != nil {
512+ <form class="d-acts" method="post" action={ templ.SafeURL(p.Box.CancelAutoAction) }>
513+ <p class="dim" role="status">
514+ Auto-merge: { p.Box.AutoMerge.Mode } when ready, enabled by { p.Box.AutoMerge.EnabledBy }
515+ if p.Box.AutoMerge.When != "" {
516+ { " " }<time datetime={ p.Box.AutoMerge.WhenAt }>{ p.Box.AutoMerge.When }</time>
517+ }
518+ { " " }(head { p.Box.AutoMerge.HeadShort })
519+ </p>
520+ <div class="d-btns">
521+ <button type="submit" class="btn">Cancel auto-merge</button>
522+ </div>
523+ </form>
524+ }
511525 <form class="d-acts" method="post" action={ templ.SafeURL(p.Box.MergeAction) }>
512526 <input type="hidden" name="head_id" value={ p.Box.Head }/>
513527 <fieldset class="d-modes">
@@ -544,6 +558,15 @@ templ mergeMenu(p MRPage) {
544558 :disabled="!this.form.querySelector('input[name=mode]:checked:not(:disabled)')"
545559 :title="(this.form.querySelector('input[name=mode]:checked') || {}).title || ''"
546560 >Merge into { p.Target }</button>
561+ if p.Box.CanAutoMerge {
562+ <button
563+ type="submit"
564+ class="btn"
565+ formaction={ templ.SafeURL(p.Box.AutoAction) }
566+ disabled?={ len(p.Box.Modes) == 0 }
567+ title="merge once the checks pass"
568+ >Merge when ready</button>
569+ }
547570 </div>
548571 </form>
549572 }
@@ -508,6 +508,20 @@ templ mergeMenu(p MRPage) {
508 </form>508 </form>
509 } else if !p.Box.HeadGone {509 } else if !p.Box.HeadGone {
510 @mrMergeabilitySlot(p.Box.Mergeability)510 @mrMergeabilitySlot(p.Box.Mergeability)
511+ if p.Box.AutoMerge != nil {
512+ <form class="d-acts" method="post" action={ templ.SafeURL(p.Box.CancelAutoAction) }>
513+ <p class="dim" role="status">
514+ Auto-merge: { p.Box.AutoMerge.Mode } when ready, enabled by { p.Box.AutoMerge.EnabledBy }
515+ if p.Box.AutoMerge.When != "" {
516+ { " " }<time datetime={ p.Box.AutoMerge.WhenAt }>{ p.Box.AutoMerge.When }</time>
517+ }
518+ { " " }(head { p.Box.AutoMerge.HeadShort })
519+ </p>
520+ <div class="d-btns">
521+ <button type="submit" class="btn">Cancel auto-merge</button>
522+ </div>
523+ </form>
524+ }
511 <form class="d-acts" method="post" action={ templ.SafeURL(p.Box.MergeAction) }>525 <form class="d-acts" method="post" action={ templ.SafeURL(p.Box.MergeAction) }>
512 <input type="hidden" name="head_id" value={ p.Box.Head }/>526 <input type="hidden" name="head_id" value={ p.Box.Head }/>
513 <fieldset class="d-modes">527 <fieldset class="d-modes">
@@ -544,6 +558,15 @@ templ mergeMenu(p MRPage) {
544 :disabled="!this.form.querySelector('input[name=mode]:checked:not(:disabled)')"558 :disabled="!this.form.querySelector('input[name=mode]:checked:not(:disabled)')"
545 :title="(this.form.querySelector('input[name=mode]:checked') || {}).title || ''"559 :title="(this.form.querySelector('input[name=mode]:checked') || {}).title || ''"
546 >Merge into { p.Target }</button>560 >Merge into { p.Target }</button>
561+ if p.Box.CanAutoMerge {
562+ <button
563+ type="submit"
564+ class="btn"
565+ formaction={ templ.SafeURL(p.Box.AutoAction) }
566+ disabled?={ len(p.Box.Modes) == 0 }
567+ title="merge once the checks pass"
568+ >Merge when ready</button>
569+ }
547 </div>570 </div>
548 </form>571 </form>
549 }572 }
M internal/adapters/web/mr_post.go +62 -0
@@ -391,6 +391,68 @@ func (s *Server) mrMerge(ctx context.Context, r *http.Request) (string, string,
391391 return back, back, nil
392392 }
393393
394+// mrAutoMerge is POST /<repo>/merge-requests/<n>/auto-merge: the form of the
395+// merge (mode, head_id) asks to merge once the checks pass. The server records
396+// the head as it is when it enables (the params carry no head); head_id is only
397+// validated.
398+func (s *Server) mrAutoMerge(ctx context.Context, r *http.Request) (string, string, error) {
399+ repo := r.PathValue("repo")
400+ n, err := number(r)
401+ if err != nil {
402+ return "", "", err
403+ }
404+ back := mrHref(repo, n)
405+ var mode domain.MergeMode
406+ switch r.PostFormValue("mode") {
407+ case "fast-forward":
408+ mode = domain.MergeModeFastForward
409+ case "squash":
410+ mode = domain.MergeModeSquash
411+ case "merge":
412+ mode = domain.MergeModeMerge
413+ default:
414+ err := formError("mode must be fast-forward, squash or merge")
415+ return "", back, &rerender{status: http.StatusBadRequest, msg: err.Error(), err: err}
416+ }
417+ name, err := domain.ParseRepoName(repo)
418+ if err != nil {
419+ return "", back, err
420+ }
421+ if _, err := headID(r.PostFormValue("head_id")); err != nil {
422+ return "", back, err
423+ }
424+ _, err = s.cfg.MergeRequests.EnableAutoMerge(ctx, principal(ctx), name, n, ports.EnableAutoMergeParams{Mode: mode})
425+ switch {
426+ case errors.Is(err, domain.ErrPreconditionFailed), errors.Is(err, domain.ErrConflict):
427+ return "", back, &rerender{status: http.StatusConflict, msg: rule(err.Error(), "the merge request is not in a state that allows this."), err: err}
428+ case err != nil:
429+ return "", back, err
430+ }
431+ return back, back, nil
432+}
433+
434+// mrCancelAutoMerge is POST /<repo>/merge-requests/<n>/auto-merge/cancel.
435+func (s *Server) mrCancelAutoMerge(ctx context.Context, r *http.Request) (string, string, error) {
436+ repo := r.PathValue("repo")
437+ n, err := number(r)
438+ if err != nil {
439+ return "", "", err
440+ }
441+ back := mrHref(repo, n)
442+ name, err := domain.ParseRepoName(repo)
443+ if err != nil {
444+ return "", back, err
445+ }
446+ _, err = s.cfg.MergeRequests.CancelAutoMerge(ctx, principal(ctx), name, n)
447+ switch {
448+ case errors.Is(err, domain.ErrPreconditionFailed), errors.Is(err, domain.ErrConflict):
449+ return "", back, &rerender{status: http.StatusConflict, msg: rule(err.Error(), "the merge request is not in a state that allows this."), err: err}
450+ case err != nil:
451+ return "", back, err
452+ }
453+ return back, back, nil
454+}
455+
394456 // mrRead is POST /<repo>/merge-requests/<n>/read: the owner marks the head
395457 // they were shown as read. Reading a page never does it (see the top of mr.go).
396458 func (s *Server) mrRead(ctx context.Context, r *http.Request) (string, string, error) {
@@ -391,6 +391,68 @@ func (s *Server) mrMerge(ctx context.Context, r *http.Request) (string, string,
391 return back, back, nil391 return back, back, nil
392 }392 }
393 393
394+// mrAutoMerge is POST /<repo>/merge-requests/<n>/auto-merge: the form of the
395+// merge (mode, head_id) asks to merge once the checks pass. The server records
396+// the head as it is when it enables (the params carry no head); head_id is only
397+// validated.
398+func (s *Server) mrAutoMerge(ctx context.Context, r *http.Request) (string, string, error) {
399+ repo := r.PathValue("repo")
400+ n, err := number(r)
401+ if err != nil {
402+ return "", "", err
403+ }
404+ back := mrHref(repo, n)
405+ var mode domain.MergeMode
406+ switch r.PostFormValue("mode") {
407+ case "fast-forward":
408+ mode = domain.MergeModeFastForward
409+ case "squash":
410+ mode = domain.MergeModeSquash
411+ case "merge":
412+ mode = domain.MergeModeMerge
413+ default:
414+ err := formError("mode must be fast-forward, squash or merge")
415+ return "", back, &rerender{status: http.StatusBadRequest, msg: err.Error(), err: err}
416+ }
417+ name, err := domain.ParseRepoName(repo)
418+ if err != nil {
419+ return "", back, err
420+ }
421+ if _, err := headID(r.PostFormValue("head_id")); err != nil {
422+ return "", back, err
423+ }
424+ _, err = s.cfg.MergeRequests.EnableAutoMerge(ctx, principal(ctx), name, n, ports.EnableAutoMergeParams{Mode: mode})
425+ switch {
426+ case errors.Is(err, domain.ErrPreconditionFailed), errors.Is(err, domain.ErrConflict):
427+ return "", back, &rerender{status: http.StatusConflict, msg: rule(err.Error(), "the merge request is not in a state that allows this."), err: err}
428+ case err != nil:
429+ return "", back, err
430+ }
431+ return back, back, nil
432+}
433+
434+// mrCancelAutoMerge is POST /<repo>/merge-requests/<n>/auto-merge/cancel.
435+func (s *Server) mrCancelAutoMerge(ctx context.Context, r *http.Request) (string, string, error) {
436+ repo := r.PathValue("repo")
437+ n, err := number(r)
438+ if err != nil {
439+ return "", "", err
440+ }
441+ back := mrHref(repo, n)
442+ name, err := domain.ParseRepoName(repo)
443+ if err != nil {
444+ return "", back, err
445+ }
446+ _, err = s.cfg.MergeRequests.CancelAutoMerge(ctx, principal(ctx), name, n)
447+ switch {
448+ case errors.Is(err, domain.ErrPreconditionFailed), errors.Is(err, domain.ErrConflict):
449+ return "", back, &rerender{status: http.StatusConflict, msg: rule(err.Error(), "the merge request is not in a state that allows this."), err: err}
450+ case err != nil:
451+ return "", back, err
452+ }
453+ return back, back, nil
454+}
455+
394 // mrRead is POST /<repo>/merge-requests/<n>/read: the owner marks the head456 // mrRead is POST /<repo>/merge-requests/<n>/read: the owner marks the head
395 // they were shown as read. Reading a page never does it (see the top of mr.go).457 // they were shown as read. Reading a page never does it (see the top of mr.go).
396 func (s *Server) mrRead(ctx context.Context, r *http.Request) (string, string, error) {458 func (s *Server) mrRead(ctx context.Context, r *http.Request) (string, string, error) {
M internal/adapters/web/mr_templ.go +499 -350
@@ -2571,185 +2571,334 @@ func mergeMenu(p MRPage) templ.Component {
25712571 if templ_7745c5c3_Err != nil {
25722572 return templ_7745c5c3_Err
25732573 }
2574- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 240, " <form class=\"d-acts\" method=\"post\" action=\"")
2574+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 240, " ")
25752575 if templ_7745c5c3_Err != nil {
25762576 return templ_7745c5c3_Err
25772577 }
2578- var templ_7745c5c3_Var120 templ.SafeURL
2579- templ_7745c5c3_Var120, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.Box.MergeAction))
2578+ if p.Box.AutoMerge != nil {
2579+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 241, "<form class=\"d-acts\" method=\"post\" action=\"")
2580+ if templ_7745c5c3_Err != nil {
2581+ return templ_7745c5c3_Err
2582+ }
2583+ var templ_7745c5c3_Var120 templ.SafeURL
2584+ templ_7745c5c3_Var120, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.Box.CancelAutoAction))
2585+ if templ_7745c5c3_Err != nil {
2586+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 512, Col: 86}
2587+ }
2588+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var120))
2589+ if templ_7745c5c3_Err != nil {
2590+ return templ_7745c5c3_Err
2591+ }
2592+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 242, "\"><p class=\"dim\" role=\"status\">Auto-merge: ")
2593+ if templ_7745c5c3_Err != nil {
2594+ return templ_7745c5c3_Err
2595+ }
2596+ var templ_7745c5c3_Var121 string
2597+ templ_7745c5c3_Var121, templ_7745c5c3_Err = templ.JoinStringErrs(p.Box.AutoMerge.Mode)
2598+ if templ_7745c5c3_Err != nil {
2599+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 514, Col: 41}
2600+ }
2601+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var121))
2602+ if templ_7745c5c3_Err != nil {
2603+ return templ_7745c5c3_Err
2604+ }
2605+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 243, " when ready, enabled by ")
2606+ if templ_7745c5c3_Err != nil {
2607+ return templ_7745c5c3_Err
2608+ }
2609+ var templ_7745c5c3_Var122 string
2610+ templ_7745c5c3_Var122, templ_7745c5c3_Err = templ.JoinStringErrs(p.Box.AutoMerge.EnabledBy)
2611+ if templ_7745c5c3_Err != nil {
2612+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 514, Col: 94}
2613+ }
2614+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var122))
2615+ if templ_7745c5c3_Err != nil {
2616+ return templ_7745c5c3_Err
2617+ }
2618+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 244, " ")
2619+ if templ_7745c5c3_Err != nil {
2620+ return templ_7745c5c3_Err
2621+ }
2622+ if p.Box.AutoMerge.When != "" {
2623+ var templ_7745c5c3_Var123 string
2624+ templ_7745c5c3_Var123, templ_7745c5c3_Err = templ.JoinStringErrs(" ")
2625+ if templ_7745c5c3_Err != nil {
2626+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 516, Col: 13}
2627+ }
2628+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var123))
2629+ if templ_7745c5c3_Err != nil {
2630+ return templ_7745c5c3_Err
2631+ }
2632+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 245, "<time datetime=\"")
2633+ if templ_7745c5c3_Err != nil {
2634+ return templ_7745c5c3_Err
2635+ }
2636+ var templ_7745c5c3_Var124 string
2637+ templ_7745c5c3_Var124, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.Box.AutoMerge.WhenAt)
2638+ if templ_7745c5c3_Err != nil {
2639+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 516, Col: 54}
2640+ }
2641+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var124)
2642+ if templ_7745c5c3_Err != nil {
2643+ return templ_7745c5c3_Err
2644+ }
2645+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 246, "\">")
2646+ if templ_7745c5c3_Err != nil {
2647+ return templ_7745c5c3_Err
2648+ }
2649+ var templ_7745c5c3_Var125 string
2650+ templ_7745c5c3_Var125, templ_7745c5c3_Err = templ.JoinStringErrs(p.Box.AutoMerge.When)
2651+ if templ_7745c5c3_Err != nil {
2652+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 516, Col: 79}
2653+ }
2654+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var125))
2655+ if templ_7745c5c3_Err != nil {
2656+ return templ_7745c5c3_Err
2657+ }
2658+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 247, "</time> ")
2659+ if templ_7745c5c3_Err != nil {
2660+ return templ_7745c5c3_Err
2661+ }
2662+ }
2663+ var templ_7745c5c3_Var126 string
2664+ templ_7745c5c3_Var126, templ_7745c5c3_Err = templ.JoinStringErrs(" ")
2665+ if templ_7745c5c3_Err != nil {
2666+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 518, Col: 12}
2667+ }
2668+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var126))
2669+ if templ_7745c5c3_Err != nil {
2670+ return templ_7745c5c3_Err
2671+ }
2672+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 248, "(head ")
2673+ if templ_7745c5c3_Err != nil {
2674+ return templ_7745c5c3_Err
2675+ }
2676+ var templ_7745c5c3_Var127 string
2677+ templ_7745c5c3_Var127, templ_7745c5c3_Err = templ.JoinStringErrs(p.Box.AutoMerge.HeadShort)
2678+ if templ_7745c5c3_Err != nil {
2679+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 518, Col: 47}
2680+ }
2681+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var127))
2682+ if templ_7745c5c3_Err != nil {
2683+ return templ_7745c5c3_Err
2684+ }
2685+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 249, ")</p><div class=\"d-btns\"><button type=\"submit\" class=\"btn\">Cancel auto-merge</button></div></form>")
2686+ if templ_7745c5c3_Err != nil {
2687+ return templ_7745c5c3_Err
2688+ }
2689+ }
2690+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 250, " <form class=\"d-acts\" method=\"post\" action=\"")
25802691 if templ_7745c5c3_Err != nil {
2581- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 511, Col: 80}
2692+ return templ_7745c5c3_Err
2693+ }
2694+ var templ_7745c5c3_Var128 templ.SafeURL
2695+ templ_7745c5c3_Var128, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.Box.MergeAction))
2696+ if templ_7745c5c3_Err != nil {
2697+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 525, Col: 80}
25822698 }
2583- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var120))
2699+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var128))
25842700 if templ_7745c5c3_Err != nil {
25852701 return templ_7745c5c3_Err
25862702 }
2587- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 241, "\"><input type=\"hidden\" name=\"head_id\" value=\"")
2703+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 251, "\"><input type=\"hidden\" name=\"head_id\" value=\"")
25882704 if templ_7745c5c3_Err != nil {
25892705 return templ_7745c5c3_Err
25902706 }
2591- var templ_7745c5c3_Var121 string
2592- templ_7745c5c3_Var121, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.Box.Head)
2707+ var templ_7745c5c3_Var129 string
2708+ templ_7745c5c3_Var129, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.Box.Head)
25932709 if templ_7745c5c3_Err != nil {
2594- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 512, Col: 59}
2710+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 526, Col: 59}
25952711 }
2596- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var121)
2712+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var129)
25972713 if templ_7745c5c3_Err != nil {
25982714 return templ_7745c5c3_Err
25992715 }
2600- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 242, "\"><fieldset class=\"d-modes\"><legend class=\"sr\">merge mode</legend> ")
2716+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 252, "\"><fieldset class=\"d-modes\"><legend class=\"sr\">merge mode</legend> ")
26012717 if templ_7745c5c3_Err != nil {
26022718 return templ_7745c5c3_Err
26032719 }
26042720 for i, m := range p.Box.Modes {
2605- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 243, "<label><input type=\"radio\" name=\"mode\" value=\"")
2721+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 253, "<label><input type=\"radio\" name=\"mode\" value=\"")
26062722 if templ_7745c5c3_Err != nil {
26072723 return templ_7745c5c3_Err
26082724 }
2609- var templ_7745c5c3_Var122 string
2610- templ_7745c5c3_Var122, templ_7745c5c3_Err = templ.ResolveAttributeValue(m.Value)
2725+ var templ_7745c5c3_Var130 string
2726+ templ_7745c5c3_Var130, templ_7745c5c3_Err = templ.ResolveAttributeValue(m.Value)
26112727 if templ_7745c5c3_Err != nil {
2612- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 520, Col: 24}
2728+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 534, Col: 24}
26132729 }
2614- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var122)
2730+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var130)
26152731 if templ_7745c5c3_Err != nil {
26162732 return templ_7745c5c3_Err
26172733 }
2618- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 244, "\"")
2734+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 254, "\"")
26192735 if templ_7745c5c3_Err != nil {
26202736 return templ_7745c5c3_Err
26212737 }
26222738 if i == p.Box.Checked() {
2623- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 245, " checked")
2739+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 255, " checked")
26242740 if templ_7745c5c3_Err != nil {
26252741 return templ_7745c5c3_Err
26262742 }
26272743 }
26282744 if m.Disabled {
2629- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 246, " disabled")
2745+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 256, " disabled")
26302746 if templ_7745c5c3_Err != nil {
26312747 return templ_7745c5c3_Err
26322748 }
26332749 }
2634- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 247, " title=\"")
2750+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 257, " title=\"")
26352751 if templ_7745c5c3_Err != nil {
26362752 return templ_7745c5c3_Err
26372753 }
2638- var templ_7745c5c3_Var123 string
2639- templ_7745c5c3_Var123, templ_7745c5c3_Err = templ.ResolveAttributeValue(m.Reason)
2754+ var templ_7745c5c3_Var131 string
2755+ templ_7745c5c3_Var131, templ_7745c5c3_Err = templ.ResolveAttributeValue(m.Reason)
26402756 if templ_7745c5c3_Err != nil {
2641- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 523, Col: 25}
2757+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 537, Col: 25}
26422758 }
2643- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var123)
2759+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var131)
26442760 if templ_7745c5c3_Err != nil {
26452761 return templ_7745c5c3_Err
26462762 }
2647- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 248, "\" :disabled=\"this.value === 'fast-forward' ? q('[data-mergeability]').data.ffOk !== true : q('[data-mergeability]').data.mergeOk !== true\" :title=\"this.value === 'fast-forward' ? q('[data-mergeability]').data.ffReason : q('[data-mergeability]').data.mergeReason\"> ")
2763+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 258, "\" :disabled=\"this.value === 'fast-forward' ? q('[data-mergeability]').data.ffOk !== true : q('[data-mergeability]').data.mergeOk !== true\" :title=\"this.value === 'fast-forward' ? q('[data-mergeability]').data.ffReason : q('[data-mergeability]').data.mergeReason\"> ")
26482764 if templ_7745c5c3_Err != nil {
26492765 return templ_7745c5c3_Err
26502766 }
2651- var templ_7745c5c3_Var124 string
2652- templ_7745c5c3_Var124, templ_7745c5c3_Err = templ.JoinStringErrs(m.Label)
2767+ var templ_7745c5c3_Var132 string
2768+ templ_7745c5c3_Var132, templ_7745c5c3_Err = templ.JoinStringErrs(m.Label)
26532769 if templ_7745c5c3_Err != nil {
2654- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 527, Col: 17}
2770+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 541, Col: 17}
26552771 }
2656- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var124))
2772+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var132))
26572773 if templ_7745c5c3_Err != nil {
26582774 return templ_7745c5c3_Err
26592775 }
2660- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 249, " ")
2776+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 259, " ")
26612777 if templ_7745c5c3_Err != nil {
26622778 return templ_7745c5c3_Err
26632779 }
26642780 if i < 9 {
2665- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 250, "<kbd aria-hidden=\"true\">")
2781+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 260, "<kbd aria-hidden=\"true\">")
26662782 if templ_7745c5c3_Err != nil {
26672783 return templ_7745c5c3_Err
26682784 }
2669- var templ_7745c5c3_Var125 string
2670- templ_7745c5c3_Var125, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(i + 1))
2785+ var templ_7745c5c3_Var133 string
2786+ templ_7745c5c3_Var133, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(i + 1))
26712787 if templ_7745c5c3_Err != nil {
2672- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 529, Col: 46}
2788+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 543, Col: 46}
26732789 }
2674- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var125))
2790+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var133))
26752791 if templ_7745c5c3_Err != nil {
26762792 return templ_7745c5c3_Err
26772793 }
2678- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 251, "</kbd>")
2794+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 261, "</kbd>")
26792795 if templ_7745c5c3_Err != nil {
26802796 return templ_7745c5c3_Err
26812797 }
26822798 }
2683- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 252, "</label>")
2799+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 262, "</label>")
26842800 if templ_7745c5c3_Err != nil {
26852801 return templ_7745c5c3_Err
26862802 }
26872803 }
2688- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 253, "</fieldset>")
2804+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 263, "</fieldset>")
26892805 if templ_7745c5c3_Err != nil {
26902806 return templ_7745c5c3_Err
26912807 }
26922808 if p.Box.CanDeleteBranch {
2693- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 254, "<label class=\"d-check\"><input type=\"checkbox\" name=\"delete_branch\" value=\"1\"> delete ")
2809+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 264, "<label class=\"d-check\"><input type=\"checkbox\" name=\"delete_branch\" value=\"1\"> delete ")
26942810 if templ_7745c5c3_Err != nil {
26952811 return templ_7745c5c3_Err
26962812 }
2697- var templ_7745c5c3_Var126 string
2698- templ_7745c5c3_Var126, templ_7745c5c3_Err = templ.JoinStringErrs(p.Source)
2813+ var templ_7745c5c3_Var134 string
2814+ templ_7745c5c3_Var134, templ_7745c5c3_Err = templ.JoinStringErrs(p.Source)
26992815 if templ_7745c5c3_Err != nil {
2700- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 535, Col: 102}
2816+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 549, Col: 102}
27012817 }
2702- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var126))
2818+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var134))
27032819 if templ_7745c5c3_Err != nil {
27042820 return templ_7745c5c3_Err
27052821 }
2706- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 255, " after the merge <kbd aria-hidden=\"true\">D</kbd></label>")
2822+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 265, " after the merge <kbd aria-hidden=\"true\">D</kbd></label>")
27072823 if templ_7745c5c3_Err != nil {
27082824 return templ_7745c5c3_Err
27092825 }
27102826 }
2711- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 256, "<div class=\"d-btns\"><button type=\"submit\" class=\"btn primary\" data-default")
2827+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 266, "<div class=\"d-btns\"><button type=\"submit\" class=\"btn primary\" data-default")
27122828 if templ_7745c5c3_Err != nil {
27132829 return templ_7745c5c3_Err
27142830 }
27152831 if !p.Box.CanMerge() {
2716- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 257, " disabled")
2832+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 267, " disabled")
27172833 if templ_7745c5c3_Err != nil {
27182834 return templ_7745c5c3_Err
27192835 }
27202836 }
2721- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 258, " title=\"")
2837+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 268, " title=\"")
27222838 if templ_7745c5c3_Err != nil {
27232839 return templ_7745c5c3_Err
27242840 }
2725- var templ_7745c5c3_Var127 string
2726- templ_7745c5c3_Var127, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.Box.MergeTitle())
2841+ var templ_7745c5c3_Var135 string
2842+ templ_7745c5c3_Var135, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.Box.MergeTitle())
27272843 if templ_7745c5c3_Err != nil {
2728- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 543, Col: 33}
2844+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 557, Col: 33}
27292845 }
2730- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var127)
2846+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var135)
27312847 if templ_7745c5c3_Err != nil {
27322848 return templ_7745c5c3_Err
27332849 }
2734- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 259, "\" :disabled=\"!this.form.querySelector('input[name=mode]:checked:not(:disabled)')\" :title=\"(this.form.querySelector('input[name=mode]:checked') || {}).title || ''\">Merge into ")
2850+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 269, "\" :disabled=\"!this.form.querySelector('input[name=mode]:checked:not(:disabled)')\" :title=\"(this.form.querySelector('input[name=mode]:checked') || {}).title || ''\">Merge into ")
27352851 if templ_7745c5c3_Err != nil {
27362852 return templ_7745c5c3_Err
27372853 }
2738- var templ_7745c5c3_Var128 string
2739- templ_7745c5c3_Var128, templ_7745c5c3_Err = templ.JoinStringErrs(p.Target)
2854+ var templ_7745c5c3_Var136 string
2855+ templ_7745c5c3_Var136, templ_7745c5c3_Err = templ.JoinStringErrs(p.Target)
27402856 if templ_7745c5c3_Err != nil {
2741- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 546, Col: 28}
2857+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 560, Col: 28}
27422858 }
2743- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var128))
2859+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var136))
27442860 if templ_7745c5c3_Err != nil {
27452861 return templ_7745c5c3_Err
27462862 }
2747- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 260, "</button></div></form>")
2863+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 270, "</button> ")
2864+ if templ_7745c5c3_Err != nil {
2865+ return templ_7745c5c3_Err
2866+ }
2867+ if p.Box.CanAutoMerge {
2868+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 271, "<button type=\"submit\" class=\"btn\" formaction=\"")
2869+ if templ_7745c5c3_Err != nil {
2870+ return templ_7745c5c3_Err
2871+ }
2872+ var templ_7745c5c3_Var137 string
2873+ templ_7745c5c3_Var137, templ_7745c5c3_Err = templ.ResolveAttributeValue(templ.SafeURL(p.Box.AutoAction))
2874+ if templ_7745c5c3_Err != nil {
2875+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 565, Col: 52}
2876+ }
2877+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var137)
2878+ if templ_7745c5c3_Err != nil {
2879+ return templ_7745c5c3_Err
2880+ }
2881+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 272, "\"")
2882+ if templ_7745c5c3_Err != nil {
2883+ return templ_7745c5c3_Err
2884+ }
2885+ if len(p.Box.Modes) == 0 {
2886+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 273, " disabled")
2887+ if templ_7745c5c3_Err != nil {
2888+ return templ_7745c5c3_Err
2889+ }
2890+ }
2891+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 274, " title=\"merge once the checks pass\">Merge when ready</button>")
2892+ if templ_7745c5c3_Err != nil {
2893+ return templ_7745c5c3_Err
2894+ }
2895+ }
2896+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 275, "</div></form>")
27482897 if templ_7745c5c3_Err != nil {
27492898 return templ_7745c5c3_Err
27502899 }
27512900 }
2752- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 261, "</div></details>")
2901+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 276, "</div></details>")
27532902 if templ_7745c5c3_Err != nil {
27542903 return templ_7745c5c3_Err
27552904 }
@@ -2775,182 +2924,182 @@ func MRMergeability(v MergeabilityView) templ.Component {
27752924 }()
27762925 }
27772926 ctx = templ.InitializeContext(ctx)
2778- templ_7745c5c3_Var129 := templ.GetChildren(ctx)
2779- if templ_7745c5c3_Var129 == nil {
2780- templ_7745c5c3_Var129 = templ.NopComponent
2927+ templ_7745c5c3_Var138 := templ.GetChildren(ctx)
2928+ if templ_7745c5c3_Var138 == nil {
2929+ templ_7745c5c3_Var138 = templ.NopComponent
27812930 }
27822931 ctx = templ.ClearChildren(ctx)
2783- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 262, "<span data-mergeability data-state=\"")
2932+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 277, "<span data-mergeability data-state=\"")
27842933 if templ_7745c5c3_Err != nil {
27852934 return templ_7745c5c3_Err
27862935 }
2787- var templ_7745c5c3_Var130 string
2788- templ_7745c5c3_Var130, templ_7745c5c3_Err = templ.ResolveAttributeValue(v.State)
2936+ var templ_7745c5c3_Var139 string
2937+ templ_7745c5c3_Var139, templ_7745c5c3_Err = templ.ResolveAttributeValue(v.State)
27892938 if templ_7745c5c3_Err != nil {
2790- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 559, Col: 22}
2939+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 582, Col: 22}
27912940 }
2792- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var130)
2941+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var139)
27932942 if templ_7745c5c3_Err != nil {
27942943 return templ_7745c5c3_Err
27952944 }
2796- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 263, "\" data-ff-ok=\"")
2945+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 278, "\" data-ff-ok=\"")
27972946 if templ_7745c5c3_Err != nil {
27982947 return templ_7745c5c3_Err
27992948 }
2800- var templ_7745c5c3_Var131 string
2801- templ_7745c5c3_Var131, templ_7745c5c3_Err = templ.ResolveAttributeValue(strconv.FormatBool(v.FFOk))
2949+ var templ_7745c5c3_Var140 string
2950+ templ_7745c5c3_Var140, templ_7745c5c3_Err = templ.ResolveAttributeValue(strconv.FormatBool(v.FFOk))
28022951 if templ_7745c5c3_Err != nil {
2803- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 560, Col: 41}
2952+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 583, Col: 41}
28042953 }
2805- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var131)
2954+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var140)
28062955 if templ_7745c5c3_Err != nil {
28072956 return templ_7745c5c3_Err
28082957 }
2809- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 264, "\" data-merge-ok=\"")
2958+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 279, "\" data-merge-ok=\"")
28102959 if templ_7745c5c3_Err != nil {
28112960 return templ_7745c5c3_Err
28122961 }
2813- var templ_7745c5c3_Var132 string
2814- templ_7745c5c3_Var132, templ_7745c5c3_Err = templ.ResolveAttributeValue(strconv.FormatBool(v.MergeOk))
2962+ var templ_7745c5c3_Var141 string
2963+ templ_7745c5c3_Var141, templ_7745c5c3_Err = templ.ResolveAttributeValue(strconv.FormatBool(v.MergeOk))
28152964 if templ_7745c5c3_Err != nil {
2816- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 561, Col: 47}
2965+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 584, Col: 47}
28172966 }
2818- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var132)
2967+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var141)
28192968 if templ_7745c5c3_Err != nil {
28202969 return templ_7745c5c3_Err
28212970 }
2822- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 265, "\" data-ff-reason=\"")
2971+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 280, "\" data-ff-reason=\"")
28232972 if templ_7745c5c3_Err != nil {
28242973 return templ_7745c5c3_Err
28252974 }
2826- var templ_7745c5c3_Var133 string
2827- templ_7745c5c3_Var133, templ_7745c5c3_Err = templ.ResolveAttributeValue(v.FFReason)
2975+ var templ_7745c5c3_Var142 string
2976+ templ_7745c5c3_Var142, templ_7745c5c3_Err = templ.ResolveAttributeValue(v.FFReason)
28282977 if templ_7745c5c3_Err != nil {
2829- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 562, Col: 29}
2978+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 585, Col: 29}
28302979 }
2831- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var133)
2980+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var142)
28322981 if templ_7745c5c3_Err != nil {
28332982 return templ_7745c5c3_Err
28342983 }
2835- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 266, "\" data-merge-reason=\"")
2984+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 281, "\" data-merge-reason=\"")
28362985 if templ_7745c5c3_Err != nil {
28372986 return templ_7745c5c3_Err
28382987 }
2839- var templ_7745c5c3_Var134 string
2840- templ_7745c5c3_Var134, templ_7745c5c3_Err = templ.ResolveAttributeValue(v.MergeReason)
2988+ var templ_7745c5c3_Var143 string
2989+ templ_7745c5c3_Var143, templ_7745c5c3_Err = templ.ResolveAttributeValue(v.MergeReason)
28412990 if templ_7745c5c3_Err != nil {
2842- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 563, Col: 35}
2991+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 586, Col: 35}
28432992 }
2844- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var134)
2993+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var143)
28452994 if templ_7745c5c3_Err != nil {
28462995 return templ_7745c5c3_Err
28472996 }
2848- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 267, "\"><span class=\"badge\" data-state=\"")
2997+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 282, "\"><span class=\"badge\" data-state=\"")
28492998 if templ_7745c5c3_Err != nil {
28502999 return templ_7745c5c3_Err
28513000 }
2852- var templ_7745c5c3_Var135 string
2853- templ_7745c5c3_Var135, templ_7745c5c3_Err = templ.ResolveAttributeValue(v.State)
3001+ var templ_7745c5c3_Var144 string
3002+ templ_7745c5c3_Var144, templ_7745c5c3_Err = templ.ResolveAttributeValue(v.State)
28543003 if templ_7745c5c3_Err != nil {
2855- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 565, Col: 42}
3004+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 588, Col: 42}
28563005 }
2857- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var135)
3006+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var144)
28583007 if templ_7745c5c3_Err != nil {
28593008 return templ_7745c5c3_Err
28603009 }
2861- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 268, "\">")
3010+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 283, "\">")
28623011 if templ_7745c5c3_Err != nil {
28633012 return templ_7745c5c3_Err
28643013 }
2865- var templ_7745c5c3_Var136 string
2866- templ_7745c5c3_Var136, templ_7745c5c3_Err = templ.JoinStringErrs(v.Label)
3014+ var templ_7745c5c3_Var145 string
3015+ templ_7745c5c3_Var145, templ_7745c5c3_Err = templ.JoinStringErrs(v.Label)
28673016 if templ_7745c5c3_Err != nil {
2868- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 565, Col: 54}
3017+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 588, Col: 54}
28693018 }
2870- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var136))
3019+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var145))
28713020 if templ_7745c5c3_Err != nil {
28723021 return templ_7745c5c3_Err
28733022 }
2874- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 269, "</span> ")
3023+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 284, "</span> ")
28753024 if templ_7745c5c3_Err != nil {
28763025 return templ_7745c5c3_Err
28773026 }
28783027 if v.Detail != "" {
2879- var templ_7745c5c3_Var137 string
2880- templ_7745c5c3_Var137, templ_7745c5c3_Err = templ.JoinStringErrs(" ")
3028+ var templ_7745c5c3_Var146 string
3029+ templ_7745c5c3_Var146, templ_7745c5c3_Err = templ.JoinStringErrs(" ")
28813030 if templ_7745c5c3_Err != nil {
2882- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 567, Col: 8}
3031+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 590, Col: 8}
28833032 }
2884- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var137))
3033+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var146))
28853034 if templ_7745c5c3_Err != nil {
28863035 return templ_7745c5c3_Err
28873036 }
2888- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 270, "<span class=\"dim\">")
3037+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 285, "<span class=\"dim\">")
28893038 if templ_7745c5c3_Err != nil {
28903039 return templ_7745c5c3_Err
28913040 }
2892- var templ_7745c5c3_Var138 string
2893- templ_7745c5c3_Var138, templ_7745c5c3_Err = templ.JoinStringErrs(v.Detail)
3041+ var templ_7745c5c3_Var147 string
3042+ templ_7745c5c3_Var147, templ_7745c5c3_Err = templ.JoinStringErrs(v.Detail)
28943043 if templ_7745c5c3_Err != nil {
2895- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 567, Col: 38}
3044+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 590, Col: 38}
28963045 }
2897- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var138))
3046+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var147))
28983047 if templ_7745c5c3_Err != nil {
28993048 return templ_7745c5c3_Err
29003049 }
2901- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 271, "</span>")
3050+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 286, "</span>")
29023051 if templ_7745c5c3_Err != nil {
29033052 return templ_7745c5c3_Err
29043053 }
29053054 }
2906- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 272, "</span> ")
3055+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 287, "</span> ")
29073056 if templ_7745c5c3_Err != nil {
29083057 return templ_7745c5c3_Err
29093058 }
29103059 if len(v.Paths) > 0 {
2911- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 273, "<ul class=\"mg-paths\" aria-label=\"conflicting files\">")
3060+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 288, "<ul class=\"mg-paths\" aria-label=\"conflicting files\">")
29123061 if templ_7745c5c3_Err != nil {
29133062 return templ_7745c5c3_Err
29143063 }
29153064 for _, path := range v.Paths {
2916- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 274, "<li><code>")
3065+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 289, "<li><code>")
29173066 if templ_7745c5c3_Err != nil {
29183067 return templ_7745c5c3_Err
29193068 }
2920- var templ_7745c5c3_Var139 string
2921- templ_7745c5c3_Var139, templ_7745c5c3_Err = templ.JoinStringErrs(path)
3069+ var templ_7745c5c3_Var148 string
3070+ templ_7745c5c3_Var148, templ_7745c5c3_Err = templ.JoinStringErrs(path)
29223071 if templ_7745c5c3_Err != nil {
2923- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 573, Col: 20}
3072+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 596, Col: 20}
29243073 }
2925- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var139))
3074+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var148))
29263075 if templ_7745c5c3_Err != nil {
29273076 return templ_7745c5c3_Err
29283077 }
2929- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 275, "</code></li>")
3078+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 290, "</code></li>")
29303079 if templ_7745c5c3_Err != nil {
29313080 return templ_7745c5c3_Err
29323081 }
29333082 }
2934- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 276, "</ul>")
3083+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 291, "</ul>")
29353084 if templ_7745c5c3_Err != nil {
29363085 return templ_7745c5c3_Err
29373086 }
29383087 }
29393088 if v.PathsNote != "" {
2940- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 277, "<p class=\"dim\">")
3089+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 292, "<p class=\"dim\">")
29413090 if templ_7745c5c3_Err != nil {
29423091 return templ_7745c5c3_Err
29433092 }
2944- var templ_7745c5c3_Var140 string
2945- templ_7745c5c3_Var140, templ_7745c5c3_Err = templ.JoinStringErrs(v.PathsNote)
3093+ var templ_7745c5c3_Var149 string
3094+ templ_7745c5c3_Var149, templ_7745c5c3_Err = templ.JoinStringErrs(v.PathsNote)
29463095 if templ_7745c5c3_Err != nil {
2947- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 578, Col: 30}
3096+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 601, Col: 30}
29483097 }
2949- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var140))
3098+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var149))
29503099 if templ_7745c5c3_Err != nil {
29513100 return templ_7745c5c3_Err
29523101 }
2953- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 278, "</p>")
3102+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 293, "</p>")
29543103 if templ_7745c5c3_Err != nil {
29553104 return templ_7745c5c3_Err
29563105 }
@@ -2977,12 +3126,12 @@ func mrMergeabilitySlot(v MergeabilityView) templ.Component {
29773126 }()
29783127 }
29793128 ctx = templ.InitializeContext(ctx)
2980- templ_7745c5c3_Var141 := templ.GetChildren(ctx)
2981- if templ_7745c5c3_Var141 == nil {
2982- templ_7745c5c3_Var141 = templ.NopComponent
3129+ templ_7745c5c3_Var150 := templ.GetChildren(ctx)
3130+ if templ_7745c5c3_Var150 == nil {
3131+ templ_7745c5c3_Var150 = templ.NopComponent
29833132 }
29843133 ctx = templ.ClearChildren(ctx)
2985- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 279, "<div id=\"mr-mergeability\" class=\"live-slot\" role=\"status\" data-slot>")
3134+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 294, "<div id=\"mr-mergeability\" class=\"live-slot\" role=\"status\" data-slot>")
29863135 if templ_7745c5c3_Err != nil {
29873136 return templ_7745c5c3_Err
29883137 }
@@ -2990,7 +3139,7 @@ func mrMergeabilitySlot(v MergeabilityView) templ.Component {
29903139 if templ_7745c5c3_Err != nil {
29913140 return templ_7745c5c3_Err
29923141 }
2993- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 280, "</div>")
3142+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 295, "</div>")
29943143 if templ_7745c5c3_Err != nil {
29953144 return templ_7745c5c3_Err
29963145 }
@@ -3015,9 +3164,9 @@ func MRMergeabilityFragment(v MergeabilityView) templ.Component {
30153164 }()
30163165 }
30173166 ctx = templ.InitializeContext(ctx)
3018- templ_7745c5c3_Var142 := templ.GetChildren(ctx)
3019- if templ_7745c5c3_Var142 == nil {
3020- templ_7745c5c3_Var142 = templ.NopComponent
3167+ templ_7745c5c3_Var151 := templ.GetChildren(ctx)
3168+ if templ_7745c5c3_Var151 == nil {
3169+ templ_7745c5c3_Var151 = templ.NopComponent
30213170 }
30223171 ctx = templ.ClearChildren(ctx)
30233172 templ_7745c5c3_Err = mrMergeabilitySlot(v).Render(ctx, templ_7745c5c3_Buffer)
@@ -3046,128 +3195,128 @@ func moreMenu(p MRPage) templ.Component {
30463195 }()
30473196 }
30483197 ctx = templ.InitializeContext(ctx)
3049- templ_7745c5c3_Var143 := templ.GetChildren(ctx)
3050- if templ_7745c5c3_Var143 == nil {
3051- templ_7745c5c3_Var143 = templ.NopComponent
3198+ templ_7745c5c3_Var152 := templ.GetChildren(ctx)
3199+ if templ_7745c5c3_Var152 == nil {
3200+ templ_7745c5c3_Var152 = templ.NopComponent
30523201 }
30533202 ctx = templ.ClearChildren(ctx)
3054- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 281, "<details class=\"menu omenu\"><summary class=\"btn icon\" aria-label=\"More actions\" title=\"more actions\">⋯</summary><div class=\"menu-pop\" role=\"group\" aria-label=\"More actions\"><section class=\"merge-settings\"><h2>Merge settings</h2><dl class=\"kv\"><dt>modes</dt><dd>")
3203+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 296, "<details class=\"menu omenu\"><summary class=\"btn icon\" aria-label=\"More actions\" title=\"more actions\">⋯</summary><div class=\"menu-pop\" role=\"group\" aria-label=\"More actions\"><section class=\"merge-settings\"><h2>Merge settings</h2><dl class=\"kv\"><dt>modes</dt><dd>")
30553204 if templ_7745c5c3_Err != nil {
30563205 return templ_7745c5c3_Err
30573206 }
3058- var templ_7745c5c3_Var144 string
3059- templ_7745c5c3_Var144, templ_7745c5c3_Err = templ.JoinStringErrs(strings.Join(p.Modes, ", "))
3207+ var templ_7745c5c3_Var153 string
3208+ templ_7745c5c3_Var153, templ_7745c5c3_Err = templ.JoinStringErrs(strings.Join(p.Modes, ", "))
30603209 if templ_7745c5c3_Err != nil {
3061- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 605, Col: 38}
3210+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 628, Col: 38}
30623211 }
3063- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var144))
3212+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var153))
30643213 if templ_7745c5c3_Err != nil {
30653214 return templ_7745c5c3_Err
30663215 }
3067- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 282, "</dd><dt>checks</dt><dd>")
3216+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 297, "</dd><dt>checks</dt><dd>")
30683217 if templ_7745c5c3_Err != nil {
30693218 return templ_7745c5c3_Err
30703219 }
30713220 if p.ChecksBlock {
3072- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 283, "failing ones block the merge")
3221+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 298, "failing ones block the merge")
30733222 if templ_7745c5c3_Err != nil {
30743223 return templ_7745c5c3_Err
30753224 }
30763225 } else {
3077- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 284, "do not block the merge")
3226+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 299, "do not block the merge")
30783227 if templ_7745c5c3_Err != nil {
30793228 return templ_7745c5c3_Err
30803229 }
30813230 }
3082- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 285, "</dd></dl></section>")
3231+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 300, "</dd></dl></section>")
30833232 if templ_7745c5c3_Err != nil {
30843233 return templ_7745c5c3_Err
30853234 }
30863235 if p.Box != nil {
30873236 if p.Box.Signed {
3088- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 286, "<p class=\"d-note\" id=\"mr-signing\">squash and merge commits are signed with ermite's own key (generated on first start). ")
3237+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 301, "<p class=\"d-note\" id=\"mr-signing\">squash and merge commits are signed with ermite's own key (generated on first start). ")
30893238 if templ_7745c5c3_Err != nil {
30903239 return templ_7745c5c3_Err
30913240 }
30923241 if p.Box.Fingerprint != "" {
3093- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 287, "fingerprint <code>")
3242+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 302, "fingerprint <code>")
30943243 if templ_7745c5c3_Err != nil {
30953244 return templ_7745c5c3_Err
30963245 }
3097- var templ_7745c5c3_Var145 string
3098- templ_7745c5c3_Var145, templ_7745c5c3_Err = templ.JoinStringErrs(p.Box.Fingerprint)
3246+ var templ_7745c5c3_Var154 string
3247+ templ_7745c5c3_Var154, templ_7745c5c3_Err = templ.JoinStringErrs(p.Box.Fingerprint)
30993248 if templ_7745c5c3_Err != nil {
3100- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 621, Col: 44}
3249+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 644, Col: 44}
31013250 }
3102- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var145))
3251+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var154))
31033252 if templ_7745c5c3_Err != nil {
31043253 return templ_7745c5c3_Err
31053254 }
3106- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 288, "</code> ")
3255+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 303, "</code> ")
31073256 if templ_7745c5c3_Err != nil {
31083257 return templ_7745c5c3_Err
31093258 }
31103259 }
3111- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 289, "<code>ermite signing-key show</code> prints it.</p>")
3260+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 304, "<code>ermite signing-key show</code> prints it.</p>")
31123261 if templ_7745c5c3_Err != nil {
31133262 return templ_7745c5c3_Err
31143263 }
31153264 }
3116- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 290, " ")
3265+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 305, " ")
31173266 if templ_7745c5c3_Err != nil {
31183267 return templ_7745c5c3_Err
31193268 }
31203269 if p.Box.CanMarkRead {
3121- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 291, "<form method=\"post\" action=\"")
3270+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 306, "<form method=\"post\" action=\"")
31223271 if templ_7745c5c3_Err != nil {
31233272 return templ_7745c5c3_Err
31243273 }
3125- var templ_7745c5c3_Var146 templ.SafeURL
3126- templ_7745c5c3_Var146, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.Box.ReadAction))
3274+ var templ_7745c5c3_Var155 templ.SafeURL
3275+ templ_7745c5c3_Var155, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.Box.ReadAction))
31273276 if templ_7745c5c3_Err != nil {
3128- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 627, Col: 65}
3277+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 650, Col: 65}
31293278 }
3130- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var146))
3279+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var155))
31313280 if templ_7745c5c3_Err != nil {
31323281 return templ_7745c5c3_Err
31333282 }
3134- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 292, "\"><input type=\"hidden\" name=\"head_id\" value=\"")
3283+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 307, "\"><input type=\"hidden\" name=\"head_id\" value=\"")
31353284 if templ_7745c5c3_Err != nil {
31363285 return templ_7745c5c3_Err
31373286 }
3138- var templ_7745c5c3_Var147 string
3139- templ_7745c5c3_Var147, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.Box.Head)
3287+ var templ_7745c5c3_Var156 string
3288+ templ_7745c5c3_Var156, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.Box.Head)
31403289 if templ_7745c5c3_Err != nil {
3141- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 628, Col: 60}
3290+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 651, Col: 60}
31423291 }
3143- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var147)
3292+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var156)
31443293 if templ_7745c5c3_Err != nil {
31453294 return templ_7745c5c3_Err
31463295 }
3147- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 293, "\"> <button type=\"submit\" title=\"the next visit can show only what changed after this head\" class=\"btn\" aria-keyshortcuts=\"Shift+R\" data-read>Mark read <kbd aria-hidden=\"true\">R</kbd></button></form>")
3296+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 308, "\"> <button type=\"submit\" title=\"the next visit can show only what changed after this head\" class=\"btn\" aria-keyshortcuts=\"Shift+R\" data-read>Mark read <kbd aria-hidden=\"true\">R</kbd></button></form>")
31483297 if templ_7745c5c3_Err != nil {
31493298 return templ_7745c5c3_Err
31503299 }
31513300 }
3152- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 294, " <form method=\"post\" action=\"")
3301+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 309, " <form method=\"post\" action=\"")
31533302 if templ_7745c5c3_Err != nil {
31543303 return templ_7745c5c3_Err
31553304 }
3156- var templ_7745c5c3_Var148 templ.SafeURL
3157- templ_7745c5c3_Var148, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.Box.CloseAction))
3305+ var templ_7745c5c3_Var157 templ.SafeURL
3306+ templ_7745c5c3_Var157, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.Box.CloseAction))
31583307 if templ_7745c5c3_Err != nil {
3159- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 632, Col: 65}
3308+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 655, Col: 65}
31603309 }
3161- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var148))
3310+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var157))
31623311 if templ_7745c5c3_Err != nil {
31633312 return templ_7745c5c3_Err
31643313 }
3165- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 295, "\"><button type=\"submit\" title=\"close without merging; the branch is kept\" class=\"btn danger\">Close</button></form>")
3314+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 310, "\"><button type=\"submit\" title=\"close without merging; the branch is kept\" class=\"btn danger\">Close</button></form>")
31663315 if templ_7745c5c3_Err != nil {
31673316 return templ_7745c5c3_Err
31683317 }
31693318 if !p.Box.HeadGone && p.Box.ReadyAction == "" {
3170- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 296, "<details class=\"d-or\"><summary class=\"mute\">or from a terminal</summary>")
3319+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 311, "<details class=\"d-or\"><summary class=\"mute\">or from a terminal</summary>")
31713320 if templ_7745c5c3_Err != nil {
31723321 return templ_7745c5c3_Err
31733322 }
@@ -3175,13 +3324,13 @@ func moreMenu(p MRPage) templ.Component {
31753324 if templ_7745c5c3_Err != nil {
31763325 return templ_7745c5c3_Err
31773326 }
3178- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 297, "</details>")
3327+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 312, "</details>")
31793328 if templ_7745c5c3_Err != nil {
31803329 return templ_7745c5c3_Err
31813330 }
31823331 }
31833332 }
3184- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 298, "</div></details>")
3333+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 313, "</div></details>")
31853334 if templ_7745c5c3_Err != nil {
31863335 return templ_7745c5c3_Err
31873336 }
@@ -3205,12 +3354,12 @@ func Compare(l Layout, p ComparePage) templ.Component {
32053354 }()
32063355 }
32073356 ctx = templ.InitializeContext(ctx)
3208- templ_7745c5c3_Var149 := templ.GetChildren(ctx)
3209- if templ_7745c5c3_Var149 == nil {
3210- templ_7745c5c3_Var149 = templ.NopComponent
3357+ templ_7745c5c3_Var158 := templ.GetChildren(ctx)
3358+ if templ_7745c5c3_Var158 == nil {
3359+ templ_7745c5c3_Var158 = templ.NopComponent
32113360 }
32123361 ctx = templ.ClearChildren(ctx)
3213- templ_7745c5c3_Var150 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
3362+ templ_7745c5c3_Var159 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
32143363 templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
32153364 templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
32163365 if !templ_7745c5c3_IsBuffer {
@@ -3222,263 +3371,263 @@ func Compare(l Layout, p ComparePage) templ.Component {
32223371 }()
32233372 }
32243373 ctx = templ.InitializeContext(ctx)
3225- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 299, "<header class=\"show mr-h\"><h1>")
3374+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 314, "<header class=\"show mr-h\"><h1>")
32263375 if templ_7745c5c3_Err != nil {
32273376 return templ_7745c5c3_Err
32283377 }
3229- var templ_7745c5c3_Var151 string
3230- templ_7745c5c3_Var151, templ_7745c5c3_Err = templ.JoinStringErrs(p.Source)
3378+ var templ_7745c5c3_Var160 string
3379+ templ_7745c5c3_Var160, templ_7745c5c3_Err = templ.JoinStringErrs(p.Source)
32313380 if templ_7745c5c3_Err != nil {
3232- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 649, Col: 17}
3381+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 672, Col: 17}
32333382 }
3234- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var151))
3383+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var160))
32353384 if templ_7745c5c3_Err != nil {
32363385 return templ_7745c5c3_Err
32373386 }
3238- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 300, " → ")
3387+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 315, " → ")
32393388 if templ_7745c5c3_Err != nil {
32403389 return templ_7745c5c3_Err
32413390 }
3242- var templ_7745c5c3_Var152 string
3243- templ_7745c5c3_Var152, templ_7745c5c3_Err = templ.JoinStringErrs(p.Target)
3391+ var templ_7745c5c3_Var161 string
3392+ templ_7745c5c3_Var161, templ_7745c5c3_Err = templ.JoinStringErrs(p.Target)
32443393 if templ_7745c5c3_Err != nil {
3245- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 649, Col: 34}
3394+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 672, Col: 34}
32463395 }
3247- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var152))
3396+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var161))
32483397 if templ_7745c5c3_Err != nil {
32493398 return templ_7745c5c3_Err
32503399 }
3251- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 301, "</h1><dl class=\"kv show-kv\"><dt>branch</dt><dd><a href=\"")
3400+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 316, "</h1><dl class=\"kv show-kv\"><dt>branch</dt><dd><a href=\"")
32523401 if templ_7745c5c3_Err != nil {
32533402 return templ_7745c5c3_Err
32543403 }
3255- var templ_7745c5c3_Var153 templ.SafeURL
3256- templ_7745c5c3_Var153, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.SourceHref))
3404+ var templ_7745c5c3_Var162 templ.SafeURL
3405+ templ_7745c5c3_Var162, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.SourceHref))
32573406 if templ_7745c5c3_Err != nil {
3258- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 652, Col: 45}
3407+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 675, Col: 45}
32593408 }
3260- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var153))
3409+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var162))
32613410 if templ_7745c5c3_Err != nil {
32623411 return templ_7745c5c3_Err
32633412 }
3264- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 302, "\">")
3413+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 317, "\">")
32653414 if templ_7745c5c3_Err != nil {
32663415 return templ_7745c5c3_Err
32673416 }
3268- var templ_7745c5c3_Var154 string
3269- templ_7745c5c3_Var154, templ_7745c5c3_Err = templ.JoinStringErrs(p.Source)
3417+ var templ_7745c5c3_Var163 string
3418+ templ_7745c5c3_Var163, templ_7745c5c3_Err = templ.JoinStringErrs(p.Source)
32703419 if templ_7745c5c3_Err != nil {
3271- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 652, Col: 58}
3420+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 675, Col: 58}
32723421 }
3273- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var154))
3422+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var163))
32743423 if templ_7745c5c3_Err != nil {
32753424 return templ_7745c5c3_Err
32763425 }
3277- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 303, "</a></dd><dt>target</dt><dd><a href=\"")
3426+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 318, "</a></dd><dt>target</dt><dd><a href=\"")
32783427 if templ_7745c5c3_Err != nil {
32793428 return templ_7745c5c3_Err
32803429 }
3281- var templ_7745c5c3_Var155 templ.SafeURL
3282- templ_7745c5c3_Var155, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.TargetHref))
3430+ var templ_7745c5c3_Var164 templ.SafeURL
3431+ templ_7745c5c3_Var164, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.TargetHref))
32833432 if templ_7745c5c3_Err != nil {
3284- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 654, Col: 45}
3433+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 677, Col: 45}
32853434 }
3286- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var155))
3435+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var164))
32873436 if templ_7745c5c3_Err != nil {
32883437 return templ_7745c5c3_Err
32893438 }
3290- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 304, "\">")
3439+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 319, "\">")
32913440 if templ_7745c5c3_Err != nil {
32923441 return templ_7745c5c3_Err
32933442 }
3294- var templ_7745c5c3_Var156 string
3295- templ_7745c5c3_Var156, templ_7745c5c3_Err = templ.JoinStringErrs(p.Target)
3443+ var templ_7745c5c3_Var165 string
3444+ templ_7745c5c3_Var165, templ_7745c5c3_Err = templ.JoinStringErrs(p.Target)
32963445 if templ_7745c5c3_Err != nil {
3297- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 654, Col: 58}
3446+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 677, Col: 58}
32983447 }
3299- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var156))
3448+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var165))
33003449 if templ_7745c5c3_Err != nil {
33013450 return templ_7745c5c3_Err
33023451 }
3303- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 305, "</a></dd><dt>ahead</dt><dd>")
3452+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 320, "</a></dd><dt>ahead</dt><dd>")
33043453 if templ_7745c5c3_Err != nil {
33053454 return templ_7745c5c3_Err
33063455 }
3307- var templ_7745c5c3_Var157 string
3308- templ_7745c5c3_Var157, templ_7745c5c3_Err = templ.JoinStringErrs(p.AheadText)
3456+ var templ_7745c5c3_Var166 string
3457+ templ_7745c5c3_Var166, templ_7745c5c3_Err = templ.JoinStringErrs(p.AheadText)
33093458 if templ_7745c5c3_Err != nil {
3310- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 656, Col: 21}
3459+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 679, Col: 21}
33113460 }
3312- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var157))
3461+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var166))
33133462 if templ_7745c5c3_Err != nil {
33143463 return templ_7745c5c3_Err
33153464 }
3316- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 306, "</dd></dl></header>")
3465+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 321, "</dd></dl></header>")
33173466 if templ_7745c5c3_Err != nil {
33183467 return templ_7745c5c3_Err
33193468 }
33203469 if p.Note != "" {
3321- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 307, "<p class=\"notice\">")
3470+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 322, "<p class=\"notice\">")
33223471 if templ_7745c5c3_Err != nil {
33233472 return templ_7745c5c3_Err
33243473 }
3325- var templ_7745c5c3_Var158 string
3326- templ_7745c5c3_Var158, templ_7745c5c3_Err = templ.JoinStringErrs(p.Note)
3474+ var templ_7745c5c3_Var167 string
3475+ templ_7745c5c3_Var167, templ_7745c5c3_Err = templ.JoinStringErrs(p.Note)
33273476 if templ_7745c5c3_Err != nil {
3328- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 660, Col: 29}
3477+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 683, Col: 29}
33293478 }
3330- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var158))
3479+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var167))
33313480 if templ_7745c5c3_Err != nil {
33323481 return templ_7745c5c3_Err
33333482 }
3334- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 308, "</p>")
3483+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 323, "</p>")
33353484 if templ_7745c5c3_Err != nil {
33363485 return templ_7745c5c3_Err
33373486 }
33383487 }
3339- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 309, " ")
3488+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 324, " ")
33403489 if templ_7745c5c3_Err != nil {
33413490 return templ_7745c5c3_Err
33423491 }
33433492 if p.Existing != nil {
3344- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 310, "<p class=\"notice\">an open merge request already covers these branches: <a href=\"")
3493+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 325, "<p class=\"notice\">an open merge request already covers these branches: <a href=\"")
33453494 if templ_7745c5c3_Err != nil {
33463495 return templ_7745c5c3_Err
33473496 }
3348- var templ_7745c5c3_Var159 templ.SafeURL
3349- templ_7745c5c3_Var159, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.Existing.Href))
3497+ var templ_7745c5c3_Var168 templ.SafeURL
3498+ templ_7745c5c3_Var168, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.Existing.Href))
33503499 if templ_7745c5c3_Err != nil {
3351- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 663, Col: 114}
3500+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 686, Col: 114}
33523501 }
3353- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var159))
3502+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var168))
33543503 if templ_7745c5c3_Err != nil {
33553504 return templ_7745c5c3_Err
33563505 }
3357- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 311, "\">")
3506+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 326, "\">")
33583507 if templ_7745c5c3_Err != nil {
33593508 return templ_7745c5c3_Err
33603509 }
3361- var templ_7745c5c3_Var160 string
3362- templ_7745c5c3_Var160, templ_7745c5c3_Err = templ.JoinStringErrs(p.Existing.Label)
3510+ var templ_7745c5c3_Var169 string
3511+ templ_7745c5c3_Var169, templ_7745c5c3_Err = templ.JoinStringErrs(p.Existing.Label)
33633512 if templ_7745c5c3_Err != nil {
3364- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 663, Col: 135}
3513+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 686, Col: 135}
33653514 }
3366- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var160))
3515+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var169))
33673516 if templ_7745c5c3_Err != nil {
33683517 return templ_7745c5c3_Err
33693518 }
3370- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 312, "</a></p>")
3519+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 327, "</a></p>")
33713520 if templ_7745c5c3_Err != nil {
33723521 return templ_7745c5c3_Err
33733522 }
33743523 }
3375- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 313, " ")
3524+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 328, " ")
33763525 if templ_7745c5c3_Err != nil {
33773526 return templ_7745c5c3_Err
33783527 }
33793528 if p.Create != nil {
3380- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 314, "<form class=\"cform create\" method=\"post\" action=\"")
3529+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 329, "<form class=\"cform create\" method=\"post\" action=\"")
33813530 if templ_7745c5c3_Err != nil {
33823531 return templ_7745c5c3_Err
33833532 }
3384- var templ_7745c5c3_Var161 templ.SafeURL
3385- templ_7745c5c3_Var161, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.Create.Action))
3533+ var templ_7745c5c3_Var170 templ.SafeURL
3534+ templ_7745c5c3_Var170, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.Create.Action))
33863535 if templ_7745c5c3_Err != nil {
3387- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 666, Col: 83}
3536+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 689, Col: 83}
33883537 }
3389- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var161))
3538+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var170))
33903539 if templ_7745c5c3_Err != nil {
33913540 return templ_7745c5c3_Err
33923541 }
3393- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 315, "\"><input type=\"hidden\" name=\"source\" value=\"")
3542+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 330, "\"><input type=\"hidden\" name=\"source\" value=\"")
33943543 if templ_7745c5c3_Err != nil {
33953544 return templ_7745c5c3_Err
33963545 }
3397- var templ_7745c5c3_Var162 string
3398- templ_7745c5c3_Var162, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.Create.Source)
3546+ var templ_7745c5c3_Var171 string
3547+ templ_7745c5c3_Var171, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.Create.Source)
33993548 if templ_7745c5c3_Err != nil {
3400- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 667, Col: 62}
3549+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 690, Col: 62}
34013550 }
3402- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var162)
3551+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var171)
34033552 if templ_7745c5c3_Err != nil {
34043553 return templ_7745c5c3_Err
34053554 }
3406- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 316, "\"> <input type=\"hidden\" name=\"target\" value=\"")
3555+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 331, "\"> <input type=\"hidden\" name=\"target\" value=\"")
34073556 if templ_7745c5c3_Err != nil {
34083557 return templ_7745c5c3_Err
34093558 }
3410- var templ_7745c5c3_Var163 string
3411- templ_7745c5c3_Var163, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.Create.Target)
3559+ var templ_7745c5c3_Var172 string
3560+ templ_7745c5c3_Var172, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.Create.Target)
34123561 if templ_7745c5c3_Err != nil {
3413- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 668, Col: 62}
3562+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 691, Col: 62}
34143563 }
3415- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var163)
3564+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var172)
34163565 if templ_7745c5c3_Err != nil {
34173566 return templ_7745c5c3_Err
34183567 }
3419- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 317, "\"> <label for=\"mr-title\">title</label> <input id=\"mr-title\" name=\"title\" type=\"text\" maxlength=\"120\" required value=\"")
3568+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 332, "\"> <label for=\"mr-title\">title</label> <input id=\"mr-title\" name=\"title\" type=\"text\" maxlength=\"120\" required value=\"")
34203569 if templ_7745c5c3_Err != nil {
34213570 return templ_7745c5c3_Err
34223571 }
3423- var templ_7745c5c3_Var164 string
3424- templ_7745c5c3_Var164, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.Create.Title)
3572+ var templ_7745c5c3_Var173 string
3573+ templ_7745c5c3_Var173, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.Create.Title)
34253574 if templ_7745c5c3_Err != nil {
3426- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 670, Col: 97}
3575+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 693, Col: 97}
34273576 }
3428- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var164)
3577+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var173)
34293578 if templ_7745c5c3_Err != nil {
34303579 return templ_7745c5c3_Err
34313580 }
3432- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 318, "\" autocomplete=\"off\"> <label for=\"mr-desc\">description</label> <textarea id=\"mr-desc\" name=\"description\" rows=\"4\" maxlength=\"8000\" placeholder=\"Markdown, optional\"></textarea><div class=\"f-btns\"><button type=\"submit\" class=\"btn primary\">Create merge request</button></div></form>")
3581+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 333, "\" autocomplete=\"off\"> <label for=\"mr-desc\">description</label> <textarea id=\"mr-desc\" name=\"description\" rows=\"4\" maxlength=\"8000\" placeholder=\"Markdown, optional\"></textarea><div class=\"f-btns\"><button type=\"submit\" class=\"btn primary\">Create merge request</button></div></form>")
34333582 if templ_7745c5c3_Err != nil {
34343583 return templ_7745c5c3_Err
34353584 }
34363585 }
3437- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 319, " ")
3586+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 334, " ")
34383587 if templ_7745c5c3_Err != nil {
34393588 return templ_7745c5c3_Err
34403589 }
34413590 if p.HasDiff {
3442- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 320, "<div class=\"diff-tools\" role=\"group\" aria-label=\"Diff view\"><span class=\"dim\">")
3591+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 335, "<div class=\"diff-tools\" role=\"group\" aria-label=\"Diff view\"><span class=\"dim\">")
34433592 if templ_7745c5c3_Err != nil {
34443593 return templ_7745c5c3_Err
34453594 }
3446- var templ_7745c5c3_Var165 string
3447- templ_7745c5c3_Var165, templ_7745c5c3_Err = templ.JoinStringErrs(plural(p.NFiles, "file", "files"))
3595+ var templ_7745c5c3_Var174 string
3596+ templ_7745c5c3_Var174, templ_7745c5c3_Err = templ.JoinStringErrs(plural(p.NFiles, "file", "files"))
34483597 if templ_7745c5c3_Err != nil {
3449- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 680, Col: 57}
3598+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 703, Col: 57}
34503599 }
3451- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var165))
3600+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var174))
34523601 if templ_7745c5c3_Err != nil {
34533602 return templ_7745c5c3_Err
34543603 }
3455- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 321, " · <span class=\"plus\">+")
3604+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 336, " · <span class=\"plus\">+")
34563605 if templ_7745c5c3_Err != nil {
34573606 return templ_7745c5c3_Err
34583607 }
3459- var templ_7745c5c3_Var166 string
3460- templ_7745c5c3_Var166, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(p.Adds))
3608+ var templ_7745c5c3_Var175 string
3609+ templ_7745c5c3_Var175, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(p.Adds))
34613610 if templ_7745c5c3_Err != nil {
3462- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 680, Col: 97}
3611+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 703, Col: 97}
34633612 }
3464- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var166))
3613+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var175))
34653614 if templ_7745c5c3_Err != nil {
34663615 return templ_7745c5c3_Err
34673616 }
3468- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 322, "</span> <span class=\"minus\">-")
3617+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 337, "</span> <span class=\"minus\">-")
34693618 if templ_7745c5c3_Err != nil {
34703619 return templ_7745c5c3_Err
34713620 }
3472- var templ_7745c5c3_Var167 string
3473- templ_7745c5c3_Var167, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(p.Dels))
3621+ var templ_7745c5c3_Var176 string
3622+ templ_7745c5c3_Var176, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(p.Dels))
34743623 if templ_7745c5c3_Err != nil {
3475- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 680, Col: 142}
3624+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 703, Col: 142}
34763625 }
3477- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var167))
3626+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var176))
34783627 if templ_7745c5c3_Err != nil {
34793628 return templ_7745c5c3_Err
34803629 }
3481- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 323, "</span></span> <span class=\"grow\"></span>")
3630+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 338, "</span></span> <span class=\"grow\"></span>")
34823631 if templ_7745c5c3_Err != nil {
34833632 return templ_7745c5c3_Err
34843633 }
@@ -3486,64 +3635,64 @@ func Compare(l Layout, p ComparePage) templ.Component {
34863635 if templ_7745c5c3_Err != nil {
34873636 return templ_7745c5c3_Err
34883637 }
3489- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 324, "</div>")
3638+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 339, "</div>")
34903639 if templ_7745c5c3_Err != nil {
34913640 return templ_7745c5c3_Err
34923641 }
34933642 if p.Invisible {
3494- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 325, "<p class=\"notice\">this diff holds invisible characters (direction controls, zero-width characters). They are shown as <span class=\"inv\">&lt;U+XXXX&gt;</span> markers, never applied.</p>")
3643+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 340, "<p class=\"notice\">this diff holds invisible characters (direction controls, zero-width characters). They are shown as <span class=\"inv\">&lt;U+XXXX&gt;</span> markers, never applied.</p>")
34953644 if templ_7745c5c3_Err != nil {
34963645 return templ_7745c5c3_Err
34973646 }
34983647 }
3499- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 326, " <div id=\"diffs\"")
3648+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 341, " <div id=\"diffs\"")
35003649 if templ_7745c5c3_Err != nil {
35013650 return templ_7745c5c3_Err
35023651 }
35033652 if p.Both {
3504- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 327, " data-diff=\"")
3653+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 342, " data-diff=\"")
35053654 if templ_7745c5c3_Err != nil {
35063655 return templ_7745c5c3_Err
35073656 }
3508- var templ_7745c5c3_Var168 string
3509- templ_7745c5c3_Var168, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.View)
3657+ var templ_7745c5c3_Var177 string
3658+ templ_7745c5c3_Var177, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.View)
35103659 if templ_7745c5c3_Err != nil {
3511- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 693, Col: 23}
3660+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 716, Col: 23}
35123661 }
3513- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var168)
3662+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var177)
35143663 if templ_7745c5c3_Err != nil {
35153664 return templ_7745c5c3_Err
35163665 }
3517- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 328, "\"")
3666+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 343, "\"")
35183667 if templ_7745c5c3_Err != nil {
35193668 return templ_7745c5c3_Err
35203669 }
35213670 } else {
3522- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 329, " data-view=\"")
3671+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 344, " data-view=\"")
35233672 if templ_7745c5c3_Err != nil {
35243673 return templ_7745c5c3_Err
35253674 }
3526- var templ_7745c5c3_Var169 string
3527- templ_7745c5c3_Var169, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.View)
3675+ var templ_7745c5c3_Var178 string
3676+ templ_7745c5c3_Var178, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.View)
35283677 if templ_7745c5c3_Err != nil {
3529- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 695, Col: 23}
3678+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 718, Col: 23}
35303679 }
3531- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var169)
3680+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var178)
35323681 if templ_7745c5c3_Err != nil {
35333682 return templ_7745c5c3_Err
35343683 }
3535- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 330, "\"")
3684+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 345, "\"")
35363685 if templ_7745c5c3_Err != nil {
35373686 return templ_7745c5c3_Err
35383687 }
35393688 }
35403689 if p.Both && !p.Pinned {
3541- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 331, " hx-live=\"this.dataset.diff = sessionStorage.getItem('diff') || this.dataset.diff\"")
3690+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 346, " hx-live=\"this.dataset.diff = sessionStorage.getItem('diff') || this.dataset.diff\"")
35423691 if templ_7745c5c3_Err != nil {
35433692 return templ_7745c5c3_Err
35443693 }
35453694 }
3546- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 332, ">")
3695+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 347, ">")
35473696 if templ_7745c5c3_Err != nil {
35483697 return templ_7745c5c3_Err
35493698 }
@@ -3553,14 +3702,14 @@ func Compare(l Layout, p ComparePage) templ.Component {
35533702 return templ_7745c5c3_Err
35543703 }
35553704 }
3556- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 333, "</div>")
3705+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 348, "</div>")
35573706 if templ_7745c5c3_Err != nil {
35583707 return templ_7745c5c3_Err
35593708 }
35603709 }
35613710 return nil
35623711 })
3563- templ_7745c5c3_Err = Shell(l, compareRail(p)).Render(templ.WithChildren(ctx, templ_7745c5c3_Var150), templ_7745c5c3_Buffer)
3712+ templ_7745c5c3_Err = Shell(l, compareRail(p)).Render(templ.WithChildren(ctx, templ_7745c5c3_Var159), templ_7745c5c3_Buffer)
35643713 if templ_7745c5c3_Err != nil {
35653714 return templ_7745c5c3_Err
35663715 }
@@ -3584,173 +3733,173 @@ func compareRail(p ComparePage) templ.Component {
35843733 }()
35853734 }
35863735 ctx = templ.InitializeContext(ctx)
3587- templ_7745c5c3_Var170 := templ.GetChildren(ctx)
3588- if templ_7745c5c3_Var170 == nil {
3589- templ_7745c5c3_Var170 = templ.NopComponent
3736+ templ_7745c5c3_Var179 := templ.GetChildren(ctx)
3737+ if templ_7745c5c3_Var179 == nil {
3738+ templ_7745c5c3_Var179 = templ.NopComponent
35903739 }
35913740 ctx = templ.ClearChildren(ctx)
3592- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 334, "<section aria-labelledby=\"r-ahead\"><h2 id=\"r-ahead\">Commits <span class=\"count\">")
3741+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 349, "<section aria-labelledby=\"r-ahead\"><h2 id=\"r-ahead\">Commits <span class=\"count\">")
35933742 if templ_7745c5c3_Err != nil {
35943743 return templ_7745c5c3_Err
35953744 }
3596- var templ_7745c5c3_Var171 string
3597- templ_7745c5c3_Var171, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(len(p.Ahead)))
3745+ var templ_7745c5c3_Var180 string
3746+ templ_7745c5c3_Var180, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(len(p.Ahead)))
35983747 if templ_7745c5c3_Err != nil {
3599- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 711, Col: 67}
3748+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 734, Col: 67}
36003749 }
3601- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var171))
3750+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var180))
36023751 if templ_7745c5c3_Err != nil {
36033752 return templ_7745c5c3_Err
36043753 }
3605- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 335, "</span></h2><ul class=\"pcommits\">")
3754+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 350, "</span></h2><ul class=\"pcommits\">")
36063755 if templ_7745c5c3_Err != nil {
36073756 return templ_7745c5c3_Err
36083757 }
36093758 for _, c := range p.Ahead {
3610- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 336, "<li><a href=\"")
3759+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 351, "<li><a href=\"")
36113760 if templ_7745c5c3_Err != nil {
36123761 return templ_7745c5c3_Err
36133762 }
3614- var templ_7745c5c3_Var172 templ.SafeURL
3615- templ_7745c5c3_Var172, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(c.CHref))
3763+ var templ_7745c5c3_Var181 templ.SafeURL
3764+ templ_7745c5c3_Var181, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(c.CHref))
36163765 if templ_7745c5c3_Err != nil {
3617- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 715, Col: 37}
3766+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 738, Col: 37}
36183767 }
3619- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var172))
3768+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var181))
36203769 if templ_7745c5c3_Err != nil {
36213770 return templ_7745c5c3_Err
36223771 }
3623- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 337, "\">")
3772+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 352, "\">")
36243773 if templ_7745c5c3_Err != nil {
36253774 return templ_7745c5c3_Err
36263775 }
3627- var templ_7745c5c3_Var173 string
3628- templ_7745c5c3_Var173, templ_7745c5c3_Err = templ.JoinStringErrs(c.Short)
3776+ var templ_7745c5c3_Var182 string
3777+ templ_7745c5c3_Var182, templ_7745c5c3_Err = templ.JoinStringErrs(c.Short)
36293778 if templ_7745c5c3_Err != nil {
3630- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 715, Col: 49}
3779+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 738, Col: 49}
36313780 }
3632- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var173))
3781+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var182))
36333782 if templ_7745c5c3_Err != nil {
36343783 return templ_7745c5c3_Err
36353784 }
3636- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 338, "</a> <span class=\"s\">")
3785+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 353, "</a> <span class=\"s\">")
36373786 if templ_7745c5c3_Err != nil {
36383787 return templ_7745c5c3_Err
36393788 }
3640- var templ_7745c5c3_Var174 string
3641- templ_7745c5c3_Var174, templ_7745c5c3_Err = templ.JoinStringErrs(c.Subject)
3789+ var templ_7745c5c3_Var183 string
3790+ templ_7745c5c3_Var183, templ_7745c5c3_Err = templ.JoinStringErrs(c.Subject)
36423791 if templ_7745c5c3_Err != nil {
3643- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 716, Col: 32}
3792+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 739, Col: 32}
36443793 }
3645- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var174))
3794+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var183))
36463795 if templ_7745c5c3_Err != nil {
36473796 return templ_7745c5c3_Err
36483797 }
3649- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 339, "</span> <span class=\"mute\">")
3798+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 354, "</span> <span class=\"mute\">")
36503799 if templ_7745c5c3_Err != nil {
36513800 return templ_7745c5c3_Err
36523801 }
3653- var templ_7745c5c3_Var175 string
3654- templ_7745c5c3_Var175, templ_7745c5c3_Err = templ.JoinStringErrs(c.Author)
3802+ var templ_7745c5c3_Var184 string
3803+ templ_7745c5c3_Var184, templ_7745c5c3_Err = templ.JoinStringErrs(c.Author)
36553804 if templ_7745c5c3_Err != nil {
3656- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 718, Col: 16}
3805+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 741, Col: 16}
36573806 }
3658- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var175))
3807+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var184))
36593808 if templ_7745c5c3_Err != nil {
36603809 return templ_7745c5c3_Err
36613810 }
3662- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 340, " ")
3811+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 355, " ")
36633812 if templ_7745c5c3_Err != nil {
36643813 return templ_7745c5c3_Err
36653814 }
36663815 if c.WhenAt != "" {
3667- var templ_7745c5c3_Var176 string
3668- templ_7745c5c3_Var176, templ_7745c5c3_Err = templ.JoinStringErrs(" · ")
3816+ var templ_7745c5c3_Var185 string
3817+ templ_7745c5c3_Var185, templ_7745c5c3_Err = templ.JoinStringErrs(" · ")
36693818 if templ_7745c5c3_Err != nil {
3670- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 720, Col: 15}
3819+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 743, Col: 15}
36713820 }
3672- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var176))
3821+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var185))
36733822 if templ_7745c5c3_Err != nil {
36743823 return templ_7745c5c3_Err
36753824 }
3676- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 341, "<time datetime=\"")
3825+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 356, "<time datetime=\"")
36773826 if templ_7745c5c3_Err != nil {
36783827 return templ_7745c5c3_Err
36793828 }
3680- var templ_7745c5c3_Var177 string
3681- templ_7745c5c3_Var177, templ_7745c5c3_Err = templ.ResolveAttributeValue(c.WhenAt)
3829+ var templ_7745c5c3_Var186 string
3830+ templ_7745c5c3_Var186, templ_7745c5c3_Err = templ.ResolveAttributeValue(c.WhenAt)
36823831 if templ_7745c5c3_Err != nil {
3683- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 720, Col: 42}
3832+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 743, Col: 42}
36843833 }
3685- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var177)
3834+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var186)
36863835 if templ_7745c5c3_Err != nil {
36873836 return templ_7745c5c3_Err
36883837 }
3689- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 342, "\">")
3838+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 357, "\">")
36903839 if templ_7745c5c3_Err != nil {
36913840 return templ_7745c5c3_Err
36923841 }
3693- var templ_7745c5c3_Var178 string
3694- templ_7745c5c3_Var178, templ_7745c5c3_Err = templ.JoinStringErrs(c.When)
3842+ var templ_7745c5c3_Var187 string
3843+ templ_7745c5c3_Var187, templ_7745c5c3_Err = templ.JoinStringErrs(c.When)
36953844 if templ_7745c5c3_Err != nil {
3696- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 720, Col: 53}
3845+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 743, Col: 53}
36973846 }
3698- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var178))
3847+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var187))
36993848 if templ_7745c5c3_Err != nil {
37003849 return templ_7745c5c3_Err
37013850 }
3702- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 343, "</time>")
3851+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 358, "</time>")
37033852 if templ_7745c5c3_Err != nil {
37043853 return templ_7745c5c3_Err
37053854 }
37063855 }
3707- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 344, "</span></li>")
3856+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 359, "</span></li>")
37083857 if templ_7745c5c3_Err != nil {
37093858 return templ_7745c5c3_Err
37103859 }
37113860 }
3712- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 345, "</ul>")
3861+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 360, "</ul>")
37133862 if templ_7745c5c3_Err != nil {
37143863 return templ_7745c5c3_Err
37153864 }
37163865 if len(p.Ahead) == 0 {
3717- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 346, "<p class=\"dim\">no commit ahead of ")
3866+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 361, "<p class=\"dim\">no commit ahead of ")
37183867 if templ_7745c5c3_Err != nil {
37193868 return templ_7745c5c3_Err
37203869 }
3721- var templ_7745c5c3_Var179 string
3722- templ_7745c5c3_Var179, templ_7745c5c3_Err = templ.JoinStringErrs(p.Target)
3870+ var templ_7745c5c3_Var188 string
3871+ templ_7745c5c3_Var188, templ_7745c5c3_Err = templ.JoinStringErrs(p.Target)
37233872 if templ_7745c5c3_Err != nil {
3724- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 727, Col: 47}
3873+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 750, Col: 47}
37253874 }
3726- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var179))
3875+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var188))
37273876 if templ_7745c5c3_Err != nil {
37283877 return templ_7745c5c3_Err
37293878 }
3730- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 347, ".</p>")
3879+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 362, ".</p>")
37313880 if templ_7745c5c3_Err != nil {
37323881 return templ_7745c5c3_Err
37333882 }
37343883 }
3735- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 348, "</section>")
3884+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 363, "</section>")
37363885 if templ_7745c5c3_Err != nil {
37373886 return templ_7745c5c3_Err
37383887 }
37393888 if p.HasDiff {
3740- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 349, "<section aria-labelledby=\"r-files\"><h2 id=\"r-files\">Files <span class=\"count\">")
3889+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 364, "<section aria-labelledby=\"r-files\"><h2 id=\"r-files\">Files <span class=\"count\">")
37413890 if templ_7745c5c3_Err != nil {
37423891 return templ_7745c5c3_Err
37433892 }
3744- var templ_7745c5c3_Var180 string
3745- templ_7745c5c3_Var180, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(len(p.Files)))
3893+ var templ_7745c5c3_Var189 string
3894+ templ_7745c5c3_Var189, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(len(p.Files)))
37463895 if templ_7745c5c3_Err != nil {
3747- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 732, Col: 66}
3896+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 755, Col: 66}
37483897 }
3749- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var180))
3898+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var189))
37503899 if templ_7745c5c3_Err != nil {
37513900 return templ_7745c5c3_Err
37523901 }
3753- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 350, "</span></h2>")
3902+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 365, "</span></h2>")
37543903 if templ_7745c5c3_Err != nil {
37553904 return templ_7745c5c3_Err
37563905 }
@@ -3758,12 +3907,12 @@ func compareRail(p ComparePage) templ.Component {
37583907 if templ_7745c5c3_Err != nil {
37593908 return templ_7745c5c3_Err
37603909 }
3761- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 351, "</section>")
3910+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 366, "</section>")
37623911 if templ_7745c5c3_Err != nil {
37633912 return templ_7745c5c3_Err
37643913 }
37653914 }
3766- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 352, "<section aria-labelledby=\"r-cli\"><h2 id=\"r-cli\">From a terminal</h2>")
3915+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 367, "<section aria-labelledby=\"r-cli\"><h2 id=\"r-cli\">From a terminal</h2>")
37673916 if templ_7745c5c3_Err != nil {
37683917 return templ_7745c5c3_Err
37693918 }
@@ -3771,7 +3920,7 @@ func compareRail(p ComparePage) templ.Component {
37713920 if templ_7745c5c3_Err != nil {
37723921 return templ_7745c5c3_Err
37733922 }
3774- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 353, "</section>")
3923+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 368, "</section>")
37753924 if templ_7745c5c3_Err != nil {
37763925 return templ_7745c5c3_Err
37773926 }
@@ -2571,185 +2571,334 @@ func mergeMenu(p MRPage) templ.Component {
2571 if templ_7745c5c3_Err != nil {2571 if templ_7745c5c3_Err != nil {
2572 return templ_7745c5c3_Err2572 return templ_7745c5c3_Err
2573 }2573 }
2574- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 240, " <form class=\"d-acts\" method=\"post\" action=\"")2574+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 240, " ")
2575 if templ_7745c5c3_Err != nil {2575 if templ_7745c5c3_Err != nil {
2576 return templ_7745c5c3_Err2576 return templ_7745c5c3_Err
2577 }2577 }
2578- var templ_7745c5c3_Var120 templ.SafeURL2578+ if p.Box.AutoMerge != nil {
2579- templ_7745c5c3_Var120, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.Box.MergeAction))2579+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 241, "<form class=\"d-acts\" method=\"post\" action=\"")
2580+ if templ_7745c5c3_Err != nil {
2581+ return templ_7745c5c3_Err
2582+ }
2583+ var templ_7745c5c3_Var120 templ.SafeURL
2584+ templ_7745c5c3_Var120, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.Box.CancelAutoAction))
2585+ if templ_7745c5c3_Err != nil {
2586+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 512, Col: 86}
2587+ }
2588+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var120))
2589+ if templ_7745c5c3_Err != nil {
2590+ return templ_7745c5c3_Err
2591+ }
2592+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 242, "\"><p class=\"dim\" role=\"status\">Auto-merge: ")
2593+ if templ_7745c5c3_Err != nil {
2594+ return templ_7745c5c3_Err
2595+ }
2596+ var templ_7745c5c3_Var121 string
2597+ templ_7745c5c3_Var121, templ_7745c5c3_Err = templ.JoinStringErrs(p.Box.AutoMerge.Mode)
2598+ if templ_7745c5c3_Err != nil {
2599+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 514, Col: 41}
2600+ }
2601+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var121))
2602+ if templ_7745c5c3_Err != nil {
2603+ return templ_7745c5c3_Err
2604+ }
2605+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 243, " when ready, enabled by ")
2606+ if templ_7745c5c3_Err != nil {
2607+ return templ_7745c5c3_Err
2608+ }
2609+ var templ_7745c5c3_Var122 string
2610+ templ_7745c5c3_Var122, templ_7745c5c3_Err = templ.JoinStringErrs(p.Box.AutoMerge.EnabledBy)
2611+ if templ_7745c5c3_Err != nil {
2612+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 514, Col: 94}
2613+ }
2614+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var122))
2615+ if templ_7745c5c3_Err != nil {
2616+ return templ_7745c5c3_Err
2617+ }
2618+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 244, " ")
2619+ if templ_7745c5c3_Err != nil {
2620+ return templ_7745c5c3_Err
2621+ }
2622+ if p.Box.AutoMerge.When != "" {
2623+ var templ_7745c5c3_Var123 string
2624+ templ_7745c5c3_Var123, templ_7745c5c3_Err = templ.JoinStringErrs(" ")
2625+ if templ_7745c5c3_Err != nil {
2626+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 516, Col: 13}
2627+ }
2628+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var123))
2629+ if templ_7745c5c3_Err != nil {
2630+ return templ_7745c5c3_Err
2631+ }
2632+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 245, "<time datetime=\"")
2633+ if templ_7745c5c3_Err != nil {
2634+ return templ_7745c5c3_Err
2635+ }
2636+ var templ_7745c5c3_Var124 string
2637+ templ_7745c5c3_Var124, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.Box.AutoMerge.WhenAt)
2638+ if templ_7745c5c3_Err != nil {
2639+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 516, Col: 54}
2640+ }
2641+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var124)
2642+ if templ_7745c5c3_Err != nil {
2643+ return templ_7745c5c3_Err
2644+ }
2645+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 246, "\">")
2646+ if templ_7745c5c3_Err != nil {
2647+ return templ_7745c5c3_Err
2648+ }
2649+ var templ_7745c5c3_Var125 string
2650+ templ_7745c5c3_Var125, templ_7745c5c3_Err = templ.JoinStringErrs(p.Box.AutoMerge.When)
2651+ if templ_7745c5c3_Err != nil {
2652+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 516, Col: 79}
2653+ }
2654+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var125))
2655+ if templ_7745c5c3_Err != nil {
2656+ return templ_7745c5c3_Err
2657+ }
2658+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 247, "</time> ")
2659+ if templ_7745c5c3_Err != nil {
2660+ return templ_7745c5c3_Err
2661+ }
2662+ }
2663+ var templ_7745c5c3_Var126 string
2664+ templ_7745c5c3_Var126, templ_7745c5c3_Err = templ.JoinStringErrs(" ")
2665+ if templ_7745c5c3_Err != nil {
2666+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 518, Col: 12}
2667+ }
2668+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var126))
2669+ if templ_7745c5c3_Err != nil {
2670+ return templ_7745c5c3_Err
2671+ }
2672+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 248, "(head ")
2673+ if templ_7745c5c3_Err != nil {
2674+ return templ_7745c5c3_Err
2675+ }
2676+ var templ_7745c5c3_Var127 string
2677+ templ_7745c5c3_Var127, templ_7745c5c3_Err = templ.JoinStringErrs(p.Box.AutoMerge.HeadShort)
2678+ if templ_7745c5c3_Err != nil {
2679+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 518, Col: 47}
2680+ }
2681+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var127))
2682+ if templ_7745c5c3_Err != nil {
2683+ return templ_7745c5c3_Err
2684+ }
2685+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 249, ")</p><div class=\"d-btns\"><button type=\"submit\" class=\"btn\">Cancel auto-merge</button></div></form>")
2686+ if templ_7745c5c3_Err != nil {
2687+ return templ_7745c5c3_Err
2688+ }
2689+ }
2690+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 250, " <form class=\"d-acts\" method=\"post\" action=\"")
2580 if templ_7745c5c3_Err != nil {2691 if templ_7745c5c3_Err != nil {
2581- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 511, Col: 80}2692+ return templ_7745c5c3_Err
2693+ }
2694+ var templ_7745c5c3_Var128 templ.SafeURL
2695+ templ_7745c5c3_Var128, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.Box.MergeAction))
2696+ if templ_7745c5c3_Err != nil {
2697+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 525, Col: 80}
2582 }2698 }
2583- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var120))2699+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var128))
2584 if templ_7745c5c3_Err != nil {2700 if templ_7745c5c3_Err != nil {
2585 return templ_7745c5c3_Err2701 return templ_7745c5c3_Err
2586 }2702 }
2587- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 241, "\"><input type=\"hidden\" name=\"head_id\" value=\"")2703+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 251, "\"><input type=\"hidden\" name=\"head_id\" value=\"")
2588 if templ_7745c5c3_Err != nil {2704 if templ_7745c5c3_Err != nil {
2589 return templ_7745c5c3_Err2705 return templ_7745c5c3_Err
2590 }2706 }
2591- var templ_7745c5c3_Var121 string2707+ var templ_7745c5c3_Var129 string
2592- templ_7745c5c3_Var121, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.Box.Head)2708+ templ_7745c5c3_Var129, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.Box.Head)
2593 if templ_7745c5c3_Err != nil {2709 if templ_7745c5c3_Err != nil {
2594- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 512, Col: 59}2710+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 526, Col: 59}
2595 }2711 }
2596- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var121)2712+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var129)
2597 if templ_7745c5c3_Err != nil {2713 if templ_7745c5c3_Err != nil {
2598 return templ_7745c5c3_Err2714 return templ_7745c5c3_Err
2599 }2715 }
2600- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 242, "\"><fieldset class=\"d-modes\"><legend class=\"sr\">merge mode</legend> ")2716+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 252, "\"><fieldset class=\"d-modes\"><legend class=\"sr\">merge mode</legend> ")
2601 if templ_7745c5c3_Err != nil {2717 if templ_7745c5c3_Err != nil {
2602 return templ_7745c5c3_Err2718 return templ_7745c5c3_Err
2603 }2719 }
2604 for i, m := range p.Box.Modes {2720 for i, m := range p.Box.Modes {
2605- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 243, "<label><input type=\"radio\" name=\"mode\" value=\"")2721+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 253, "<label><input type=\"radio\" name=\"mode\" value=\"")
2606 if templ_7745c5c3_Err != nil {2722 if templ_7745c5c3_Err != nil {
2607 return templ_7745c5c3_Err2723 return templ_7745c5c3_Err
2608 }2724 }
2609- var templ_7745c5c3_Var122 string2725+ var templ_7745c5c3_Var130 string
2610- templ_7745c5c3_Var122, templ_7745c5c3_Err = templ.ResolveAttributeValue(m.Value)2726+ templ_7745c5c3_Var130, templ_7745c5c3_Err = templ.ResolveAttributeValue(m.Value)
2611 if templ_7745c5c3_Err != nil {2727 if templ_7745c5c3_Err != nil {
2612- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 520, Col: 24}2728+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 534, Col: 24}
2613 }2729 }
2614- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var122)2730+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var130)
2615 if templ_7745c5c3_Err != nil {2731 if templ_7745c5c3_Err != nil {
2616 return templ_7745c5c3_Err2732 return templ_7745c5c3_Err
2617 }2733 }
2618- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 244, "\"")2734+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 254, "\"")
2619 if templ_7745c5c3_Err != nil {2735 if templ_7745c5c3_Err != nil {
2620 return templ_7745c5c3_Err2736 return templ_7745c5c3_Err
2621 }2737 }
2622 if i == p.Box.Checked() {2738 if i == p.Box.Checked() {
2623- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 245, " checked")2739+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 255, " checked")
2624 if templ_7745c5c3_Err != nil {2740 if templ_7745c5c3_Err != nil {
2625 return templ_7745c5c3_Err2741 return templ_7745c5c3_Err
2626 }2742 }
2627 }2743 }
2628 if m.Disabled {2744 if m.Disabled {
2629- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 246, " disabled")2745+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 256, " disabled")
2630 if templ_7745c5c3_Err != nil {2746 if templ_7745c5c3_Err != nil {
2631 return templ_7745c5c3_Err2747 return templ_7745c5c3_Err
2632 }2748 }
2633 }2749 }
2634- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 247, " title=\"")2750+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 257, " title=\"")
2635 if templ_7745c5c3_Err != nil {2751 if templ_7745c5c3_Err != nil {
2636 return templ_7745c5c3_Err2752 return templ_7745c5c3_Err
2637 }2753 }
2638- var templ_7745c5c3_Var123 string2754+ var templ_7745c5c3_Var131 string
2639- templ_7745c5c3_Var123, templ_7745c5c3_Err = templ.ResolveAttributeValue(m.Reason)2755+ templ_7745c5c3_Var131, templ_7745c5c3_Err = templ.ResolveAttributeValue(m.Reason)
2640 if templ_7745c5c3_Err != nil {2756 if templ_7745c5c3_Err != nil {
2641- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 523, Col: 25}2757+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 537, Col: 25}
2642 }2758 }
2643- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var123)2759+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var131)
2644 if templ_7745c5c3_Err != nil {2760 if templ_7745c5c3_Err != nil {
2645 return templ_7745c5c3_Err2761 return templ_7745c5c3_Err
2646 }2762 }
2647- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 248, "\" :disabled=\"this.value === 'fast-forward' ? q('[data-mergeability]').data.ffOk !== true : q('[data-mergeability]').data.mergeOk !== true\" :title=\"this.value === 'fast-forward' ? q('[data-mergeability]').data.ffReason : q('[data-mergeability]').data.mergeReason\"> ")2763+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 258, "\" :disabled=\"this.value === 'fast-forward' ? q('[data-mergeability]').data.ffOk !== true : q('[data-mergeability]').data.mergeOk !== true\" :title=\"this.value === 'fast-forward' ? q('[data-mergeability]').data.ffReason : q('[data-mergeability]').data.mergeReason\"> ")
2648 if templ_7745c5c3_Err != nil {2764 if templ_7745c5c3_Err != nil {
2649 return templ_7745c5c3_Err2765 return templ_7745c5c3_Err
2650 }2766 }
2651- var templ_7745c5c3_Var124 string2767+ var templ_7745c5c3_Var132 string
2652- templ_7745c5c3_Var124, templ_7745c5c3_Err = templ.JoinStringErrs(m.Label)2768+ templ_7745c5c3_Var132, templ_7745c5c3_Err = templ.JoinStringErrs(m.Label)
2653 if templ_7745c5c3_Err != nil {2769 if templ_7745c5c3_Err != nil {
2654- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 527, Col: 17}2770+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 541, Col: 17}
2655 }2771 }
2656- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var124))2772+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var132))
2657 if templ_7745c5c3_Err != nil {2773 if templ_7745c5c3_Err != nil {
2658 return templ_7745c5c3_Err2774 return templ_7745c5c3_Err
2659 }2775 }
2660- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 249, " ")2776+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 259, " ")
2661 if templ_7745c5c3_Err != nil {2777 if templ_7745c5c3_Err != nil {
2662 return templ_7745c5c3_Err2778 return templ_7745c5c3_Err
2663 }2779 }
2664 if i < 9 {2780 if i < 9 {
2665- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 250, "<kbd aria-hidden=\"true\">")2781+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 260, "<kbd aria-hidden=\"true\">")
2666 if templ_7745c5c3_Err != nil {2782 if templ_7745c5c3_Err != nil {
2667 return templ_7745c5c3_Err2783 return templ_7745c5c3_Err
2668 }2784 }
2669- var templ_7745c5c3_Var125 string2785+ var templ_7745c5c3_Var133 string
2670- templ_7745c5c3_Var125, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(i + 1))2786+ templ_7745c5c3_Var133, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(i + 1))
2671 if templ_7745c5c3_Err != nil {2787 if templ_7745c5c3_Err != nil {
2672- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 529, Col: 46}2788+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 543, Col: 46}
2673 }2789 }
2674- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var125))2790+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var133))
2675 if templ_7745c5c3_Err != nil {2791 if templ_7745c5c3_Err != nil {
2676 return templ_7745c5c3_Err2792 return templ_7745c5c3_Err
2677 }2793 }
2678- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 251, "</kbd>")2794+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 261, "</kbd>")
2679 if templ_7745c5c3_Err != nil {2795 if templ_7745c5c3_Err != nil {
2680 return templ_7745c5c3_Err2796 return templ_7745c5c3_Err
2681 }2797 }
2682 }2798 }
2683- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 252, "</label>")2799+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 262, "</label>")
2684 if templ_7745c5c3_Err != nil {2800 if templ_7745c5c3_Err != nil {
2685 return templ_7745c5c3_Err2801 return templ_7745c5c3_Err
2686 }2802 }
2687 }2803 }
2688- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 253, "</fieldset>")2804+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 263, "</fieldset>")
2689 if templ_7745c5c3_Err != nil {2805 if templ_7745c5c3_Err != nil {
2690 return templ_7745c5c3_Err2806 return templ_7745c5c3_Err
2691 }2807 }
2692 if p.Box.CanDeleteBranch {2808 if p.Box.CanDeleteBranch {
2693- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 254, "<label class=\"d-check\"><input type=\"checkbox\" name=\"delete_branch\" value=\"1\"> delete ")2809+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 264, "<label class=\"d-check\"><input type=\"checkbox\" name=\"delete_branch\" value=\"1\"> delete ")
2694 if templ_7745c5c3_Err != nil {2810 if templ_7745c5c3_Err != nil {
2695 return templ_7745c5c3_Err2811 return templ_7745c5c3_Err
2696 }2812 }
2697- var templ_7745c5c3_Var126 string2813+ var templ_7745c5c3_Var134 string
2698- templ_7745c5c3_Var126, templ_7745c5c3_Err = templ.JoinStringErrs(p.Source)2814+ templ_7745c5c3_Var134, templ_7745c5c3_Err = templ.JoinStringErrs(p.Source)
2699 if templ_7745c5c3_Err != nil {2815 if templ_7745c5c3_Err != nil {
2700- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 535, Col: 102}2816+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 549, Col: 102}
2701 }2817 }
2702- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var126))2818+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var134))
2703 if templ_7745c5c3_Err != nil {2819 if templ_7745c5c3_Err != nil {
2704 return templ_7745c5c3_Err2820 return templ_7745c5c3_Err
2705 }2821 }
2706- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 255, " after the merge <kbd aria-hidden=\"true\">D</kbd></label>")2822+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 265, " after the merge <kbd aria-hidden=\"true\">D</kbd></label>")
2707 if templ_7745c5c3_Err != nil {2823 if templ_7745c5c3_Err != nil {
2708 return templ_7745c5c3_Err2824 return templ_7745c5c3_Err
2709 }2825 }
2710 }2826 }
2711- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 256, "<div class=\"d-btns\"><button type=\"submit\" class=\"btn primary\" data-default")2827+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 266, "<div class=\"d-btns\"><button type=\"submit\" class=\"btn primary\" data-default")
2712 if templ_7745c5c3_Err != nil {2828 if templ_7745c5c3_Err != nil {
2713 return templ_7745c5c3_Err2829 return templ_7745c5c3_Err
2714 }2830 }
2715 if !p.Box.CanMerge() {2831 if !p.Box.CanMerge() {
2716- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 257, " disabled")2832+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 267, " disabled")
2717 if templ_7745c5c3_Err != nil {2833 if templ_7745c5c3_Err != nil {
2718 return templ_7745c5c3_Err2834 return templ_7745c5c3_Err
2719 }2835 }
2720 }2836 }
2721- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 258, " title=\"")2837+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 268, " title=\"")
2722 if templ_7745c5c3_Err != nil {2838 if templ_7745c5c3_Err != nil {
2723 return templ_7745c5c3_Err2839 return templ_7745c5c3_Err
2724 }2840 }
2725- var templ_7745c5c3_Var127 string2841+ var templ_7745c5c3_Var135 string
2726- templ_7745c5c3_Var127, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.Box.MergeTitle())2842+ templ_7745c5c3_Var135, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.Box.MergeTitle())
2727 if templ_7745c5c3_Err != nil {2843 if templ_7745c5c3_Err != nil {
2728- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 543, Col: 33}2844+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 557, Col: 33}
2729 }2845 }
2730- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var127)2846+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var135)
2731 if templ_7745c5c3_Err != nil {2847 if templ_7745c5c3_Err != nil {
2732 return templ_7745c5c3_Err2848 return templ_7745c5c3_Err
2733 }2849 }
2734- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 259, "\" :disabled=\"!this.form.querySelector('input[name=mode]:checked:not(:disabled)')\" :title=\"(this.form.querySelector('input[name=mode]:checked') || {}).title || ''\">Merge into ")2850+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 269, "\" :disabled=\"!this.form.querySelector('input[name=mode]:checked:not(:disabled)')\" :title=\"(this.form.querySelector('input[name=mode]:checked') || {}).title || ''\">Merge into ")
2735 if templ_7745c5c3_Err != nil {2851 if templ_7745c5c3_Err != nil {
2736 return templ_7745c5c3_Err2852 return templ_7745c5c3_Err
2737 }2853 }
2738- var templ_7745c5c3_Var128 string2854+ var templ_7745c5c3_Var136 string
2739- templ_7745c5c3_Var128, templ_7745c5c3_Err = templ.JoinStringErrs(p.Target)2855+ templ_7745c5c3_Var136, templ_7745c5c3_Err = templ.JoinStringErrs(p.Target)
2740 if templ_7745c5c3_Err != nil {2856 if templ_7745c5c3_Err != nil {
2741- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 546, Col: 28}2857+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 560, Col: 28}
2742 }2858 }
2743- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var128))2859+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var136))
2744 if templ_7745c5c3_Err != nil {2860 if templ_7745c5c3_Err != nil {
2745 return templ_7745c5c3_Err2861 return templ_7745c5c3_Err
2746 }2862 }
2747- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 260, "</button></div></form>")2863+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 270, "</button> ")
2864+ if templ_7745c5c3_Err != nil {
2865+ return templ_7745c5c3_Err
2866+ }
2867+ if p.Box.CanAutoMerge {
2868+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 271, "<button type=\"submit\" class=\"btn\" formaction=\"")
2869+ if templ_7745c5c3_Err != nil {
2870+ return templ_7745c5c3_Err
2871+ }
2872+ var templ_7745c5c3_Var137 string
2873+ templ_7745c5c3_Var137, templ_7745c5c3_Err = templ.ResolveAttributeValue(templ.SafeURL(p.Box.AutoAction))
2874+ if templ_7745c5c3_Err != nil {
2875+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 565, Col: 52}
2876+ }
2877+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var137)
2878+ if templ_7745c5c3_Err != nil {
2879+ return templ_7745c5c3_Err
2880+ }
2881+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 272, "\"")
2882+ if templ_7745c5c3_Err != nil {
2883+ return templ_7745c5c3_Err
2884+ }
2885+ if len(p.Box.Modes) == 0 {
2886+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 273, " disabled")
2887+ if templ_7745c5c3_Err != nil {
2888+ return templ_7745c5c3_Err
2889+ }
2890+ }
2891+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 274, " title=\"merge once the checks pass\">Merge when ready</button>")
2892+ if templ_7745c5c3_Err != nil {
2893+ return templ_7745c5c3_Err
2894+ }
2895+ }
2896+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 275, "</div></form>")
2748 if templ_7745c5c3_Err != nil {2897 if templ_7745c5c3_Err != nil {
2749 return templ_7745c5c3_Err2898 return templ_7745c5c3_Err
2750 }2899 }
2751 }2900 }
2752- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 261, "</div></details>")2901+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 276, "</div></details>")
2753 if templ_7745c5c3_Err != nil {2902 if templ_7745c5c3_Err != nil {
2754 return templ_7745c5c3_Err2903 return templ_7745c5c3_Err
2755 }2904 }
@@ -2775,182 +2924,182 @@ func MRMergeability(v MergeabilityView) templ.Component {
2775 }()2924 }()
2776 }2925 }
2777 ctx = templ.InitializeContext(ctx)2926 ctx = templ.InitializeContext(ctx)
2778- templ_7745c5c3_Var129 := templ.GetChildren(ctx)2927+ templ_7745c5c3_Var138 := templ.GetChildren(ctx)
2779- if templ_7745c5c3_Var129 == nil {2928+ if templ_7745c5c3_Var138 == nil {
2780- templ_7745c5c3_Var129 = templ.NopComponent2929+ templ_7745c5c3_Var138 = templ.NopComponent
2781 }2930 }
2782 ctx = templ.ClearChildren(ctx)2931 ctx = templ.ClearChildren(ctx)
2783- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 262, "<span data-mergeability data-state=\"")2932+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 277, "<span data-mergeability data-state=\"")
2784 if templ_7745c5c3_Err != nil {2933 if templ_7745c5c3_Err != nil {
2785 return templ_7745c5c3_Err2934 return templ_7745c5c3_Err
2786 }2935 }
2787- var templ_7745c5c3_Var130 string2936+ var templ_7745c5c3_Var139 string
2788- templ_7745c5c3_Var130, templ_7745c5c3_Err = templ.ResolveAttributeValue(v.State)2937+ templ_7745c5c3_Var139, templ_7745c5c3_Err = templ.ResolveAttributeValue(v.State)
2789 if templ_7745c5c3_Err != nil {2938 if templ_7745c5c3_Err != nil {
2790- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 559, Col: 22}2939+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 582, Col: 22}
2791 }2940 }
2792- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var130)2941+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var139)
2793 if templ_7745c5c3_Err != nil {2942 if templ_7745c5c3_Err != nil {
2794 return templ_7745c5c3_Err2943 return templ_7745c5c3_Err
2795 }2944 }
2796- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 263, "\" data-ff-ok=\"")2945+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 278, "\" data-ff-ok=\"")
2797 if templ_7745c5c3_Err != nil {2946 if templ_7745c5c3_Err != nil {
2798 return templ_7745c5c3_Err2947 return templ_7745c5c3_Err
2799 }2948 }
2800- var templ_7745c5c3_Var131 string2949+ var templ_7745c5c3_Var140 string
2801- templ_7745c5c3_Var131, templ_7745c5c3_Err = templ.ResolveAttributeValue(strconv.FormatBool(v.FFOk))2950+ templ_7745c5c3_Var140, templ_7745c5c3_Err = templ.ResolveAttributeValue(strconv.FormatBool(v.FFOk))
2802 if templ_7745c5c3_Err != nil {2951 if templ_7745c5c3_Err != nil {
2803- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 560, Col: 41}2952+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 583, Col: 41}
2804 }2953 }
2805- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var131)2954+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var140)
2806 if templ_7745c5c3_Err != nil {2955 if templ_7745c5c3_Err != nil {
2807 return templ_7745c5c3_Err2956 return templ_7745c5c3_Err
2808 }2957 }
2809- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 264, "\" data-merge-ok=\"")2958+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 279, "\" data-merge-ok=\"")
2810 if templ_7745c5c3_Err != nil {2959 if templ_7745c5c3_Err != nil {
2811 return templ_7745c5c3_Err2960 return templ_7745c5c3_Err
2812 }2961 }
2813- var templ_7745c5c3_Var132 string2962+ var templ_7745c5c3_Var141 string
2814- templ_7745c5c3_Var132, templ_7745c5c3_Err = templ.ResolveAttributeValue(strconv.FormatBool(v.MergeOk))2963+ templ_7745c5c3_Var141, templ_7745c5c3_Err = templ.ResolveAttributeValue(strconv.FormatBool(v.MergeOk))
2815 if templ_7745c5c3_Err != nil {2964 if templ_7745c5c3_Err != nil {
2816- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 561, Col: 47}2965+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 584, Col: 47}
2817 }2966 }
2818- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var132)2967+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var141)
2819 if templ_7745c5c3_Err != nil {2968 if templ_7745c5c3_Err != nil {
2820 return templ_7745c5c3_Err2969 return templ_7745c5c3_Err
2821 }2970 }
2822- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 265, "\" data-ff-reason=\"")2971+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 280, "\" data-ff-reason=\"")
2823 if templ_7745c5c3_Err != nil {2972 if templ_7745c5c3_Err != nil {
2824 return templ_7745c5c3_Err2973 return templ_7745c5c3_Err
2825 }2974 }
2826- var templ_7745c5c3_Var133 string2975+ var templ_7745c5c3_Var142 string
2827- templ_7745c5c3_Var133, templ_7745c5c3_Err = templ.ResolveAttributeValue(v.FFReason)2976+ templ_7745c5c3_Var142, templ_7745c5c3_Err = templ.ResolveAttributeValue(v.FFReason)
2828 if templ_7745c5c3_Err != nil {2977 if templ_7745c5c3_Err != nil {
2829- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 562, Col: 29}2978+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 585, Col: 29}
2830 }2979 }
2831- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var133)2980+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var142)
2832 if templ_7745c5c3_Err != nil {2981 if templ_7745c5c3_Err != nil {
2833 return templ_7745c5c3_Err2982 return templ_7745c5c3_Err
2834 }2983 }
2835- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 266, "\" data-merge-reason=\"")2984+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 281, "\" data-merge-reason=\"")
2836 if templ_7745c5c3_Err != nil {2985 if templ_7745c5c3_Err != nil {
2837 return templ_7745c5c3_Err2986 return templ_7745c5c3_Err
2838 }2987 }
2839- var templ_7745c5c3_Var134 string2988+ var templ_7745c5c3_Var143 string
2840- templ_7745c5c3_Var134, templ_7745c5c3_Err = templ.ResolveAttributeValue(v.MergeReason)2989+ templ_7745c5c3_Var143, templ_7745c5c3_Err = templ.ResolveAttributeValue(v.MergeReason)
2841 if templ_7745c5c3_Err != nil {2990 if templ_7745c5c3_Err != nil {
2842- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 563, Col: 35}2991+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 586, Col: 35}
2843 }2992 }
2844- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var134)2993+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var143)
2845 if templ_7745c5c3_Err != nil {2994 if templ_7745c5c3_Err != nil {
2846 return templ_7745c5c3_Err2995 return templ_7745c5c3_Err
2847 }2996 }
2848- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 267, "\"><span class=\"badge\" data-state=\"")2997+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 282, "\"><span class=\"badge\" data-state=\"")
2849 if templ_7745c5c3_Err != nil {2998 if templ_7745c5c3_Err != nil {
2850 return templ_7745c5c3_Err2999 return templ_7745c5c3_Err
2851 }3000 }
2852- var templ_7745c5c3_Var135 string3001+ var templ_7745c5c3_Var144 string
2853- templ_7745c5c3_Var135, templ_7745c5c3_Err = templ.ResolveAttributeValue(v.State)3002+ templ_7745c5c3_Var144, templ_7745c5c3_Err = templ.ResolveAttributeValue(v.State)
2854 if templ_7745c5c3_Err != nil {3003 if templ_7745c5c3_Err != nil {
2855- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 565, Col: 42}3004+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 588, Col: 42}
2856 }3005 }
2857- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var135)3006+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var144)
2858 if templ_7745c5c3_Err != nil {3007 if templ_7745c5c3_Err != nil {
2859 return templ_7745c5c3_Err3008 return templ_7745c5c3_Err
2860 }3009 }
2861- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 268, "\">")3010+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 283, "\">")
2862 if templ_7745c5c3_Err != nil {3011 if templ_7745c5c3_Err != nil {
2863 return templ_7745c5c3_Err3012 return templ_7745c5c3_Err
2864 }3013 }
2865- var templ_7745c5c3_Var136 string3014+ var templ_7745c5c3_Var145 string
2866- templ_7745c5c3_Var136, templ_7745c5c3_Err = templ.JoinStringErrs(v.Label)3015+ templ_7745c5c3_Var145, templ_7745c5c3_Err = templ.JoinStringErrs(v.Label)
2867 if templ_7745c5c3_Err != nil {3016 if templ_7745c5c3_Err != nil {
2868- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 565, Col: 54}3017+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 588, Col: 54}
2869 }3018 }
2870- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var136))3019+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var145))
2871 if templ_7745c5c3_Err != nil {3020 if templ_7745c5c3_Err != nil {
2872 return templ_7745c5c3_Err3021 return templ_7745c5c3_Err
2873 }3022 }
2874- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 269, "</span> ")3023+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 284, "</span> ")
2875 if templ_7745c5c3_Err != nil {3024 if templ_7745c5c3_Err != nil {
2876 return templ_7745c5c3_Err3025 return templ_7745c5c3_Err
2877 }3026 }
2878 if v.Detail != "" {3027 if v.Detail != "" {
2879- var templ_7745c5c3_Var137 string3028+ var templ_7745c5c3_Var146 string
2880- templ_7745c5c3_Var137, templ_7745c5c3_Err = templ.JoinStringErrs(" ")3029+ templ_7745c5c3_Var146, templ_7745c5c3_Err = templ.JoinStringErrs(" ")
2881 if templ_7745c5c3_Err != nil {3030 if templ_7745c5c3_Err != nil {
2882- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 567, Col: 8}3031+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 590, Col: 8}
2883 }3032 }
2884- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var137))3033+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var146))
2885 if templ_7745c5c3_Err != nil {3034 if templ_7745c5c3_Err != nil {
2886 return templ_7745c5c3_Err3035 return templ_7745c5c3_Err
2887 }3036 }
2888- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 270, "<span class=\"dim\">")3037+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 285, "<span class=\"dim\">")
2889 if templ_7745c5c3_Err != nil {3038 if templ_7745c5c3_Err != nil {
2890 return templ_7745c5c3_Err3039 return templ_7745c5c3_Err
2891 }3040 }
2892- var templ_7745c5c3_Var138 string3041+ var templ_7745c5c3_Var147 string
2893- templ_7745c5c3_Var138, templ_7745c5c3_Err = templ.JoinStringErrs(v.Detail)3042+ templ_7745c5c3_Var147, templ_7745c5c3_Err = templ.JoinStringErrs(v.Detail)
2894 if templ_7745c5c3_Err != nil {3043 if templ_7745c5c3_Err != nil {
2895- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 567, Col: 38}3044+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 590, Col: 38}
2896 }3045 }
2897- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var138))3046+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var147))
2898 if templ_7745c5c3_Err != nil {3047 if templ_7745c5c3_Err != nil {
2899 return templ_7745c5c3_Err3048 return templ_7745c5c3_Err
2900 }3049 }
2901- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 271, "</span>")3050+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 286, "</span>")
2902 if templ_7745c5c3_Err != nil {3051 if templ_7745c5c3_Err != nil {
2903 return templ_7745c5c3_Err3052 return templ_7745c5c3_Err
2904 }3053 }
2905 }3054 }
2906- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 272, "</span> ")3055+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 287, "</span> ")
2907 if templ_7745c5c3_Err != nil {3056 if templ_7745c5c3_Err != nil {
2908 return templ_7745c5c3_Err3057 return templ_7745c5c3_Err
2909 }3058 }
2910 if len(v.Paths) > 0 {3059 if len(v.Paths) > 0 {
2911- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 273, "<ul class=\"mg-paths\" aria-label=\"conflicting files\">")3060+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 288, "<ul class=\"mg-paths\" aria-label=\"conflicting files\">")
2912 if templ_7745c5c3_Err != nil {3061 if templ_7745c5c3_Err != nil {
2913 return templ_7745c5c3_Err3062 return templ_7745c5c3_Err
2914 }3063 }
2915 for _, path := range v.Paths {3064 for _, path := range v.Paths {
2916- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 274, "<li><code>")3065+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 289, "<li><code>")
2917 if templ_7745c5c3_Err != nil {3066 if templ_7745c5c3_Err != nil {
2918 return templ_7745c5c3_Err3067 return templ_7745c5c3_Err
2919 }3068 }
2920- var templ_7745c5c3_Var139 string3069+ var templ_7745c5c3_Var148 string
2921- templ_7745c5c3_Var139, templ_7745c5c3_Err = templ.JoinStringErrs(path)3070+ templ_7745c5c3_Var148, templ_7745c5c3_Err = templ.JoinStringErrs(path)
2922 if templ_7745c5c3_Err != nil {3071 if templ_7745c5c3_Err != nil {
2923- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 573, Col: 20}3072+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 596, Col: 20}
2924 }3073 }
2925- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var139))3074+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var148))
2926 if templ_7745c5c3_Err != nil {3075 if templ_7745c5c3_Err != nil {
2927 return templ_7745c5c3_Err3076 return templ_7745c5c3_Err
2928 }3077 }
2929- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 275, "</code></li>")3078+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 290, "</code></li>")
2930 if templ_7745c5c3_Err != nil {3079 if templ_7745c5c3_Err != nil {
2931 return templ_7745c5c3_Err3080 return templ_7745c5c3_Err
2932 }3081 }
2933 }3082 }
2934- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 276, "</ul>")3083+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 291, "</ul>")
2935 if templ_7745c5c3_Err != nil {3084 if templ_7745c5c3_Err != nil {
2936 return templ_7745c5c3_Err3085 return templ_7745c5c3_Err
2937 }3086 }
2938 }3087 }
2939 if v.PathsNote != "" {3088 if v.PathsNote != "" {
2940- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 277, "<p class=\"dim\">")3089+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 292, "<p class=\"dim\">")
2941 if templ_7745c5c3_Err != nil {3090 if templ_7745c5c3_Err != nil {
2942 return templ_7745c5c3_Err3091 return templ_7745c5c3_Err
2943 }3092 }
2944- var templ_7745c5c3_Var140 string3093+ var templ_7745c5c3_Var149 string
2945- templ_7745c5c3_Var140, templ_7745c5c3_Err = templ.JoinStringErrs(v.PathsNote)3094+ templ_7745c5c3_Var149, templ_7745c5c3_Err = templ.JoinStringErrs(v.PathsNote)
2946 if templ_7745c5c3_Err != nil {3095 if templ_7745c5c3_Err != nil {
2947- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 578, Col: 30}3096+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 601, Col: 30}
2948 }3097 }
2949- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var140))3098+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var149))
2950 if templ_7745c5c3_Err != nil {3099 if templ_7745c5c3_Err != nil {
2951 return templ_7745c5c3_Err3100 return templ_7745c5c3_Err
2952 }3101 }
2953- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 278, "</p>")3102+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 293, "</p>")
2954 if templ_7745c5c3_Err != nil {3103 if templ_7745c5c3_Err != nil {
2955 return templ_7745c5c3_Err3104 return templ_7745c5c3_Err
2956 }3105 }
@@ -2977,12 +3126,12 @@ func mrMergeabilitySlot(v MergeabilityView) templ.Component {
2977 }()3126 }()
2978 }3127 }
2979 ctx = templ.InitializeContext(ctx)3128 ctx = templ.InitializeContext(ctx)
2980- templ_7745c5c3_Var141 := templ.GetChildren(ctx)3129+ templ_7745c5c3_Var150 := templ.GetChildren(ctx)
2981- if templ_7745c5c3_Var141 == nil {3130+ if templ_7745c5c3_Var150 == nil {
2982- templ_7745c5c3_Var141 = templ.NopComponent3131+ templ_7745c5c3_Var150 = templ.NopComponent
2983 }3132 }
2984 ctx = templ.ClearChildren(ctx)3133 ctx = templ.ClearChildren(ctx)
2985- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 279, "<div id=\"mr-mergeability\" class=\"live-slot\" role=\"status\" data-slot>")3134+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 294, "<div id=\"mr-mergeability\" class=\"live-slot\" role=\"status\" data-slot>")
2986 if templ_7745c5c3_Err != nil {3135 if templ_7745c5c3_Err != nil {
2987 return templ_7745c5c3_Err3136 return templ_7745c5c3_Err
2988 }3137 }
@@ -2990,7 +3139,7 @@ func mrMergeabilitySlot(v MergeabilityView) templ.Component {
2990 if templ_7745c5c3_Err != nil {3139 if templ_7745c5c3_Err != nil {
2991 return templ_7745c5c3_Err3140 return templ_7745c5c3_Err
2992 }3141 }
2993- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 280, "</div>")3142+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 295, "</div>")
2994 if templ_7745c5c3_Err != nil {3143 if templ_7745c5c3_Err != nil {
2995 return templ_7745c5c3_Err3144 return templ_7745c5c3_Err
2996 }3145 }
@@ -3015,9 +3164,9 @@ func MRMergeabilityFragment(v MergeabilityView) templ.Component {
3015 }()3164 }()
3016 }3165 }
3017 ctx = templ.InitializeContext(ctx)3166 ctx = templ.InitializeContext(ctx)
3018- templ_7745c5c3_Var142 := templ.GetChildren(ctx)3167+ templ_7745c5c3_Var151 := templ.GetChildren(ctx)
3019- if templ_7745c5c3_Var142 == nil {3168+ if templ_7745c5c3_Var151 == nil {
3020- templ_7745c5c3_Var142 = templ.NopComponent3169+ templ_7745c5c3_Var151 = templ.NopComponent
3021 }3170 }
3022 ctx = templ.ClearChildren(ctx)3171 ctx = templ.ClearChildren(ctx)
3023 templ_7745c5c3_Err = mrMergeabilitySlot(v).Render(ctx, templ_7745c5c3_Buffer)3172 templ_7745c5c3_Err = mrMergeabilitySlot(v).Render(ctx, templ_7745c5c3_Buffer)
@@ -3046,128 +3195,128 @@ func moreMenu(p MRPage) templ.Component {
3046 }()3195 }()
3047 }3196 }
3048 ctx = templ.InitializeContext(ctx)3197 ctx = templ.InitializeContext(ctx)
3049- templ_7745c5c3_Var143 := templ.GetChildren(ctx)3198+ templ_7745c5c3_Var152 := templ.GetChildren(ctx)
3050- if templ_7745c5c3_Var143 == nil {3199+ if templ_7745c5c3_Var152 == nil {
3051- templ_7745c5c3_Var143 = templ.NopComponent3200+ templ_7745c5c3_Var152 = templ.NopComponent
3052 }3201 }
3053 ctx = templ.ClearChildren(ctx)3202 ctx = templ.ClearChildren(ctx)
3054- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 281, "<details class=\"menu omenu\"><summary class=\"btn icon\" aria-label=\"More actions\" title=\"more actions\">⋯</summary><div class=\"menu-pop\" role=\"group\" aria-label=\"More actions\"><section class=\"merge-settings\"><h2>Merge settings</h2><dl class=\"kv\"><dt>modes</dt><dd>")3203+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 296, "<details class=\"menu omenu\"><summary class=\"btn icon\" aria-label=\"More actions\" title=\"more actions\">⋯</summary><div class=\"menu-pop\" role=\"group\" aria-label=\"More actions\"><section class=\"merge-settings\"><h2>Merge settings</h2><dl class=\"kv\"><dt>modes</dt><dd>")
3055 if templ_7745c5c3_Err != nil {3204 if templ_7745c5c3_Err != nil {
3056 return templ_7745c5c3_Err3205 return templ_7745c5c3_Err
3057 }3206 }
3058- var templ_7745c5c3_Var144 string3207+ var templ_7745c5c3_Var153 string
3059- templ_7745c5c3_Var144, templ_7745c5c3_Err = templ.JoinStringErrs(strings.Join(p.Modes, ", "))3208+ templ_7745c5c3_Var153, templ_7745c5c3_Err = templ.JoinStringErrs(strings.Join(p.Modes, ", "))
3060 if templ_7745c5c3_Err != nil {3209 if templ_7745c5c3_Err != nil {
3061- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 605, Col: 38}3210+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 628, Col: 38}
3062 }3211 }
3063- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var144))3212+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var153))
3064 if templ_7745c5c3_Err != nil {3213 if templ_7745c5c3_Err != nil {
3065 return templ_7745c5c3_Err3214 return templ_7745c5c3_Err
3066 }3215 }
3067- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 282, "</dd><dt>checks</dt><dd>")3216+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 297, "</dd><dt>checks</dt><dd>")
3068 if templ_7745c5c3_Err != nil {3217 if templ_7745c5c3_Err != nil {
3069 return templ_7745c5c3_Err3218 return templ_7745c5c3_Err
3070 }3219 }
3071 if p.ChecksBlock {3220 if p.ChecksBlock {
3072- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 283, "failing ones block the merge")3221+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 298, "failing ones block the merge")
3073 if templ_7745c5c3_Err != nil {3222 if templ_7745c5c3_Err != nil {
3074 return templ_7745c5c3_Err3223 return templ_7745c5c3_Err
3075 }3224 }
3076 } else {3225 } else {
3077- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 284, "do not block the merge")3226+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 299, "do not block the merge")
3078 if templ_7745c5c3_Err != nil {3227 if templ_7745c5c3_Err != nil {
3079 return templ_7745c5c3_Err3228 return templ_7745c5c3_Err
3080 }3229 }
3081 }3230 }
3082- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 285, "</dd></dl></section>")3231+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 300, "</dd></dl></section>")
3083 if templ_7745c5c3_Err != nil {3232 if templ_7745c5c3_Err != nil {
3084 return templ_7745c5c3_Err3233 return templ_7745c5c3_Err
3085 }3234 }
3086 if p.Box != nil {3235 if p.Box != nil {
3087 if p.Box.Signed {3236 if p.Box.Signed {
3088- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 286, "<p class=\"d-note\" id=\"mr-signing\">squash and merge commits are signed with ermite's own key (generated on first start). ")3237+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 301, "<p class=\"d-note\" id=\"mr-signing\">squash and merge commits are signed with ermite's own key (generated on first start). ")
3089 if templ_7745c5c3_Err != nil {3238 if templ_7745c5c3_Err != nil {
3090 return templ_7745c5c3_Err3239 return templ_7745c5c3_Err
3091 }3240 }
3092 if p.Box.Fingerprint != "" {3241 if p.Box.Fingerprint != "" {
3093- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 287, "fingerprint <code>")3242+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 302, "fingerprint <code>")
3094 if templ_7745c5c3_Err != nil {3243 if templ_7745c5c3_Err != nil {
3095 return templ_7745c5c3_Err3244 return templ_7745c5c3_Err
3096 }3245 }
3097- var templ_7745c5c3_Var145 string3246+ var templ_7745c5c3_Var154 string
3098- templ_7745c5c3_Var145, templ_7745c5c3_Err = templ.JoinStringErrs(p.Box.Fingerprint)3247+ templ_7745c5c3_Var154, templ_7745c5c3_Err = templ.JoinStringErrs(p.Box.Fingerprint)
3099 if templ_7745c5c3_Err != nil {3248 if templ_7745c5c3_Err != nil {
3100- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 621, Col: 44}3249+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 644, Col: 44}
3101 }3250 }
3102- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var145))3251+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var154))
3103 if templ_7745c5c3_Err != nil {3252 if templ_7745c5c3_Err != nil {
3104 return templ_7745c5c3_Err3253 return templ_7745c5c3_Err
3105 }3254 }
3106- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 288, "</code> ")3255+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 303, "</code> ")
3107 if templ_7745c5c3_Err != nil {3256 if templ_7745c5c3_Err != nil {
3108 return templ_7745c5c3_Err3257 return templ_7745c5c3_Err
3109 }3258 }
3110 }3259 }
3111- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 289, "<code>ermite signing-key show</code> prints it.</p>")3260+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 304, "<code>ermite signing-key show</code> prints it.</p>")
3112 if templ_7745c5c3_Err != nil {3261 if templ_7745c5c3_Err != nil {
3113 return templ_7745c5c3_Err3262 return templ_7745c5c3_Err
3114 }3263 }
3115 }3264 }
3116- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 290, " ")3265+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 305, " ")
3117 if templ_7745c5c3_Err != nil {3266 if templ_7745c5c3_Err != nil {
3118 return templ_7745c5c3_Err3267 return templ_7745c5c3_Err
3119 }3268 }
3120 if p.Box.CanMarkRead {3269 if p.Box.CanMarkRead {
3121- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 291, "<form method=\"post\" action=\"")3270+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 306, "<form method=\"post\" action=\"")
3122 if templ_7745c5c3_Err != nil {3271 if templ_7745c5c3_Err != nil {
3123 return templ_7745c5c3_Err3272 return templ_7745c5c3_Err
3124 }3273 }
3125- var templ_7745c5c3_Var146 templ.SafeURL3274+ var templ_7745c5c3_Var155 templ.SafeURL
3126- templ_7745c5c3_Var146, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.Box.ReadAction))3275+ templ_7745c5c3_Var155, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.Box.ReadAction))
3127 if templ_7745c5c3_Err != nil {3276 if templ_7745c5c3_Err != nil {
3128- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 627, Col: 65}3277+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 650, Col: 65}
3129 }3278 }
3130- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var146))3279+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var155))
3131 if templ_7745c5c3_Err != nil {3280 if templ_7745c5c3_Err != nil {
3132 return templ_7745c5c3_Err3281 return templ_7745c5c3_Err
3133 }3282 }
3134- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 292, "\"><input type=\"hidden\" name=\"head_id\" value=\"")3283+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 307, "\"><input type=\"hidden\" name=\"head_id\" value=\"")
3135 if templ_7745c5c3_Err != nil {3284 if templ_7745c5c3_Err != nil {
3136 return templ_7745c5c3_Err3285 return templ_7745c5c3_Err
3137 }3286 }
3138- var templ_7745c5c3_Var147 string3287+ var templ_7745c5c3_Var156 string
3139- templ_7745c5c3_Var147, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.Box.Head)3288+ templ_7745c5c3_Var156, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.Box.Head)
3140 if templ_7745c5c3_Err != nil {3289 if templ_7745c5c3_Err != nil {
3141- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 628, Col: 60}3290+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 651, Col: 60}
3142 }3291 }
3143- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var147)3292+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var156)
3144 if templ_7745c5c3_Err != nil {3293 if templ_7745c5c3_Err != nil {
3145 return templ_7745c5c3_Err3294 return templ_7745c5c3_Err
3146 }3295 }
3147- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 293, "\"> <button type=\"submit\" title=\"the next visit can show only what changed after this head\" class=\"btn\" aria-keyshortcuts=\"Shift+R\" data-read>Mark read <kbd aria-hidden=\"true\">R</kbd></button></form>")3296+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 308, "\"> <button type=\"submit\" title=\"the next visit can show only what changed after this head\" class=\"btn\" aria-keyshortcuts=\"Shift+R\" data-read>Mark read <kbd aria-hidden=\"true\">R</kbd></button></form>")
3148 if templ_7745c5c3_Err != nil {3297 if templ_7745c5c3_Err != nil {
3149 return templ_7745c5c3_Err3298 return templ_7745c5c3_Err
3150 }3299 }
3151 }3300 }
3152- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 294, " <form method=\"post\" action=\"")3301+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 309, " <form method=\"post\" action=\"")
3153 if templ_7745c5c3_Err != nil {3302 if templ_7745c5c3_Err != nil {
3154 return templ_7745c5c3_Err3303 return templ_7745c5c3_Err
3155 }3304 }
3156- var templ_7745c5c3_Var148 templ.SafeURL3305+ var templ_7745c5c3_Var157 templ.SafeURL
3157- templ_7745c5c3_Var148, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.Box.CloseAction))3306+ templ_7745c5c3_Var157, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.Box.CloseAction))
3158 if templ_7745c5c3_Err != nil {3307 if templ_7745c5c3_Err != nil {
3159- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 632, Col: 65}3308+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 655, Col: 65}
3160 }3309 }
3161- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var148))3310+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var157))
3162 if templ_7745c5c3_Err != nil {3311 if templ_7745c5c3_Err != nil {
3163 return templ_7745c5c3_Err3312 return templ_7745c5c3_Err
3164 }3313 }
3165- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 295, "\"><button type=\"submit\" title=\"close without merging; the branch is kept\" class=\"btn danger\">Close</button></form>")3314+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 310, "\"><button type=\"submit\" title=\"close without merging; the branch is kept\" class=\"btn danger\">Close</button></form>")
3166 if templ_7745c5c3_Err != nil {3315 if templ_7745c5c3_Err != nil {
3167 return templ_7745c5c3_Err3316 return templ_7745c5c3_Err
3168 }3317 }
3169 if !p.Box.HeadGone && p.Box.ReadyAction == "" {3318 if !p.Box.HeadGone && p.Box.ReadyAction == "" {
3170- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 296, "<details class=\"d-or\"><summary class=\"mute\">or from a terminal</summary>")3319+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 311, "<details class=\"d-or\"><summary class=\"mute\">or from a terminal</summary>")
3171 if templ_7745c5c3_Err != nil {3320 if templ_7745c5c3_Err != nil {
3172 return templ_7745c5c3_Err3321 return templ_7745c5c3_Err
3173 }3322 }
@@ -3175,13 +3324,13 @@ func moreMenu(p MRPage) templ.Component {
3175 if templ_7745c5c3_Err != nil {3324 if templ_7745c5c3_Err != nil {
3176 return templ_7745c5c3_Err3325 return templ_7745c5c3_Err
3177 }3326 }
3178- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 297, "</details>")3327+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 312, "</details>")
3179 if templ_7745c5c3_Err != nil {3328 if templ_7745c5c3_Err != nil {
3180 return templ_7745c5c3_Err3329 return templ_7745c5c3_Err
3181 }3330 }
3182 }3331 }
3183 }3332 }
3184- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 298, "</div></details>")3333+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 313, "</div></details>")
3185 if templ_7745c5c3_Err != nil {3334 if templ_7745c5c3_Err != nil {
3186 return templ_7745c5c3_Err3335 return templ_7745c5c3_Err
3187 }3336 }
@@ -3205,12 +3354,12 @@ func Compare(l Layout, p ComparePage) templ.Component {
3205 }()3354 }()
3206 }3355 }
3207 ctx = templ.InitializeContext(ctx)3356 ctx = templ.InitializeContext(ctx)
3208- templ_7745c5c3_Var149 := templ.GetChildren(ctx)3357+ templ_7745c5c3_Var158 := templ.GetChildren(ctx)
3209- if templ_7745c5c3_Var149 == nil {3358+ if templ_7745c5c3_Var158 == nil {
3210- templ_7745c5c3_Var149 = templ.NopComponent3359+ templ_7745c5c3_Var158 = templ.NopComponent
3211 }3360 }
3212 ctx = templ.ClearChildren(ctx)3361 ctx = templ.ClearChildren(ctx)
3213- templ_7745c5c3_Var150 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {3362+ templ_7745c5c3_Var159 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
3214 templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context3363 templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
3215 templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)3364 templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
3216 if !templ_7745c5c3_IsBuffer {3365 if !templ_7745c5c3_IsBuffer {
@@ -3222,263 +3371,263 @@ func Compare(l Layout, p ComparePage) templ.Component {
3222 }()3371 }()
3223 }3372 }
3224 ctx = templ.InitializeContext(ctx)3373 ctx = templ.InitializeContext(ctx)
3225- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 299, "<header class=\"show mr-h\"><h1>")3374+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 314, "<header class=\"show mr-h\"><h1>")
3226 if templ_7745c5c3_Err != nil {3375 if templ_7745c5c3_Err != nil {
3227 return templ_7745c5c3_Err3376 return templ_7745c5c3_Err
3228 }3377 }
3229- var templ_7745c5c3_Var151 string3378+ var templ_7745c5c3_Var160 string
3230- templ_7745c5c3_Var151, templ_7745c5c3_Err = templ.JoinStringErrs(p.Source)3379+ templ_7745c5c3_Var160, templ_7745c5c3_Err = templ.JoinStringErrs(p.Source)
3231 if templ_7745c5c3_Err != nil {3380 if templ_7745c5c3_Err != nil {
3232- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 649, Col: 17}3381+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 672, Col: 17}
3233 }3382 }
3234- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var151))3383+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var160))
3235 if templ_7745c5c3_Err != nil {3384 if templ_7745c5c3_Err != nil {
3236 return templ_7745c5c3_Err3385 return templ_7745c5c3_Err
3237 }3386 }
3238- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 300, " → ")3387+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 315, " → ")
3239 if templ_7745c5c3_Err != nil {3388 if templ_7745c5c3_Err != nil {
3240 return templ_7745c5c3_Err3389 return templ_7745c5c3_Err
3241 }3390 }
3242- var templ_7745c5c3_Var152 string3391+ var templ_7745c5c3_Var161 string
3243- templ_7745c5c3_Var152, templ_7745c5c3_Err = templ.JoinStringErrs(p.Target)3392+ templ_7745c5c3_Var161, templ_7745c5c3_Err = templ.JoinStringErrs(p.Target)
3244 if templ_7745c5c3_Err != nil {3393 if templ_7745c5c3_Err != nil {
3245- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 649, Col: 34}3394+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 672, Col: 34}
3246 }3395 }
3247- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var152))3396+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var161))
3248 if templ_7745c5c3_Err != nil {3397 if templ_7745c5c3_Err != nil {
3249 return templ_7745c5c3_Err3398 return templ_7745c5c3_Err
3250 }3399 }
3251- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 301, "</h1><dl class=\"kv show-kv\"><dt>branch</dt><dd><a href=\"")3400+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 316, "</h1><dl class=\"kv show-kv\"><dt>branch</dt><dd><a href=\"")
3252 if templ_7745c5c3_Err != nil {3401 if templ_7745c5c3_Err != nil {
3253 return templ_7745c5c3_Err3402 return templ_7745c5c3_Err
3254 }3403 }
3255- var templ_7745c5c3_Var153 templ.SafeURL3404+ var templ_7745c5c3_Var162 templ.SafeURL
3256- templ_7745c5c3_Var153, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.SourceHref))3405+ templ_7745c5c3_Var162, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.SourceHref))
3257 if templ_7745c5c3_Err != nil {3406 if templ_7745c5c3_Err != nil {
3258- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 652, Col: 45}3407+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 675, Col: 45}
3259 }3408 }
3260- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var153))3409+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var162))
3261 if templ_7745c5c3_Err != nil {3410 if templ_7745c5c3_Err != nil {
3262 return templ_7745c5c3_Err3411 return templ_7745c5c3_Err
3263 }3412 }
3264- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 302, "\">")3413+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 317, "\">")
3265 if templ_7745c5c3_Err != nil {3414 if templ_7745c5c3_Err != nil {
3266 return templ_7745c5c3_Err3415 return templ_7745c5c3_Err
3267 }3416 }
3268- var templ_7745c5c3_Var154 string3417+ var templ_7745c5c3_Var163 string
3269- templ_7745c5c3_Var154, templ_7745c5c3_Err = templ.JoinStringErrs(p.Source)3418+ templ_7745c5c3_Var163, templ_7745c5c3_Err = templ.JoinStringErrs(p.Source)
3270 if templ_7745c5c3_Err != nil {3419 if templ_7745c5c3_Err != nil {
3271- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 652, Col: 58}3420+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 675, Col: 58}
3272 }3421 }
3273- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var154))3422+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var163))
3274 if templ_7745c5c3_Err != nil {3423 if templ_7745c5c3_Err != nil {
3275 return templ_7745c5c3_Err3424 return templ_7745c5c3_Err
3276 }3425 }
3277- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 303, "</a></dd><dt>target</dt><dd><a href=\"")3426+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 318, "</a></dd><dt>target</dt><dd><a href=\"")
3278 if templ_7745c5c3_Err != nil {3427 if templ_7745c5c3_Err != nil {
3279 return templ_7745c5c3_Err3428 return templ_7745c5c3_Err
3280 }3429 }
3281- var templ_7745c5c3_Var155 templ.SafeURL3430+ var templ_7745c5c3_Var164 templ.SafeURL
3282- templ_7745c5c3_Var155, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.TargetHref))3431+ templ_7745c5c3_Var164, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.TargetHref))
3283 if templ_7745c5c3_Err != nil {3432 if templ_7745c5c3_Err != nil {
3284- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 654, Col: 45}3433+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 677, Col: 45}
3285 }3434 }
3286- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var155))3435+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var164))
3287 if templ_7745c5c3_Err != nil {3436 if templ_7745c5c3_Err != nil {
3288 return templ_7745c5c3_Err3437 return templ_7745c5c3_Err
3289 }3438 }
3290- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 304, "\">")3439+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 319, "\">")
3291 if templ_7745c5c3_Err != nil {3440 if templ_7745c5c3_Err != nil {
3292 return templ_7745c5c3_Err3441 return templ_7745c5c3_Err
3293 }3442 }
3294- var templ_7745c5c3_Var156 string3443+ var templ_7745c5c3_Var165 string
3295- templ_7745c5c3_Var156, templ_7745c5c3_Err = templ.JoinStringErrs(p.Target)3444+ templ_7745c5c3_Var165, templ_7745c5c3_Err = templ.JoinStringErrs(p.Target)
3296 if templ_7745c5c3_Err != nil {3445 if templ_7745c5c3_Err != nil {
3297- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 654, Col: 58}3446+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 677, Col: 58}
3298 }3447 }
3299- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var156))3448+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var165))
3300 if templ_7745c5c3_Err != nil {3449 if templ_7745c5c3_Err != nil {
3301 return templ_7745c5c3_Err3450 return templ_7745c5c3_Err
3302 }3451 }
3303- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 305, "</a></dd><dt>ahead</dt><dd>")3452+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 320, "</a></dd><dt>ahead</dt><dd>")
3304 if templ_7745c5c3_Err != nil {3453 if templ_7745c5c3_Err != nil {
3305 return templ_7745c5c3_Err3454 return templ_7745c5c3_Err
3306 }3455 }
3307- var templ_7745c5c3_Var157 string3456+ var templ_7745c5c3_Var166 string
3308- templ_7745c5c3_Var157, templ_7745c5c3_Err = templ.JoinStringErrs(p.AheadText)3457+ templ_7745c5c3_Var166, templ_7745c5c3_Err = templ.JoinStringErrs(p.AheadText)
3309 if templ_7745c5c3_Err != nil {3458 if templ_7745c5c3_Err != nil {
3310- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 656, Col: 21}3459+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 679, Col: 21}
3311 }3460 }
3312- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var157))3461+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var166))
3313 if templ_7745c5c3_Err != nil {3462 if templ_7745c5c3_Err != nil {
3314 return templ_7745c5c3_Err3463 return templ_7745c5c3_Err
3315 }3464 }
3316- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 306, "</dd></dl></header>")3465+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 321, "</dd></dl></header>")
3317 if templ_7745c5c3_Err != nil {3466 if templ_7745c5c3_Err != nil {
3318 return templ_7745c5c3_Err3467 return templ_7745c5c3_Err
3319 }3468 }
3320 if p.Note != "" {3469 if p.Note != "" {
3321- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 307, "<p class=\"notice\">")3470+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 322, "<p class=\"notice\">")
3322 if templ_7745c5c3_Err != nil {3471 if templ_7745c5c3_Err != nil {
3323 return templ_7745c5c3_Err3472 return templ_7745c5c3_Err
3324 }3473 }
3325- var templ_7745c5c3_Var158 string3474+ var templ_7745c5c3_Var167 string
3326- templ_7745c5c3_Var158, templ_7745c5c3_Err = templ.JoinStringErrs(p.Note)3475+ templ_7745c5c3_Var167, templ_7745c5c3_Err = templ.JoinStringErrs(p.Note)
3327 if templ_7745c5c3_Err != nil {3476 if templ_7745c5c3_Err != nil {
3328- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 660, Col: 29}3477+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 683, Col: 29}
3329 }3478 }
3330- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var158))3479+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var167))
3331 if templ_7745c5c3_Err != nil {3480 if templ_7745c5c3_Err != nil {
3332 return templ_7745c5c3_Err3481 return templ_7745c5c3_Err
3333 }3482 }
3334- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 308, "</p>")3483+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 323, "</p>")
3335 if templ_7745c5c3_Err != nil {3484 if templ_7745c5c3_Err != nil {
3336 return templ_7745c5c3_Err3485 return templ_7745c5c3_Err
3337 }3486 }
3338 }3487 }
3339- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 309, " ")3488+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 324, " ")
3340 if templ_7745c5c3_Err != nil {3489 if templ_7745c5c3_Err != nil {
3341 return templ_7745c5c3_Err3490 return templ_7745c5c3_Err
3342 }3491 }
3343 if p.Existing != nil {3492 if p.Existing != nil {
3344- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 310, "<p class=\"notice\">an open merge request already covers these branches: <a href=\"")3493+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 325, "<p class=\"notice\">an open merge request already covers these branches: <a href=\"")
3345 if templ_7745c5c3_Err != nil {3494 if templ_7745c5c3_Err != nil {
3346 return templ_7745c5c3_Err3495 return templ_7745c5c3_Err
3347 }3496 }
3348- var templ_7745c5c3_Var159 templ.SafeURL3497+ var templ_7745c5c3_Var168 templ.SafeURL
3349- templ_7745c5c3_Var159, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.Existing.Href))3498+ templ_7745c5c3_Var168, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.Existing.Href))
3350 if templ_7745c5c3_Err != nil {3499 if templ_7745c5c3_Err != nil {
3351- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 663, Col: 114}3500+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 686, Col: 114}
3352 }3501 }
3353- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var159))3502+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var168))
3354 if templ_7745c5c3_Err != nil {3503 if templ_7745c5c3_Err != nil {
3355 return templ_7745c5c3_Err3504 return templ_7745c5c3_Err
3356 }3505 }
3357- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 311, "\">")3506+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 326, "\">")
3358 if templ_7745c5c3_Err != nil {3507 if templ_7745c5c3_Err != nil {
3359 return templ_7745c5c3_Err3508 return templ_7745c5c3_Err
3360 }3509 }
3361- var templ_7745c5c3_Var160 string3510+ var templ_7745c5c3_Var169 string
3362- templ_7745c5c3_Var160, templ_7745c5c3_Err = templ.JoinStringErrs(p.Existing.Label)3511+ templ_7745c5c3_Var169, templ_7745c5c3_Err = templ.JoinStringErrs(p.Existing.Label)
3363 if templ_7745c5c3_Err != nil {3512 if templ_7745c5c3_Err != nil {
3364- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 663, Col: 135}3513+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 686, Col: 135}
3365 }3514 }
3366- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var160))3515+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var169))
3367 if templ_7745c5c3_Err != nil {3516 if templ_7745c5c3_Err != nil {
3368 return templ_7745c5c3_Err3517 return templ_7745c5c3_Err
3369 }3518 }
3370- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 312, "</a></p>")3519+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 327, "</a></p>")
3371 if templ_7745c5c3_Err != nil {3520 if templ_7745c5c3_Err != nil {
3372 return templ_7745c5c3_Err3521 return templ_7745c5c3_Err
3373 }3522 }
3374 }3523 }
3375- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 313, " ")3524+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 328, " ")
3376 if templ_7745c5c3_Err != nil {3525 if templ_7745c5c3_Err != nil {
3377 return templ_7745c5c3_Err3526 return templ_7745c5c3_Err
3378 }3527 }
3379 if p.Create != nil {3528 if p.Create != nil {
3380- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 314, "<form class=\"cform create\" method=\"post\" action=\"")3529+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 329, "<form class=\"cform create\" method=\"post\" action=\"")
3381 if templ_7745c5c3_Err != nil {3530 if templ_7745c5c3_Err != nil {
3382 return templ_7745c5c3_Err3531 return templ_7745c5c3_Err
3383 }3532 }
3384- var templ_7745c5c3_Var161 templ.SafeURL3533+ var templ_7745c5c3_Var170 templ.SafeURL
3385- templ_7745c5c3_Var161, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.Create.Action))3534+ templ_7745c5c3_Var170, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.Create.Action))
3386 if templ_7745c5c3_Err != nil {3535 if templ_7745c5c3_Err != nil {
3387- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 666, Col: 83}3536+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 689, Col: 83}
3388 }3537 }
3389- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var161))3538+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var170))
3390 if templ_7745c5c3_Err != nil {3539 if templ_7745c5c3_Err != nil {
3391 return templ_7745c5c3_Err3540 return templ_7745c5c3_Err
3392 }3541 }
3393- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 315, "\"><input type=\"hidden\" name=\"source\" value=\"")3542+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 330, "\"><input type=\"hidden\" name=\"source\" value=\"")
3394 if templ_7745c5c3_Err != nil {3543 if templ_7745c5c3_Err != nil {
3395 return templ_7745c5c3_Err3544 return templ_7745c5c3_Err
3396 }3545 }
3397- var templ_7745c5c3_Var162 string3546+ var templ_7745c5c3_Var171 string
3398- templ_7745c5c3_Var162, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.Create.Source)3547+ templ_7745c5c3_Var171, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.Create.Source)
3399 if templ_7745c5c3_Err != nil {3548 if templ_7745c5c3_Err != nil {
3400- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 667, Col: 62}3549+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 690, Col: 62}
3401 }3550 }
3402- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var162)3551+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var171)
3403 if templ_7745c5c3_Err != nil {3552 if templ_7745c5c3_Err != nil {
3404 return templ_7745c5c3_Err3553 return templ_7745c5c3_Err
3405 }3554 }
3406- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 316, "\"> <input type=\"hidden\" name=\"target\" value=\"")3555+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 331, "\"> <input type=\"hidden\" name=\"target\" value=\"")
3407 if templ_7745c5c3_Err != nil {3556 if templ_7745c5c3_Err != nil {
3408 return templ_7745c5c3_Err3557 return templ_7745c5c3_Err
3409 }3558 }
3410- var templ_7745c5c3_Var163 string3559+ var templ_7745c5c3_Var172 string
3411- templ_7745c5c3_Var163, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.Create.Target)3560+ templ_7745c5c3_Var172, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.Create.Target)
3412 if templ_7745c5c3_Err != nil {3561 if templ_7745c5c3_Err != nil {
3413- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 668, Col: 62}3562+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 691, Col: 62}
3414 }3563 }
3415- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var163)3564+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var172)
3416 if templ_7745c5c3_Err != nil {3565 if templ_7745c5c3_Err != nil {
3417 return templ_7745c5c3_Err3566 return templ_7745c5c3_Err
3418 }3567 }
3419- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 317, "\"> <label for=\"mr-title\">title</label> <input id=\"mr-title\" name=\"title\" type=\"text\" maxlength=\"120\" required value=\"")3568+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 332, "\"> <label for=\"mr-title\">title</label> <input id=\"mr-title\" name=\"title\" type=\"text\" maxlength=\"120\" required value=\"")
3420 if templ_7745c5c3_Err != nil {3569 if templ_7745c5c3_Err != nil {
3421 return templ_7745c5c3_Err3570 return templ_7745c5c3_Err
3422 }3571 }
3423- var templ_7745c5c3_Var164 string3572+ var templ_7745c5c3_Var173 string
3424- templ_7745c5c3_Var164, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.Create.Title)3573+ templ_7745c5c3_Var173, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.Create.Title)
3425 if templ_7745c5c3_Err != nil {3574 if templ_7745c5c3_Err != nil {
3426- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 670, Col: 97}3575+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 693, Col: 97}
3427 }3576 }
3428- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var164)3577+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var173)
3429 if templ_7745c5c3_Err != nil {3578 if templ_7745c5c3_Err != nil {
3430 return templ_7745c5c3_Err3579 return templ_7745c5c3_Err
3431 }3580 }
3432- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 318, "\" autocomplete=\"off\"> <label for=\"mr-desc\">description</label> <textarea id=\"mr-desc\" name=\"description\" rows=\"4\" maxlength=\"8000\" placeholder=\"Markdown, optional\"></textarea><div class=\"f-btns\"><button type=\"submit\" class=\"btn primary\">Create merge request</button></div></form>")3581+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 333, "\" autocomplete=\"off\"> <label for=\"mr-desc\">description</label> <textarea id=\"mr-desc\" name=\"description\" rows=\"4\" maxlength=\"8000\" placeholder=\"Markdown, optional\"></textarea><div class=\"f-btns\"><button type=\"submit\" class=\"btn primary\">Create merge request</button></div></form>")
3433 if templ_7745c5c3_Err != nil {3582 if templ_7745c5c3_Err != nil {
3434 return templ_7745c5c3_Err3583 return templ_7745c5c3_Err
3435 }3584 }
3436 }3585 }
3437- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 319, " ")3586+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 334, " ")
3438 if templ_7745c5c3_Err != nil {3587 if templ_7745c5c3_Err != nil {
3439 return templ_7745c5c3_Err3588 return templ_7745c5c3_Err
3440 }3589 }
3441 if p.HasDiff {3590 if p.HasDiff {
3442- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 320, "<div class=\"diff-tools\" role=\"group\" aria-label=\"Diff view\"><span class=\"dim\">")3591+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 335, "<div class=\"diff-tools\" role=\"group\" aria-label=\"Diff view\"><span class=\"dim\">")
3443 if templ_7745c5c3_Err != nil {3592 if templ_7745c5c3_Err != nil {
3444 return templ_7745c5c3_Err3593 return templ_7745c5c3_Err
3445 }3594 }
3446- var templ_7745c5c3_Var165 string3595+ var templ_7745c5c3_Var174 string
3447- templ_7745c5c3_Var165, templ_7745c5c3_Err = templ.JoinStringErrs(plural(p.NFiles, "file", "files"))3596+ templ_7745c5c3_Var174, templ_7745c5c3_Err = templ.JoinStringErrs(plural(p.NFiles, "file", "files"))
3448 if templ_7745c5c3_Err != nil {3597 if templ_7745c5c3_Err != nil {
3449- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 680, Col: 57}3598+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 703, Col: 57}
3450 }3599 }
3451- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var165))3600+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var174))
3452 if templ_7745c5c3_Err != nil {3601 if templ_7745c5c3_Err != nil {
3453 return templ_7745c5c3_Err3602 return templ_7745c5c3_Err
3454 }3603 }
3455- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 321, " · <span class=\"plus\">+")3604+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 336, " · <span class=\"plus\">+")
3456 if templ_7745c5c3_Err != nil {3605 if templ_7745c5c3_Err != nil {
3457 return templ_7745c5c3_Err3606 return templ_7745c5c3_Err
3458 }3607 }
3459- var templ_7745c5c3_Var166 string3608+ var templ_7745c5c3_Var175 string
3460- templ_7745c5c3_Var166, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(p.Adds))3609+ templ_7745c5c3_Var175, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(p.Adds))
3461 if templ_7745c5c3_Err != nil {3610 if templ_7745c5c3_Err != nil {
3462- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 680, Col: 97}3611+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 703, Col: 97}
3463 }3612 }
3464- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var166))3613+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var175))
3465 if templ_7745c5c3_Err != nil {3614 if templ_7745c5c3_Err != nil {
3466 return templ_7745c5c3_Err3615 return templ_7745c5c3_Err
3467 }3616 }
3468- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 322, "</span> <span class=\"minus\">-")3617+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 337, "</span> <span class=\"minus\">-")
3469 if templ_7745c5c3_Err != nil {3618 if templ_7745c5c3_Err != nil {
3470 return templ_7745c5c3_Err3619 return templ_7745c5c3_Err
3471 }3620 }
3472- var templ_7745c5c3_Var167 string3621+ var templ_7745c5c3_Var176 string
3473- templ_7745c5c3_Var167, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(p.Dels))3622+ templ_7745c5c3_Var176, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(p.Dels))
3474 if templ_7745c5c3_Err != nil {3623 if templ_7745c5c3_Err != nil {
3475- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 680, Col: 142}3624+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 703, Col: 142}
3476 }3625 }
3477- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var167))3626+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var176))
3478 if templ_7745c5c3_Err != nil {3627 if templ_7745c5c3_Err != nil {
3479 return templ_7745c5c3_Err3628 return templ_7745c5c3_Err
3480 }3629 }
3481- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 323, "</span></span> <span class=\"grow\"></span>")3630+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 338, "</span></span> <span class=\"grow\"></span>")
3482 if templ_7745c5c3_Err != nil {3631 if templ_7745c5c3_Err != nil {
3483 return templ_7745c5c3_Err3632 return templ_7745c5c3_Err
3484 }3633 }
@@ -3486,64 +3635,64 @@ func Compare(l Layout, p ComparePage) templ.Component {
3486 if templ_7745c5c3_Err != nil {3635 if templ_7745c5c3_Err != nil {
3487 return templ_7745c5c3_Err3636 return templ_7745c5c3_Err
3488 }3637 }
3489- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 324, "</div>")3638+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 339, "</div>")
3490 if templ_7745c5c3_Err != nil {3639 if templ_7745c5c3_Err != nil {
3491 return templ_7745c5c3_Err3640 return templ_7745c5c3_Err
3492 }3641 }
3493 if p.Invisible {3642 if p.Invisible {
3494- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 325, "<p class=\"notice\">this diff holds invisible characters (direction controls, zero-width characters). They are shown as <span class=\"inv\">&lt;U+XXXX&gt;</span> markers, never applied.</p>")3643+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 340, "<p class=\"notice\">this diff holds invisible characters (direction controls, zero-width characters). They are shown as <span class=\"inv\">&lt;U+XXXX&gt;</span> markers, never applied.</p>")
3495 if templ_7745c5c3_Err != nil {3644 if templ_7745c5c3_Err != nil {
3496 return templ_7745c5c3_Err3645 return templ_7745c5c3_Err
3497 }3646 }
3498 }3647 }
3499- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 326, " <div id=\"diffs\"")3648+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 341, " <div id=\"diffs\"")
3500 if templ_7745c5c3_Err != nil {3649 if templ_7745c5c3_Err != nil {
3501 return templ_7745c5c3_Err3650 return templ_7745c5c3_Err
3502 }3651 }
3503 if p.Both {3652 if p.Both {
3504- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 327, " data-diff=\"")3653+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 342, " data-diff=\"")
3505 if templ_7745c5c3_Err != nil {3654 if templ_7745c5c3_Err != nil {
3506 return templ_7745c5c3_Err3655 return templ_7745c5c3_Err
3507 }3656 }
3508- var templ_7745c5c3_Var168 string3657+ var templ_7745c5c3_Var177 string
3509- templ_7745c5c3_Var168, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.View)3658+ templ_7745c5c3_Var177, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.View)
3510 if templ_7745c5c3_Err != nil {3659 if templ_7745c5c3_Err != nil {
3511- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 693, Col: 23}3660+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 716, Col: 23}
3512 }3661 }
3513- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var168)3662+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var177)
3514 if templ_7745c5c3_Err != nil {3663 if templ_7745c5c3_Err != nil {
3515 return templ_7745c5c3_Err3664 return templ_7745c5c3_Err
3516 }3665 }
3517- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 328, "\"")3666+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 343, "\"")
3518 if templ_7745c5c3_Err != nil {3667 if templ_7745c5c3_Err != nil {
3519 return templ_7745c5c3_Err3668 return templ_7745c5c3_Err
3520 }3669 }
3521 } else {3670 } else {
3522- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 329, " data-view=\"")3671+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 344, " data-view=\"")
3523 if templ_7745c5c3_Err != nil {3672 if templ_7745c5c3_Err != nil {
3524 return templ_7745c5c3_Err3673 return templ_7745c5c3_Err
3525 }3674 }
3526- var templ_7745c5c3_Var169 string3675+ var templ_7745c5c3_Var178 string
3527- templ_7745c5c3_Var169, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.View)3676+ templ_7745c5c3_Var178, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.View)
3528 if templ_7745c5c3_Err != nil {3677 if templ_7745c5c3_Err != nil {
3529- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 695, Col: 23}3678+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 718, Col: 23}
3530 }3679 }
3531- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var169)3680+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var178)
3532 if templ_7745c5c3_Err != nil {3681 if templ_7745c5c3_Err != nil {
3533 return templ_7745c5c3_Err3682 return templ_7745c5c3_Err
3534 }3683 }
3535- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 330, "\"")3684+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 345, "\"")
3536 if templ_7745c5c3_Err != nil {3685 if templ_7745c5c3_Err != nil {
3537 return templ_7745c5c3_Err3686 return templ_7745c5c3_Err
3538 }3687 }
3539 }3688 }
3540 if p.Both && !p.Pinned {3689 if p.Both && !p.Pinned {
3541- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 331, " hx-live=\"this.dataset.diff = sessionStorage.getItem('diff') || this.dataset.diff\"")3690+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 346, " hx-live=\"this.dataset.diff = sessionStorage.getItem('diff') || this.dataset.diff\"")
3542 if templ_7745c5c3_Err != nil {3691 if templ_7745c5c3_Err != nil {
3543 return templ_7745c5c3_Err3692 return templ_7745c5c3_Err
3544 }3693 }
3545 }3694 }
3546- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 332, ">")3695+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 347, ">")
3547 if templ_7745c5c3_Err != nil {3696 if templ_7745c5c3_Err != nil {
3548 return templ_7745c5c3_Err3697 return templ_7745c5c3_Err
3549 }3698 }
@@ -3553,14 +3702,14 @@ func Compare(l Layout, p ComparePage) templ.Component {
3553 return templ_7745c5c3_Err3702 return templ_7745c5c3_Err
3554 }3703 }
3555 }3704 }
3556- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 333, "</div>")3705+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 348, "</div>")
3557 if templ_7745c5c3_Err != nil {3706 if templ_7745c5c3_Err != nil {
3558 return templ_7745c5c3_Err3707 return templ_7745c5c3_Err
3559 }3708 }
3560 }3709 }
3561 return nil3710 return nil
3562 })3711 })
3563- templ_7745c5c3_Err = Shell(l, compareRail(p)).Render(templ.WithChildren(ctx, templ_7745c5c3_Var150), templ_7745c5c3_Buffer)3712+ templ_7745c5c3_Err = Shell(l, compareRail(p)).Render(templ.WithChildren(ctx, templ_7745c5c3_Var159), templ_7745c5c3_Buffer)
3564 if templ_7745c5c3_Err != nil {3713 if templ_7745c5c3_Err != nil {
3565 return templ_7745c5c3_Err3714 return templ_7745c5c3_Err
3566 }3715 }
@@ -3584,173 +3733,173 @@ func compareRail(p ComparePage) templ.Component {
3584 }()3733 }()
3585 }3734 }
3586 ctx = templ.InitializeContext(ctx)3735 ctx = templ.InitializeContext(ctx)
3587- templ_7745c5c3_Var170 := templ.GetChildren(ctx)3736+ templ_7745c5c3_Var179 := templ.GetChildren(ctx)
3588- if templ_7745c5c3_Var170 == nil {3737+ if templ_7745c5c3_Var179 == nil {
3589- templ_7745c5c3_Var170 = templ.NopComponent3738+ templ_7745c5c3_Var179 = templ.NopComponent
3590 }3739 }
3591 ctx = templ.ClearChildren(ctx)3740 ctx = templ.ClearChildren(ctx)
3592- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 334, "<section aria-labelledby=\"r-ahead\"><h2 id=\"r-ahead\">Commits <span class=\"count\">")3741+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 349, "<section aria-labelledby=\"r-ahead\"><h2 id=\"r-ahead\">Commits <span class=\"count\">")
3593 if templ_7745c5c3_Err != nil {3742 if templ_7745c5c3_Err != nil {
3594 return templ_7745c5c3_Err3743 return templ_7745c5c3_Err
3595 }3744 }
3596- var templ_7745c5c3_Var171 string3745+ var templ_7745c5c3_Var180 string
3597- templ_7745c5c3_Var171, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(len(p.Ahead)))3746+ templ_7745c5c3_Var180, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(len(p.Ahead)))
3598 if templ_7745c5c3_Err != nil {3747 if templ_7745c5c3_Err != nil {
3599- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 711, Col: 67}3748+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 734, Col: 67}
3600 }3749 }
3601- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var171))3750+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var180))
3602 if templ_7745c5c3_Err != nil {3751 if templ_7745c5c3_Err != nil {
3603 return templ_7745c5c3_Err3752 return templ_7745c5c3_Err
3604 }3753 }
3605- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 335, "</span></h2><ul class=\"pcommits\">")3754+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 350, "</span></h2><ul class=\"pcommits\">")
3606 if templ_7745c5c3_Err != nil {3755 if templ_7745c5c3_Err != nil {
3607 return templ_7745c5c3_Err3756 return templ_7745c5c3_Err
3608 }3757 }
3609 for _, c := range p.Ahead {3758 for _, c := range p.Ahead {
3610- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 336, "<li><a href=\"")3759+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 351, "<li><a href=\"")
3611 if templ_7745c5c3_Err != nil {3760 if templ_7745c5c3_Err != nil {
3612 return templ_7745c5c3_Err3761 return templ_7745c5c3_Err
3613 }3762 }
3614- var templ_7745c5c3_Var172 templ.SafeURL3763+ var templ_7745c5c3_Var181 templ.SafeURL
3615- templ_7745c5c3_Var172, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(c.CHref))3764+ templ_7745c5c3_Var181, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(c.CHref))
3616 if templ_7745c5c3_Err != nil {3765 if templ_7745c5c3_Err != nil {
3617- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 715, Col: 37}3766+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 738, Col: 37}
3618 }3767 }
3619- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var172))3768+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var181))
3620 if templ_7745c5c3_Err != nil {3769 if templ_7745c5c3_Err != nil {
3621 return templ_7745c5c3_Err3770 return templ_7745c5c3_Err
3622 }3771 }
3623- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 337, "\">")3772+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 352, "\">")
3624 if templ_7745c5c3_Err != nil {3773 if templ_7745c5c3_Err != nil {
3625 return templ_7745c5c3_Err3774 return templ_7745c5c3_Err
3626 }3775 }
3627- var templ_7745c5c3_Var173 string3776+ var templ_7745c5c3_Var182 string
3628- templ_7745c5c3_Var173, templ_7745c5c3_Err = templ.JoinStringErrs(c.Short)3777+ templ_7745c5c3_Var182, templ_7745c5c3_Err = templ.JoinStringErrs(c.Short)
3629 if templ_7745c5c3_Err != nil {3778 if templ_7745c5c3_Err != nil {
3630- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 715, Col: 49}3779+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 738, Col: 49}
3631 }3780 }
3632- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var173))3781+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var182))
3633 if templ_7745c5c3_Err != nil {3782 if templ_7745c5c3_Err != nil {
3634 return templ_7745c5c3_Err3783 return templ_7745c5c3_Err
3635 }3784 }
3636- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 338, "</a> <span class=\"s\">")3785+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 353, "</a> <span class=\"s\">")
3637 if templ_7745c5c3_Err != nil {3786 if templ_7745c5c3_Err != nil {
3638 return templ_7745c5c3_Err3787 return templ_7745c5c3_Err
3639 }3788 }
3640- var templ_7745c5c3_Var174 string3789+ var templ_7745c5c3_Var183 string
3641- templ_7745c5c3_Var174, templ_7745c5c3_Err = templ.JoinStringErrs(c.Subject)3790+ templ_7745c5c3_Var183, templ_7745c5c3_Err = templ.JoinStringErrs(c.Subject)
3642 if templ_7745c5c3_Err != nil {3791 if templ_7745c5c3_Err != nil {
3643- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 716, Col: 32}3792+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 739, Col: 32}
3644 }3793 }
3645- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var174))3794+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var183))
3646 if templ_7745c5c3_Err != nil {3795 if templ_7745c5c3_Err != nil {
3647 return templ_7745c5c3_Err3796 return templ_7745c5c3_Err
3648 }3797 }
3649- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 339, "</span> <span class=\"mute\">")3798+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 354, "</span> <span class=\"mute\">")
3650 if templ_7745c5c3_Err != nil {3799 if templ_7745c5c3_Err != nil {
3651 return templ_7745c5c3_Err3800 return templ_7745c5c3_Err
3652 }3801 }
3653- var templ_7745c5c3_Var175 string3802+ var templ_7745c5c3_Var184 string
3654- templ_7745c5c3_Var175, templ_7745c5c3_Err = templ.JoinStringErrs(c.Author)3803+ templ_7745c5c3_Var184, templ_7745c5c3_Err = templ.JoinStringErrs(c.Author)
3655 if templ_7745c5c3_Err != nil {3804 if templ_7745c5c3_Err != nil {
3656- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 718, Col: 16}3805+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 741, Col: 16}
3657 }3806 }
3658- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var175))3807+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var184))
3659 if templ_7745c5c3_Err != nil {3808 if templ_7745c5c3_Err != nil {
3660 return templ_7745c5c3_Err3809 return templ_7745c5c3_Err
3661 }3810 }
3662- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 340, " ")3811+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 355, " ")
3663 if templ_7745c5c3_Err != nil {3812 if templ_7745c5c3_Err != nil {
3664 return templ_7745c5c3_Err3813 return templ_7745c5c3_Err
3665 }3814 }
3666 if c.WhenAt != "" {3815 if c.WhenAt != "" {
3667- var templ_7745c5c3_Var176 string3816+ var templ_7745c5c3_Var185 string
3668- templ_7745c5c3_Var176, templ_7745c5c3_Err = templ.JoinStringErrs(" · ")3817+ templ_7745c5c3_Var185, templ_7745c5c3_Err = templ.JoinStringErrs(" · ")
3669 if templ_7745c5c3_Err != nil {3818 if templ_7745c5c3_Err != nil {
3670- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 720, Col: 15}3819+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 743, Col: 15}
3671 }3820 }
3672- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var176))3821+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var185))
3673 if templ_7745c5c3_Err != nil {3822 if templ_7745c5c3_Err != nil {
3674 return templ_7745c5c3_Err3823 return templ_7745c5c3_Err
3675 }3824 }
3676- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 341, "<time datetime=\"")3825+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 356, "<time datetime=\"")
3677 if templ_7745c5c3_Err != nil {3826 if templ_7745c5c3_Err != nil {
3678 return templ_7745c5c3_Err3827 return templ_7745c5c3_Err
3679 }3828 }
3680- var templ_7745c5c3_Var177 string3829+ var templ_7745c5c3_Var186 string
3681- templ_7745c5c3_Var177, templ_7745c5c3_Err = templ.ResolveAttributeValue(c.WhenAt)3830+ templ_7745c5c3_Var186, templ_7745c5c3_Err = templ.ResolveAttributeValue(c.WhenAt)
3682 if templ_7745c5c3_Err != nil {3831 if templ_7745c5c3_Err != nil {
3683- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 720, Col: 42}3832+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 743, Col: 42}
3684 }3833 }
3685- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var177)3834+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var186)
3686 if templ_7745c5c3_Err != nil {3835 if templ_7745c5c3_Err != nil {
3687 return templ_7745c5c3_Err3836 return templ_7745c5c3_Err
3688 }3837 }
3689- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 342, "\">")3838+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 357, "\">")
3690 if templ_7745c5c3_Err != nil {3839 if templ_7745c5c3_Err != nil {
3691 return templ_7745c5c3_Err3840 return templ_7745c5c3_Err
3692 }3841 }
3693- var templ_7745c5c3_Var178 string3842+ var templ_7745c5c3_Var187 string
3694- templ_7745c5c3_Var178, templ_7745c5c3_Err = templ.JoinStringErrs(c.When)3843+ templ_7745c5c3_Var187, templ_7745c5c3_Err = templ.JoinStringErrs(c.When)
3695 if templ_7745c5c3_Err != nil {3844 if templ_7745c5c3_Err != nil {
3696- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 720, Col: 53}3845+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 743, Col: 53}
3697 }3846 }
3698- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var178))3847+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var187))
3699 if templ_7745c5c3_Err != nil {3848 if templ_7745c5c3_Err != nil {
3700 return templ_7745c5c3_Err3849 return templ_7745c5c3_Err
3701 }3850 }
3702- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 343, "</time>")3851+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 358, "</time>")
3703 if templ_7745c5c3_Err != nil {3852 if templ_7745c5c3_Err != nil {
3704 return templ_7745c5c3_Err3853 return templ_7745c5c3_Err
3705 }3854 }
3706 }3855 }
3707- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 344, "</span></li>")3856+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 359, "</span></li>")
3708 if templ_7745c5c3_Err != nil {3857 if templ_7745c5c3_Err != nil {
3709 return templ_7745c5c3_Err3858 return templ_7745c5c3_Err
3710 }3859 }
3711 }3860 }
3712- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 345, "</ul>")3861+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 360, "</ul>")
3713 if templ_7745c5c3_Err != nil {3862 if templ_7745c5c3_Err != nil {
3714 return templ_7745c5c3_Err3863 return templ_7745c5c3_Err
3715 }3864 }
3716 if len(p.Ahead) == 0 {3865 if len(p.Ahead) == 0 {
3717- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 346, "<p class=\"dim\">no commit ahead of ")3866+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 361, "<p class=\"dim\">no commit ahead of ")
3718 if templ_7745c5c3_Err != nil {3867 if templ_7745c5c3_Err != nil {
3719 return templ_7745c5c3_Err3868 return templ_7745c5c3_Err
3720 }3869 }
3721- var templ_7745c5c3_Var179 string3870+ var templ_7745c5c3_Var188 string
3722- templ_7745c5c3_Var179, templ_7745c5c3_Err = templ.JoinStringErrs(p.Target)3871+ templ_7745c5c3_Var188, templ_7745c5c3_Err = templ.JoinStringErrs(p.Target)
3723 if templ_7745c5c3_Err != nil {3872 if templ_7745c5c3_Err != nil {
3724- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 727, Col: 47}3873+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 750, Col: 47}
3725 }3874 }
3726- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var179))3875+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var188))
3727 if templ_7745c5c3_Err != nil {3876 if templ_7745c5c3_Err != nil {
3728 return templ_7745c5c3_Err3877 return templ_7745c5c3_Err
3729 }3878 }
3730- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 347, ".</p>")3879+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 362, ".</p>")
3731 if templ_7745c5c3_Err != nil {3880 if templ_7745c5c3_Err != nil {
3732 return templ_7745c5c3_Err3881 return templ_7745c5c3_Err
3733 }3882 }
3734 }3883 }
3735- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 348, "</section>")3884+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 363, "</section>")
3736 if templ_7745c5c3_Err != nil {3885 if templ_7745c5c3_Err != nil {
3737 return templ_7745c5c3_Err3886 return templ_7745c5c3_Err
3738 }3887 }
3739 if p.HasDiff {3888 if p.HasDiff {
3740- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 349, "<section aria-labelledby=\"r-files\"><h2 id=\"r-files\">Files <span class=\"count\">")3889+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 364, "<section aria-labelledby=\"r-files\"><h2 id=\"r-files\">Files <span class=\"count\">")
3741 if templ_7745c5c3_Err != nil {3890 if templ_7745c5c3_Err != nil {
3742 return templ_7745c5c3_Err3891 return templ_7745c5c3_Err
3743 }3892 }
3744- var templ_7745c5c3_Var180 string3893+ var templ_7745c5c3_Var189 string
3745- templ_7745c5c3_Var180, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(len(p.Files)))3894+ templ_7745c5c3_Var189, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(len(p.Files)))
3746 if templ_7745c5c3_Err != nil {3895 if templ_7745c5c3_Err != nil {
3747- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 732, Col: 66}3896+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 755, Col: 66}
3748 }3897 }
3749- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var180))3898+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var189))
3750 if templ_7745c5c3_Err != nil {3899 if templ_7745c5c3_Err != nil {
3751 return templ_7745c5c3_Err3900 return templ_7745c5c3_Err
3752 }3901 }
3753- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 350, "</span></h2>")3902+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 365, "</span></h2>")
3754 if templ_7745c5c3_Err != nil {3903 if templ_7745c5c3_Err != nil {
3755 return templ_7745c5c3_Err3904 return templ_7745c5c3_Err
3756 }3905 }
@@ -3758,12 +3907,12 @@ func compareRail(p ComparePage) templ.Component {
3758 if templ_7745c5c3_Err != nil {3907 if templ_7745c5c3_Err != nil {
3759 return templ_7745c5c3_Err3908 return templ_7745c5c3_Err
3760 }3909 }
3761- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 351, "</section>")3910+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 366, "</section>")
3762 if templ_7745c5c3_Err != nil {3911 if templ_7745c5c3_Err != nil {
3763 return templ_7745c5c3_Err3912 return templ_7745c5c3_Err
3764 }3913 }
3765 }3914 }
3766- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 352, "<section aria-labelledby=\"r-cli\"><h2 id=\"r-cli\">From a terminal</h2>")3915+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 367, "<section aria-labelledby=\"r-cli\"><h2 id=\"r-cli\">From a terminal</h2>")
3767 if templ_7745c5c3_Err != nil {3916 if templ_7745c5c3_Err != nil {
3768 return templ_7745c5c3_Err3917 return templ_7745c5c3_Err
3769 }3918 }
@@ -3771,7 +3920,7 @@ func compareRail(p ComparePage) templ.Component {
3771 if templ_7745c5c3_Err != nil {3920 if templ_7745c5c3_Err != nil {
3772 return templ_7745c5c3_Err3921 return templ_7745c5c3_Err
3773 }3922 }
3774- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 353, "</section>")3923+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 368, "</section>")
3775 if templ_7745c5c3_Err != nil {3924 if templ_7745c5c3_Err != nil {
3776 return templ_7745c5c3_Err3925 return templ_7745c5c3_Err
3777 }3926 }
M internal/adapters/web/mr_test.go +83 -0
@@ -4,6 +4,9 @@ package web
44
55 import (
66 "context"
7+ "net/http"
8+ "net/http/httptest"
9+ "strings"
710 "testing"
811 "time"
912
@@ -195,3 +198,83 @@ func TestMRReadPresentationCommitCount(t *testing.T) {
195198 })
196199 }
197200 }
201+
202+func TestMergeBoxAutoMerge(t *testing.T) {
203+ t.Parallel()
204+ mg := mergeabilityView(domain.Mergeability{State: domain.MergeabilityUpToDate}, "main")
205+ mk := func(allow bool, runs ports.RunService) *MergeBox {
206+ v := repoWithModes(domain.MergeModes()...)
207+ v.Settings.AllowAutoMerge = allow
208+ return (&Server{cfg: Config{Runs: runs}}).mergeBox(&repoData{repo: v}, 1, "feat", "abc", false, mg)
209+ }
210+ assert.False(t, mk(false, mocks.NewRunService(t)).CanAutoMerge)
211+ assert.False(t, mk(true, nil).CanAutoMerge, "no CI, nothing to wait for")
212+ on := mk(true, mocks.NewRunService(t))
213+ assert.True(t, on.CanAutoMerge)
214+
215+ page := MRPage{Target: "main", Box: on}
216+ html := renderToString(t, mergeMenu(page))
217+ assert.Contains(t, html, "Merge when ready")
218+ assert.Contains(t, html, `formaction="`+on.AutoAction+`"`)
219+ assert.NotContains(t, html, "Cancel auto-merge")
220+ page.Box = mk(false, mocks.NewRunService(t))
221+ assert.NotContains(t, renderToString(t, mergeMenu(page)), "Merge when ready")
222+
223+ on.AutoMerge = &AutoMergeView{Mode: "squash", EnabledBy: "owner", HeadShort: "abc"}
224+ html = renderToString(t, mergeMenu(MRPage{Target: "main", Box: on}))
225+ assert.Contains(t, html, "Auto-merge: squash when ready, enabled by owner")
226+ assert.Contains(t, html, `action="`+on.CancelAutoAction+`"`)
227+ assert.Contains(t, html, "Cancel auto-merge")
228+}
229+
230+func autoMergeRequest(path, body string) *http.Request {
231+ r := httptest.NewRequest(http.MethodPost, path, strings.NewReader(body))
232+ r.Header.Set("Content-Type", "application/x-www-form-urlencoded")
233+ r.SetPathValue("repo", "demo")
234+ r.SetPathValue("n", "3")
235+ return r
236+}
237+
238+func TestAutoMergeHandlers(t *testing.T) {
239+ t.Parallel()
240+ name, err := domain.ParseRepoName("demo")
241+ require.NoError(t, err)
242+ ctx := context.Background()
243+
244+ svc := mocks.NewMergeRequestService(t)
245+ svc.EXPECT().EnableAutoMerge(mock.Anything, mock.Anything, name, int64(3), ports.EnableAutoMergeParams{Mode: domain.MergeModeSquash}).
246+ Return(domain.MergeRequest{}, nil).Once()
247+ svc.EXPECT().CancelAutoMerge(mock.Anything, mock.Anything, name, int64(3)).Return(domain.MergeRequest{}, nil).Once()
248+ s := &Server{cfg: Config{MergeRequests: svc}}
249+ to, _, err := s.mrAutoMerge(ctx, autoMergeRequest("/demo/merge-requests/3/auto-merge", "mode=squash"))
250+ require.NoError(t, err)
251+ assert.Equal(t, mrHref("demo", 3), to)
252+ to, _, err = s.mrCancelAutoMerge(ctx, autoMergeRequest("/demo/merge-requests/3/auto-merge/cancel", ""))
253+ require.NoError(t, err)
254+ assert.Equal(t, mrHref("demo", 3), to)
255+
256+ // A bad mode is refused before the service.
257+ _, _, err = s.mrAutoMerge(ctx, autoMergeRequest("/x", "mode=rebase"))
258+ var re *rerender
259+ require.ErrorAs(t, err, &re)
260+ assert.Equal(t, http.StatusBadRequest, re.status)
261+
262+ // A refusal of the use case is shown in the box, like a refused merge.
263+ svc2 := mocks.NewMergeRequestService(t)
264+ svc2.EXPECT().EnableAutoMerge(mock.Anything, mock.Anything, name, int64(3), mock.Anything).
265+ Return(domain.MergeRequest{}, domain.ErrPreconditionFailed).Once()
266+ svc2.EXPECT().CancelAutoMerge(mock.Anything, mock.Anything, name, int64(3)).
267+ Return(domain.MergeRequest{}, domain.ErrNotFound).Once()
268+ s2 := &Server{cfg: Config{MergeRequests: svc2}}
269+ _, _, err = s2.mrAutoMerge(ctx, autoMergeRequest("/x", "mode=squash"))
270+ require.ErrorAs(t, err, &re)
271+ assert.Equal(t, http.StatusConflict, re.status)
272+ _, _, err = s2.mrCancelAutoMerge(ctx, autoMergeRequest("/x", ""))
273+ require.ErrorIs(t, err, domain.ErrNotFound)
274+}
275+
276+func TestAutoMergeLiveEvents(t *testing.T) {
277+ t.Parallel()
278+ assert.True(t, liveEvent(watchOf(domain.MergeRequestAutoMergeEnabled{})))
279+ assert.True(t, liveEvent(watchOf(domain.MergeRequestAutoMergeCancelled{})))
280+}
@@ -4,6 +4,9 @@ package web
4 4
5 import (5 import (
6 "context"6 "context"
7+ "net/http"
8+ "net/http/httptest"
9+ "strings"
7 "testing"10 "testing"
8 "time"11 "time"
9 12
@@ -195,3 +198,83 @@ func TestMRReadPresentationCommitCount(t *testing.T) {
195 })198 })
196 }199 }
197 }200 }
201+
202+func TestMergeBoxAutoMerge(t *testing.T) {
203+ t.Parallel()
204+ mg := mergeabilityView(domain.Mergeability{State: domain.MergeabilityUpToDate}, "main")
205+ mk := func(allow bool, runs ports.RunService) *MergeBox {
206+ v := repoWithModes(domain.MergeModes()...)
207+ v.Settings.AllowAutoMerge = allow
208+ return (&Server{cfg: Config{Runs: runs}}).mergeBox(&repoData{repo: v}, 1, "feat", "abc", false, mg)
209+ }
210+ assert.False(t, mk(false, mocks.NewRunService(t)).CanAutoMerge)
211+ assert.False(t, mk(true, nil).CanAutoMerge, "no CI, nothing to wait for")
212+ on := mk(true, mocks.NewRunService(t))
213+ assert.True(t, on.CanAutoMerge)
214+
215+ page := MRPage{Target: "main", Box: on}
216+ html := renderToString(t, mergeMenu(page))
217+ assert.Contains(t, html, "Merge when ready")
218+ assert.Contains(t, html, `formaction="`+on.AutoAction+`"`)
219+ assert.NotContains(t, html, "Cancel auto-merge")
220+ page.Box = mk(false, mocks.NewRunService(t))
221+ assert.NotContains(t, renderToString(t, mergeMenu(page)), "Merge when ready")
222+
223+ on.AutoMerge = &AutoMergeView{Mode: "squash", EnabledBy: "owner", HeadShort: "abc"}
224+ html = renderToString(t, mergeMenu(MRPage{Target: "main", Box: on}))
225+ assert.Contains(t, html, "Auto-merge: squash when ready, enabled by owner")
226+ assert.Contains(t, html, `action="`+on.CancelAutoAction+`"`)
227+ assert.Contains(t, html, "Cancel auto-merge")
228+}
229+
230+func autoMergeRequest(path, body string) *http.Request {
231+ r := httptest.NewRequest(http.MethodPost, path, strings.NewReader(body))
232+ r.Header.Set("Content-Type", "application/x-www-form-urlencoded")
233+ r.SetPathValue("repo", "demo")
234+ r.SetPathValue("n", "3")
235+ return r
236+}
237+
238+func TestAutoMergeHandlers(t *testing.T) {
239+ t.Parallel()
240+ name, err := domain.ParseRepoName("demo")
241+ require.NoError(t, err)
242+ ctx := context.Background()
243+
244+ svc := mocks.NewMergeRequestService(t)
245+ svc.EXPECT().EnableAutoMerge(mock.Anything, mock.Anything, name, int64(3), ports.EnableAutoMergeParams{Mode: domain.MergeModeSquash}).
246+ Return(domain.MergeRequest{}, nil).Once()
247+ svc.EXPECT().CancelAutoMerge(mock.Anything, mock.Anything, name, int64(3)).Return(domain.MergeRequest{}, nil).Once()
248+ s := &Server{cfg: Config{MergeRequests: svc}}
249+ to, _, err := s.mrAutoMerge(ctx, autoMergeRequest("/demo/merge-requests/3/auto-merge", "mode=squash"))
250+ require.NoError(t, err)
251+ assert.Equal(t, mrHref("demo", 3), to)
252+ to, _, err = s.mrCancelAutoMerge(ctx, autoMergeRequest("/demo/merge-requests/3/auto-merge/cancel", ""))
253+ require.NoError(t, err)
254+ assert.Equal(t, mrHref("demo", 3), to)
255+
256+ // A bad mode is refused before the service.
257+ _, _, err = s.mrAutoMerge(ctx, autoMergeRequest("/x", "mode=rebase"))
258+ var re *rerender
259+ require.ErrorAs(t, err, &re)
260+ assert.Equal(t, http.StatusBadRequest, re.status)
261+
262+ // A refusal of the use case is shown in the box, like a refused merge.
263+ svc2 := mocks.NewMergeRequestService(t)
264+ svc2.EXPECT().EnableAutoMerge(mock.Anything, mock.Anything, name, int64(3), mock.Anything).
265+ Return(domain.MergeRequest{}, domain.ErrPreconditionFailed).Once()
266+ svc2.EXPECT().CancelAutoMerge(mock.Anything, mock.Anything, name, int64(3)).
267+ Return(domain.MergeRequest{}, domain.ErrNotFound).Once()
268+ s2 := &Server{cfg: Config{MergeRequests: svc2}}
269+ _, _, err = s2.mrAutoMerge(ctx, autoMergeRequest("/x", "mode=squash"))
270+ require.ErrorAs(t, err, &re)
271+ assert.Equal(t, http.StatusConflict, re.status)
272+ _, _, err = s2.mrCancelAutoMerge(ctx, autoMergeRequest("/x", ""))
273+ require.ErrorIs(t, err, domain.ErrNotFound)
274+}
275+
276+func TestAutoMergeLiveEvents(t *testing.T) {
277+ t.Parallel()
278+ assert.True(t, liveEvent(watchOf(domain.MergeRequestAutoMergeEnabled{})))
279+ assert.True(t, liveEvent(watchOf(domain.MergeRequestAutoMergeCancelled{})))
280+}
M internal/adapters/web/web.go +2 -0
@@ -231,6 +231,8 @@ func (s *Server) routes() *http.ServeMux {
231231 mux.HandleFunc("POST /{repo}/merge-requests/{n}/comments/{id}/edit", s.mrAction(s.mrEditComment))
232232 mux.HandleFunc("POST /{repo}/merge-requests/{n}/comments/{id}/delete", s.mrAction(s.mrDeleteComment))
233233 mux.HandleFunc("POST /{repo}/merge-requests/{n}/merge", s.mrAction(s.mrMerge))
234+ mux.HandleFunc("POST /{repo}/merge-requests/{n}/auto-merge", s.mrAction(s.mrAutoMerge))
235+ mux.HandleFunc("POST /{repo}/merge-requests/{n}/auto-merge/cancel", s.mrAction(s.mrCancelAutoMerge))
234236 mux.HandleFunc("POST /{repo}/merge-requests/{n}/close", s.mrAction(s.mrClose))
235237 mux.HandleFunc("POST /{repo}/merge-requests/{n}/ready", s.mrAction(s.mrReady))
236238 mux.HandleFunc("POST /{repo}/merge-requests/{n}/read", s.mrAction(s.mrRead))
@@ -231,6 +231,8 @@ func (s *Server) routes() *http.ServeMux {
231 mux.HandleFunc("POST /{repo}/merge-requests/{n}/comments/{id}/edit", s.mrAction(s.mrEditComment))231 mux.HandleFunc("POST /{repo}/merge-requests/{n}/comments/{id}/edit", s.mrAction(s.mrEditComment))
232 mux.HandleFunc("POST /{repo}/merge-requests/{n}/comments/{id}/delete", s.mrAction(s.mrDeleteComment))232 mux.HandleFunc("POST /{repo}/merge-requests/{n}/comments/{id}/delete", s.mrAction(s.mrDeleteComment))
233 mux.HandleFunc("POST /{repo}/merge-requests/{n}/merge", s.mrAction(s.mrMerge))233 mux.HandleFunc("POST /{repo}/merge-requests/{n}/merge", s.mrAction(s.mrMerge))
234+ mux.HandleFunc("POST /{repo}/merge-requests/{n}/auto-merge", s.mrAction(s.mrAutoMerge))
235+ mux.HandleFunc("POST /{repo}/merge-requests/{n}/auto-merge/cancel", s.mrAction(s.mrCancelAutoMerge))
234 mux.HandleFunc("POST /{repo}/merge-requests/{n}/close", s.mrAction(s.mrClose))236 mux.HandleFunc("POST /{repo}/merge-requests/{n}/close", s.mrAction(s.mrClose))
235 mux.HandleFunc("POST /{repo}/merge-requests/{n}/ready", s.mrAction(s.mrReady))237 mux.HandleFunc("POST /{repo}/merge-requests/{n}/ready", s.mrAction(s.mrReady))
236 mux.HandleFunc("POST /{repo}/merge-requests/{n}/read", s.mrAction(s.mrRead))238 mux.HandleFunc("POST /{repo}/merge-requests/{n}/read", s.mrAction(s.mrRead))

Keyboard shortcuts

Single-key shortcuts are on. ctrl k and esc work whatever this says.

ctrl k :
go to a section, branch, tag, file or repository
?
this list
j k
move the row cursor down / up
enter
open the row under the cursor; on Files, a directory opens or closes in place
↑ ↓ ← → home end
in the file tree (focus on a row): previous / next row, close / open a directory or go to its parent / first entry, first / last row. They never open a file
l h
on Files: open a directory or a file / close a directory or go up to its parent, then to the parent page. Elsewhere: into the side panel (on a merge request, its files) / back to the content; there j k move between its controls
g g G
first / last row
/
filter the list; on Files, find a file anywhere in the repository (esc clears, enter opens the best match)
b
switch branch or tag
g s g f g c g b g m g i g r g a
tabs: summary, files, commits, branches & tags, merge requests, issues, releases, actions (when available)
g h
home
w
wide mode: use the whole width of the screen, or not (remembered)
y
copy a permalink pinned to the commit
d u x
diff: split / unified / collapse or expand all
e E
diff: the whole file in view / every file, with the lines the hunks hide
n
merge request: next note in the diff
esc
close a dialog, leave a field

Branches 2

Tags 43

↑↓ moveenter openesc close