detached eba8ed7

fix(scopes): keep the owner rights of full tokens with mr:force-merge, refresh the owner's merge check controls live

commit
eba8ed78a9322e7b454e9d156553ffe57cc7d139
author
brice · · 2026-10-21 13:39 UTC
committer
brice · · 2026-10-21 13:44 UTC
parent
7348bb2
signature
GPG VerifiedCD88F9E564E0102646FB6077A1A07C7C7C3E349D · arch-gpg Verified for the committer email
checks
0/4
8 files · +576 -377
M internal/adapters/kvstore/issues_test.go +55 -8
@@ -271,7 +271,7 @@ func TestRepoSettingsKeepTheIssuesMode(t *testing.T) {
271271
272272 // TestSchema4UpgradesTheTokensWithAllScopes: the tokens that held every
273273 // original scope keep their owner rights, gaining mr:review and issue:write
274-// (each only if missing); no other token changes.
274+// (each only if missing), then mr:force-merge in schema 5; no other token changes.
275275 func TestSchema4UpgradesTheTokensWithAllScopes(t *testing.T) {
276276 ctx := context.Background()
277277 dir := t.TempDir()
@@ -309,17 +309,20 @@ func TestSchema4UpgradesTheTokensWithAllScopes(t *testing.T) {
309309 full := get("full")
310310 assert.Contains(t, full.Scopes, domain.ScopeIssueWrite)
311311 assert.Contains(t, full.Scopes, domain.ScopeMRReview)
312- assert.Len(t, full.Scopes, 11)
312+ assert.Len(t, full.Scopes, 12)
313313 full10 := get("full10")
314- assert.Len(t, full10.Scopes, 11)
314+ assert.Len(t, full10.Scopes, 12)
315315 assert.Equal(t, 1, countScope(full10.Scopes, domain.ScopeMRReview))
316316 assert.Contains(t, full10.Scopes, domain.ScopeIssueWrite)
317- assert.False(t, domain.TokenPrincipal(full10).HasOwnerRights(), "historical migration does not grant mr:force-merge")
317+ assert.True(t, domain.TokenPrincipal(full10).HasOwnerRights())
318318 assert.Len(t, get("reposmr").Scopes, 10)
319319 assert.NotContains(t, get("reposmr").Scopes, domain.ScopeIssueWrite)
320- assert.False(t, domain.TokenPrincipal(full).HasOwnerRights(), "historical migration does not grant mr:force-merge")
321- assert.False(t, domain.TokenPrincipal(get("otherfull")).HasOwnerRights(), "historical migration does not grant mr:force-merge")
320+ assert.True(t, domain.TokenPrincipal(full).HasOwnerRights())
321+ assert.True(t, domain.TokenPrincipal(get("otherfull")).HasOwnerRights())
322322
323+ for _, id := range []string{"missing", "reposmr", "repos", "prefix", "small"} {
324+ assert.NotContains(t, get(id).Scopes, domain.ScopeMRForceMerge)
325+ }
323326 assert.NotContains(t, get("missing").Scopes, domain.ScopeIssueWrite)
324327 assert.NotContains(t, get("missing").Scopes, domain.ScopeMRReview)
325328 assert.NotContains(t, get("repos").Scopes, domain.ScopeMRReview)
@@ -335,7 +338,7 @@ func TestSchema4UpgradesTheTokensWithAllScopes(t *testing.T) {
335338 assert.Equal(t, "full", full.ID)
336339
337340 require.NoError(t, s.Close(ctx))
338- assert.Equal(t, uint32(4), readSchema(t, dir))
341+ assert.Equal(t, uint32(5), readSchema(t, dir))
339342
340343 // A second open changes nothing.
341344 s2, err := kvstore.Open(ctx, dir)
@@ -355,7 +358,7 @@ func TestSchemaNewerThanThisBuildStopsIssuesData(t *testing.T) {
355358 putRaw(t, dir, "meta/schema", mustProto(t, &storagepb.SchemaVersion{Version: kvstore.SchemaVersion + 1}))
356359 _, err := kvstore.Open(ctx, dir)
357360 require.ErrorIs(t, err, kvstore.ErrSchemaTooNew)
358- assert.Equal(t, uint32(4), uint32(kvstore.SchemaVersion))
361+ assert.Equal(t, uint32(5), uint32(kvstore.SchemaVersion))
359362 }
360363
361364 // A reopen racing the delete of the repository either lands before the delete
@@ -561,3 +564,47 @@ func countScope(scopes []domain.Scope, want domain.Scope) int {
561564 }
562565 return n
563566 }
567+
568+func TestSchema5UpgradesOwnerEquivalentTokens(t *testing.T) {
569+ ctx := context.Background()
570+ dir := t.TempDir()
571+ putRaw(t, dir, "meta/schema", mustProto(t, &storagepb.SchemaVersion{Version: 4}))
572+ var previous []string
573+ for _, sc := range domain.AllScopes() {
574+ if sc != domain.ScopeMRForceMerge {
575+ previous = append(previous, sc.String())
576+ }
577+ }
578+ tokens := map[string]*storagepb.Token{
579+ "owner": {Id: "owner", Scopes: previous},
580+ "repos": {Id: "repos", Scopes: previous, Repos: []string{"proj"}},
581+ "branch": {Id: "branch", Scopes: previous, BranchPrefixes: []string{"agent/"}},
582+ "partial": {Id: "partial", Scopes: previous[:10]},
583+ }
584+ for id, tok := range tokens {
585+ tok.Hash = make([]byte, 32)
586+ putRaw(t, dir, "token/"+id, mustProto(t, tok))
587+ }
588+ for range 2 {
589+ s, err := kvstore.Open(ctx, dir)
590+ require.NoError(t, err)
591+ for id, original := range tokens {
592+ tok, err := s.Tokens().Get(ctx, id)
593+ require.NoError(t, err)
594+ if id == "owner" {
595+ assert.True(t, domain.TokenPrincipal(tok).HasOwnerRights())
596+ assert.Equal(t, 1, countScope(tok.Scopes, domain.ScopeMRForceMerge))
597+ assert.Len(t, tok.Scopes, 12)
598+ } else {
599+ assert.NotContains(t, tok.Scopes, domain.ScopeMRForceMerge)
600+ var got []string
601+ for _, sc := range tok.Scopes {
602+ got = append(got, sc.String())
603+ }
604+ assert.Equal(t, original.Scopes, got)
605+ }
606+ }
607+ require.NoError(t, s.Close(ctx))
608+ assert.Equal(t, uint32(5), readSchema(t, dir))
609+ }
610+}
@@ -271,7 +271,7 @@ func TestRepoSettingsKeepTheIssuesMode(t *testing.T) {
271 271
272 // TestSchema4UpgradesTheTokensWithAllScopes: the tokens that held every272 // TestSchema4UpgradesTheTokensWithAllScopes: the tokens that held every
273 // original scope keep their owner rights, gaining mr:review and issue:write273 // original scope keep their owner rights, gaining mr:review and issue:write
274-// (each only if missing); no other token changes.274+// (each only if missing), then mr:force-merge in schema 5; no other token changes.
275 func TestSchema4UpgradesTheTokensWithAllScopes(t *testing.T) {275 func TestSchema4UpgradesTheTokensWithAllScopes(t *testing.T) {
276 ctx := context.Background()276 ctx := context.Background()
277 dir := t.TempDir()277 dir := t.TempDir()
@@ -309,17 +309,20 @@ func TestSchema4UpgradesTheTokensWithAllScopes(t *testing.T) {
309 full := get("full")309 full := get("full")
310 assert.Contains(t, full.Scopes, domain.ScopeIssueWrite)310 assert.Contains(t, full.Scopes, domain.ScopeIssueWrite)
311 assert.Contains(t, full.Scopes, domain.ScopeMRReview)311 assert.Contains(t, full.Scopes, domain.ScopeMRReview)
312- assert.Len(t, full.Scopes, 11)312+ assert.Len(t, full.Scopes, 12)
313 full10 := get("full10")313 full10 := get("full10")
314- assert.Len(t, full10.Scopes, 11)314+ assert.Len(t, full10.Scopes, 12)
315 assert.Equal(t, 1, countScope(full10.Scopes, domain.ScopeMRReview))315 assert.Equal(t, 1, countScope(full10.Scopes, domain.ScopeMRReview))
316 assert.Contains(t, full10.Scopes, domain.ScopeIssueWrite)316 assert.Contains(t, full10.Scopes, domain.ScopeIssueWrite)
317- assert.False(t, domain.TokenPrincipal(full10).HasOwnerRights(), "historical migration does not grant mr:force-merge")317+ assert.True(t, domain.TokenPrincipal(full10).HasOwnerRights())
318 assert.Len(t, get("reposmr").Scopes, 10)318 assert.Len(t, get("reposmr").Scopes, 10)
319 assert.NotContains(t, get("reposmr").Scopes, domain.ScopeIssueWrite)319 assert.NotContains(t, get("reposmr").Scopes, domain.ScopeIssueWrite)
320- assert.False(t, domain.TokenPrincipal(full).HasOwnerRights(), "historical migration does not grant mr:force-merge")320+ assert.True(t, domain.TokenPrincipal(full).HasOwnerRights())
321- assert.False(t, domain.TokenPrincipal(get("otherfull")).HasOwnerRights(), "historical migration does not grant mr:force-merge")321+ assert.True(t, domain.TokenPrincipal(get("otherfull")).HasOwnerRights())
322 322
323+ for _, id := range []string{"missing", "reposmr", "repos", "prefix", "small"} {
324+ assert.NotContains(t, get(id).Scopes, domain.ScopeMRForceMerge)
325+ }
323 assert.NotContains(t, get("missing").Scopes, domain.ScopeIssueWrite)326 assert.NotContains(t, get("missing").Scopes, domain.ScopeIssueWrite)
324 assert.NotContains(t, get("missing").Scopes, domain.ScopeMRReview)327 assert.NotContains(t, get("missing").Scopes, domain.ScopeMRReview)
325 assert.NotContains(t, get("repos").Scopes, domain.ScopeMRReview)328 assert.NotContains(t, get("repos").Scopes, domain.ScopeMRReview)
@@ -335,7 +338,7 @@ func TestSchema4UpgradesTheTokensWithAllScopes(t *testing.T) {
335 assert.Equal(t, "full", full.ID)338 assert.Equal(t, "full", full.ID)
336 339
337 require.NoError(t, s.Close(ctx))340 require.NoError(t, s.Close(ctx))
338- assert.Equal(t, uint32(4), readSchema(t, dir))341+ assert.Equal(t, uint32(5), readSchema(t, dir))
339 342
340 // A second open changes nothing.343 // A second open changes nothing.
341 s2, err := kvstore.Open(ctx, dir)344 s2, err := kvstore.Open(ctx, dir)
@@ -355,7 +358,7 @@ func TestSchemaNewerThanThisBuildStopsIssuesData(t *testing.T) {
355 putRaw(t, dir, "meta/schema", mustProto(t, &storagepb.SchemaVersion{Version: kvstore.SchemaVersion + 1}))358 putRaw(t, dir, "meta/schema", mustProto(t, &storagepb.SchemaVersion{Version: kvstore.SchemaVersion + 1}))
356 _, err := kvstore.Open(ctx, dir)359 _, err := kvstore.Open(ctx, dir)
357 require.ErrorIs(t, err, kvstore.ErrSchemaTooNew)360 require.ErrorIs(t, err, kvstore.ErrSchemaTooNew)
358- assert.Equal(t, uint32(4), uint32(kvstore.SchemaVersion))361+ assert.Equal(t, uint32(5), uint32(kvstore.SchemaVersion))
359 }362 }
360 363
361 // A reopen racing the delete of the repository either lands before the delete364 // A reopen racing the delete of the repository either lands before the delete
@@ -561,3 +564,47 @@ func countScope(scopes []domain.Scope, want domain.Scope) int {
561 }564 }
562 return n565 return n
563 }566 }
567+
568+func TestSchema5UpgradesOwnerEquivalentTokens(t *testing.T) {
569+ ctx := context.Background()
570+ dir := t.TempDir()
571+ putRaw(t, dir, "meta/schema", mustProto(t, &storagepb.SchemaVersion{Version: 4}))
572+ var previous []string
573+ for _, sc := range domain.AllScopes() {
574+ if sc != domain.ScopeMRForceMerge {
575+ previous = append(previous, sc.String())
576+ }
577+ }
578+ tokens := map[string]*storagepb.Token{
579+ "owner": {Id: "owner", Scopes: previous},
580+ "repos": {Id: "repos", Scopes: previous, Repos: []string{"proj"}},
581+ "branch": {Id: "branch", Scopes: previous, BranchPrefixes: []string{"agent/"}},
582+ "partial": {Id: "partial", Scopes: previous[:10]},
583+ }
584+ for id, tok := range tokens {
585+ tok.Hash = make([]byte, 32)
586+ putRaw(t, dir, "token/"+id, mustProto(t, tok))
587+ }
588+ for range 2 {
589+ s, err := kvstore.Open(ctx, dir)
590+ require.NoError(t, err)
591+ for id, original := range tokens {
592+ tok, err := s.Tokens().Get(ctx, id)
593+ require.NoError(t, err)
594+ if id == "owner" {
595+ assert.True(t, domain.TokenPrincipal(tok).HasOwnerRights())
596+ assert.Equal(t, 1, countScope(tok.Scopes, domain.ScopeMRForceMerge))
597+ assert.Len(t, tok.Scopes, 12)
598+ } else {
599+ assert.NotContains(t, tok.Scopes, domain.ScopeMRForceMerge)
600+ var got []string
601+ for _, sc := range tok.Scopes {
602+ got = append(got, sc.String())
603+ }
604+ assert.Equal(t, original.Scopes, got)
605+ }
606+ }
607+ require.NoError(t, s.Close(ctx))
608+ assert.Equal(t, uint32(5), readSchema(t, dir))
609+ }
610+}
M internal/adapters/kvstore/store.go +36 -8
@@ -39,8 +39,9 @@ import (
3939 // (meta/issuekey). The upgrade also adds mr:review and issue:write (each only
4040 // if missing) to the stored tokens that held all nine original scopes with no
4141 // repository list and no branch prefix, so that they keep the owner rights (see
42-// upgradeTokens).
43-const SchemaVersion = 4
42+// upgradeTokens). Version 5 grants mr:force-merge to unrestricted tokens
43+// holding all eleven previous scopes, preserving their owner rights.
44+const SchemaVersion = 5
4445
4546 const schemaKey = "meta/schema"
4647
@@ -109,7 +110,7 @@ func (s *Store) Check(ctx context.Context) error {
109110 func (s *Store) checkSchema(ctx context.Context) error {
110111 log := zerowrap.FromCtx(ctx)
111112 key := []byte(schemaKey)
112- for range 2 {
113+ for range 4 {
113114 item, ok := s.db.Get(ctx, key)
114115 if !ok {
115116 var b kv.Batch
@@ -140,6 +141,10 @@ func (s *Store) checkSchema(ctx context.Context) error {
140141 // the new version is recorded so that older builds refuse it.
141142 // The tokens are upgraded in the same batch, so that a crash
142143 // leaves the old version and the upgrade runs again.
144+ target := uint32(SchemaVersion)
145+ if sv.GetVersion() < 4 {
146+ target = 4
147+ }
143148 var b kv.Batch
144149 b.RequireVersion(key, item.Version)
145150 if sv.GetVersion() < 4 {
@@ -147,7 +152,12 @@ func (s *Store) checkSchema(ctx context.Context) error {
147152 return err
148153 }
149154 }
150- b.Put(key, mustMarshal(&storagepb.SchemaVersion{Version: SchemaVersion}))
155+ if sv.GetVersion() == 4 {
156+ if err := s.upgradeForceMergeTokens(ctx, &b); err != nil {
157+ return err
158+ }
159+ }
160+ b.Put(key, mustMarshal(&storagepb.SchemaVersion{Version: target}))
151161 _, err := s.db.Apply(ctx, &b)
152162 if errors.Is(err, kv.ErrConflict) {
153163 continue // changed meanwhile: read it again
@@ -155,7 +165,10 @@ func (s *Store) checkSchema(ctx context.Context) error {
155165 if err != nil {
156166 return fmt.Errorf("upgrade storage schema: %w", err)
157167 }
158- log.Info().Uint32("from", sv.GetVersion()).Uint32("schema", SchemaVersion).Msg("storage schema upgraded")
168+ log.Info().Uint32("from", sv.GetVersion()).Uint32("schema", target).Msg("storage schema upgraded")
169+ if target < SchemaVersion {
170+ continue
171+ }
159172 return nil
160173 }
161174 log.Info().Uint32("schema", sv.GetVersion()).Msg("storage schema checked")
@@ -182,11 +195,26 @@ var preIssueScopes = []domain.Scope{
182195
183196 // upgradeTokens adds to b the schema 4 upgrade of the tokens: a token that
184197 // holds all of preIssueScopes, limited to no repository and no branch prefix,
185-// had the owner rights, which AllScopes now needs mr:review and issue:write
198+// had the owner rights, which schema 4 needed mr:review and issue:write
186199 // for, so it gets each of them if missing (this is no escalation). Every other
187200 // token is left as it is. The batch requires each token to be at the version it
188201 // was read at.
189202 func (s *Store) upgradeTokens(ctx context.Context, b *kv.Batch) error {
203+ return s.upgradeTokenScopes(ctx, b, preIssueScopes, []domain.Scope{domain.ScopeMRReview, domain.ScopeIssueWrite})
204+}
205+
206+// preForceMergeScopes are the eleven scopes of schema 4, before mr:force-merge.
207+var preForceMergeScopes = append(slices.Clone(preIssueScopes), domain.ScopeMRReview, domain.ScopeIssueWrite)
208+
209+// upgradeForceMergeTokens adds to b the schema 5 upgrade of the tokens: a
210+// token that holds all of preForceMergeScopes, limited to no repository and no
211+// branch prefix, had the owner rights, which AllScopes also needs
212+// mr:force-merge for, so it gets it. Every other token is left as it is.
213+func (s *Store) upgradeForceMergeTokens(ctx context.Context, b *kv.Batch) error {
214+ return s.upgradeTokenScopes(ctx, b, preForceMergeScopes, []domain.Scope{domain.ScopeMRForceMerge})
215+}
216+
217+func (s *Store) upgradeTokenScopes(ctx context.Context, b *kv.Batch, required, addedScopes []domain.Scope) error {
190218 for key, item := range s.db.Snapshot(ctx).Prefix(ctx, []byte(tokenPrefix)) {
191219 pb := &storagepb.Token{}
192220 if err := proto.Unmarshal(item.Value, pb); err != nil {
@@ -196,7 +224,7 @@ func (s *Store) upgradeTokens(ctx context.Context, b *kv.Batch) error {
196224 continue
197225 }
198226 full := true
199- for _, sc := range preIssueScopes {
227+ for _, sc := range required {
200228 if !slices.Contains(pb.GetScopes(), sc.String()) {
201229 full = false
202230 break
@@ -206,7 +234,7 @@ func (s *Store) upgradeTokens(ctx context.Context, b *kv.Batch) error {
206234 continue
207235 }
208236 added := false
209- for _, sc := range []domain.Scope{domain.ScopeMRReview, domain.ScopeIssueWrite} {
237+ for _, sc := range addedScopes {
210238 if !slices.Contains(pb.GetScopes(), sc.String()) {
211239 pb.Scopes = append(pb.Scopes, sc.String())
212240 added = true
@@ -39,8 +39,9 @@ import (
39 // (meta/issuekey). The upgrade also adds mr:review and issue:write (each only39 // (meta/issuekey). The upgrade also adds mr:review and issue:write (each only
40 // if missing) to the stored tokens that held all nine original scopes with no40 // if missing) to the stored tokens that held all nine original scopes with no
41 // repository list and no branch prefix, so that they keep the owner rights (see41 // repository list and no branch prefix, so that they keep the owner rights (see
42-// upgradeTokens).42+// upgradeTokens). Version 5 grants mr:force-merge to unrestricted tokens
43-const SchemaVersion = 443+// holding all eleven previous scopes, preserving their owner rights.
44+const SchemaVersion = 5
44 45
45 const schemaKey = "meta/schema"46 const schemaKey = "meta/schema"
46 47
@@ -109,7 +110,7 @@ func (s *Store) Check(ctx context.Context) error {
109 func (s *Store) checkSchema(ctx context.Context) error {110 func (s *Store) checkSchema(ctx context.Context) error {
110 log := zerowrap.FromCtx(ctx)111 log := zerowrap.FromCtx(ctx)
111 key := []byte(schemaKey)112 key := []byte(schemaKey)
112- for range 2 {113+ for range 4 {
113 item, ok := s.db.Get(ctx, key)114 item, ok := s.db.Get(ctx, key)
114 if !ok {115 if !ok {
115 var b kv.Batch116 var b kv.Batch
@@ -140,6 +141,10 @@ func (s *Store) checkSchema(ctx context.Context) error {
140 // the new version is recorded so that older builds refuse it.141 // the new version is recorded so that older builds refuse it.
141 // The tokens are upgraded in the same batch, so that a crash142 // The tokens are upgraded in the same batch, so that a crash
142 // leaves the old version and the upgrade runs again.143 // leaves the old version and the upgrade runs again.
144+ target := uint32(SchemaVersion)
145+ if sv.GetVersion() < 4 {
146+ target = 4
147+ }
143 var b kv.Batch148 var b kv.Batch
144 b.RequireVersion(key, item.Version)149 b.RequireVersion(key, item.Version)
145 if sv.GetVersion() < 4 {150 if sv.GetVersion() < 4 {
@@ -147,7 +152,12 @@ func (s *Store) checkSchema(ctx context.Context) error {
147 return err152 return err
148 }153 }
149 }154 }
150- b.Put(key, mustMarshal(&storagepb.SchemaVersion{Version: SchemaVersion}))155+ if sv.GetVersion() == 4 {
156+ if err := s.upgradeForceMergeTokens(ctx, &b); err != nil {
157+ return err
158+ }
159+ }
160+ b.Put(key, mustMarshal(&storagepb.SchemaVersion{Version: target}))
151 _, err := s.db.Apply(ctx, &b)161 _, err := s.db.Apply(ctx, &b)
152 if errors.Is(err, kv.ErrConflict) {162 if errors.Is(err, kv.ErrConflict) {
153 continue // changed meanwhile: read it again163 continue // changed meanwhile: read it again
@@ -155,7 +165,10 @@ func (s *Store) checkSchema(ctx context.Context) error {
155 if err != nil {165 if err != nil {
156 return fmt.Errorf("upgrade storage schema: %w", err)166 return fmt.Errorf("upgrade storage schema: %w", err)
157 }167 }
158- log.Info().Uint32("from", sv.GetVersion()).Uint32("schema", SchemaVersion).Msg("storage schema upgraded")168+ log.Info().Uint32("from", sv.GetVersion()).Uint32("schema", target).Msg("storage schema upgraded")
169+ if target < SchemaVersion {
170+ continue
171+ }
159 return nil172 return nil
160 }173 }
161 log.Info().Uint32("schema", sv.GetVersion()).Msg("storage schema checked")174 log.Info().Uint32("schema", sv.GetVersion()).Msg("storage schema checked")
@@ -182,11 +195,26 @@ var preIssueScopes = []domain.Scope{
182 195
183 // upgradeTokens adds to b the schema 4 upgrade of the tokens: a token that196 // upgradeTokens adds to b the schema 4 upgrade of the tokens: a token that
184 // holds all of preIssueScopes, limited to no repository and no branch prefix,197 // holds all of preIssueScopes, limited to no repository and no branch prefix,
185-// had the owner rights, which AllScopes now needs mr:review and issue:write198+// had the owner rights, which schema 4 needed mr:review and issue:write
186 // for, so it gets each of them if missing (this is no escalation). Every other199 // for, so it gets each of them if missing (this is no escalation). Every other
187 // token is left as it is. The batch requires each token to be at the version it200 // token is left as it is. The batch requires each token to be at the version it
188 // was read at.201 // was read at.
189 func (s *Store) upgradeTokens(ctx context.Context, b *kv.Batch) error {202 func (s *Store) upgradeTokens(ctx context.Context, b *kv.Batch) error {
203+ return s.upgradeTokenScopes(ctx, b, preIssueScopes, []domain.Scope{domain.ScopeMRReview, domain.ScopeIssueWrite})
204+}
205+
206+// preForceMergeScopes are the eleven scopes of schema 4, before mr:force-merge.
207+var preForceMergeScopes = append(slices.Clone(preIssueScopes), domain.ScopeMRReview, domain.ScopeIssueWrite)
208+
209+// upgradeForceMergeTokens adds to b the schema 5 upgrade of the tokens: a
210+// token that holds all of preForceMergeScopes, limited to no repository and no
211+// branch prefix, had the owner rights, which AllScopes also needs
212+// mr:force-merge for, so it gets it. Every other token is left as it is.
213+func (s *Store) upgradeForceMergeTokens(ctx context.Context, b *kv.Batch) error {
214+ return s.upgradeTokenScopes(ctx, b, preForceMergeScopes, []domain.Scope{domain.ScopeMRForceMerge})
215+}
216+
217+func (s *Store) upgradeTokenScopes(ctx context.Context, b *kv.Batch, required, addedScopes []domain.Scope) error {
190 for key, item := range s.db.Snapshot(ctx).Prefix(ctx, []byte(tokenPrefix)) {218 for key, item := range s.db.Snapshot(ctx).Prefix(ctx, []byte(tokenPrefix)) {
191 pb := &storagepb.Token{}219 pb := &storagepb.Token{}
192 if err := proto.Unmarshal(item.Value, pb); err != nil {220 if err := proto.Unmarshal(item.Value, pb); err != nil {
@@ -196,7 +224,7 @@ func (s *Store) upgradeTokens(ctx context.Context, b *kv.Batch) error {
196 continue224 continue
197 }225 }
198 full := true226 full := true
199- for _, sc := range preIssueScopes {227+ for _, sc := range required {
200 if !slices.Contains(pb.GetScopes(), sc.String()) {228 if !slices.Contains(pb.GetScopes(), sc.String()) {
201 full = false229 full = false
202 break230 break
@@ -206,7 +234,7 @@ func (s *Store) upgradeTokens(ctx context.Context, b *kv.Batch) error {
206 continue234 continue
207 }235 }
208 added := false236 added := false
209- for _, sc := range []domain.Scope{domain.ScopeMRReview, domain.ScopeIssueWrite} {237+ for _, sc := range addedScopes {
210 if !slices.Contains(pb.GetScopes(), sc.String()) {238 if !slices.Contains(pb.GetScopes(), sc.String()) {
211 pb.Scopes = append(pb.Scopes, sc.String())239 pb.Scopes = append(pb.Scopes, sc.String())
212 added = true240 added = true
M internal/adapters/web/fragments.go +18 -1
@@ -36,6 +36,8 @@ type liveStream struct {
3636 // head shown (its checks are on that head); a job event does not carry
3737 // its commit, so its run is read once. One stream reads it, no lock.
3838 headRuns map[int64]bool
39+ // mergeChecksHTML is the last merge-form part sent, not sent again unchanged.
40+ mergeChecksHTML string
3941 }
4042
4143 // maxHeadRuns bounds headRuns: past it the map starts again.
@@ -625,7 +627,22 @@ func (l *liveStream) mrChecks(ctx context.Context) ([]fragment, error) {
625627 return nil, err
626628 }
627629 sum, err := renderFragment(ctx, "ci-run", MRChecksSum(checksSummary(name, l.head, checks)))
628- return []fragment{f, sum}, err
630+ if err != nil {
631+ return nil, err
632+ }
633+ // The merge form is the owner's: a visitor's stream never carries it.
634+ if !SignedIn(ctx) {
635+ return []fragment{f, sum}, nil
636+ }
637+ controls, err := renderFragment(ctx, "ci-run", MRMergeChecks(checksSummary(name, l.head, checks)))
638+ if err != nil {
639+ return nil, err
640+ }
641+ if controls.html == l.mergeChecksHTML {
642+ return []fragment{f, sum}, nil
643+ }
644+ l.mergeChecksHTML = controls.html
645+ return []fragment{f, sum, controls}, nil
629646 }
630647
631648 // recentActions is the "Recent actions" block of the summary rail, read again
@@ -36,6 +36,8 @@ type liveStream struct {
36 // head shown (its checks are on that head); a job event does not carry36 // head shown (its checks are on that head); a job event does not carry
37 // its commit, so its run is read once. One stream reads it, no lock.37 // its commit, so its run is read once. One stream reads it, no lock.
38 headRuns map[int64]bool38 headRuns map[int64]bool
39+ // mergeChecksHTML is the last merge-form part sent, not sent again unchanged.
40+ mergeChecksHTML string
39 }41 }
40 42
41 // maxHeadRuns bounds headRuns: past it the map starts again.43 // maxHeadRuns bounds headRuns: past it the map starts again.
@@ -625,7 +627,22 @@ func (l *liveStream) mrChecks(ctx context.Context) ([]fragment, error) {
625 return nil, err627 return nil, err
626 }628 }
627 sum, err := renderFragment(ctx, "ci-run", MRChecksSum(checksSummary(name, l.head, checks)))629 sum, err := renderFragment(ctx, "ci-run", MRChecksSum(checksSummary(name, l.head, checks)))
628- return []fragment{f, sum}, err630+ if err != nil {
631+ return nil, err
632+ }
633+ // The merge form is the owner's: a visitor's stream never carries it.
634+ if !SignedIn(ctx) {
635+ return []fragment{f, sum}, nil
636+ }
637+ controls, err := renderFragment(ctx, "ci-run", MRMergeChecks(checksSummary(name, l.head, checks)))
638+ if err != nil {
639+ return nil, err
640+ }
641+ if controls.html == l.mergeChecksHTML {
642+ return []fragment{f, sum}, nil
643+ }
644+ l.mergeChecksHTML = controls.html
645+ return []fragment{f, sum, controls}, nil
629 }646 }
630 647
631 // recentActions is the "Recent actions" block of the summary rail, read again648 // recentActions is the "Recent actions" block of the summary rail, read again
M internal/adapters/web/mr.templ +12 -4
@@ -545,10 +545,7 @@ templ mergeMenu(p MRPage) {
545545 </label>
546546 }
547547 </fieldset>
548- if p.ChecksSum.Kind == "bad" || p.ChecksSum.Kind == "running" {
549- <p class="d-note">{ p.ChecksSum.State + ": a failing or unfinished check blocks the merge." }</p>
550- <label class="d-check"><input type="checkbox" name="ignore_checks"/> Ignore checks</label>
551- }
548+ @MRMergeChecks(p.ChecksSum)
552549 if p.Box.CanDeleteBranch {
553550 <label class="d-check"><input type="checkbox" name="delete_branch" value="1"/> delete { p.Source } after the merge <kbd aria-hidden="true">D</kbd></label>
554551 }
@@ -770,3 +767,14 @@ templ compareRail(p ComparePage) {
770767 @CloneBlock(p.CLI)
771768 </section>
772769 }
770+
771+// MRMergeChecks is the part of the owner's merge form that depends on the
772+// checks: a live update replaces it and keeps "Ignore checks" ticked.
773+templ MRMergeChecks(c ChecksSummary) {
774+ <div id="mr-merge-checks" data-keep-checks>
775+ if c.Kind == "bad" || c.Kind == "running" {
776+ <p class="d-note">{ c.State + ": a failing or unfinished check blocks the merge." }</p>
777+ <label class="d-check"><input type="checkbox" name="ignore_checks"/> Ignore checks</label>
778+ }
779+ </div>
780+}
@@ -545,10 +545,7 @@ templ mergeMenu(p MRPage) {
545 </label>545 </label>
546 }546 }
547 </fieldset>547 </fieldset>
548- if p.ChecksSum.Kind == "bad" || p.ChecksSum.Kind == "running" {548+ @MRMergeChecks(p.ChecksSum)
549- <p class="d-note">{ p.ChecksSum.State + ": a failing or unfinished check blocks the merge." }</p>
550- <label class="d-check"><input type="checkbox" name="ignore_checks"/> Ignore checks</label>
551- }
552 if p.Box.CanDeleteBranch {549 if p.Box.CanDeleteBranch {
553 <label class="d-check"><input type="checkbox" name="delete_branch" value="1"/> delete { p.Source } after the merge <kbd aria-hidden="true">D</kbd></label>550 <label class="d-check"><input type="checkbox" name="delete_branch" value="1"/> delete { p.Source } after the merge <kbd aria-hidden="true">D</kbd></label>
554 }551 }
@@ -770,3 +767,14 @@ templ compareRail(p ComparePage) {
770 @CloneBlock(p.CLI)767 @CloneBlock(p.CLI)
771 </section>768 </section>
772 }769 }
770+
771+// MRMergeChecks is the part of the owner's merge form that depends on the
772+// checks: a live update replaces it and keeps "Ignore checks" ticked.
773+templ MRMergeChecks(c ChecksSummary) {
774+ <div id="mr-merge-checks" data-keep-checks>
775+ if c.Kind == "bad" || c.Kind == "running" {
776+ <p class="d-note">{ c.State + ": a failing or unfinished check blocks the merge." }</p>
777+ <label class="d-check"><input type="checkbox" name="ignore_checks"/> Ignore checks</label>
778+ }
779+ </div>
780+}
M internal/adapters/web/mr_templ.go +393 -354
@@ -2805,174 +2805,159 @@ func mergeMenu(p MRPage) templ.Component {
28052805 if templ_7745c5c3_Err != nil {
28062806 return templ_7745c5c3_Err
28072807 }
2808- if p.ChecksSum.Kind == "bad" || p.ChecksSum.Kind == "running" {
2809- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 264, "<p class=\"d-note\">")
2810- if templ_7745c5c3_Err != nil {
2811- return templ_7745c5c3_Err
2812- }
2813- var templ_7745c5c3_Var134 string
2814- templ_7745c5c3_Var134, templ_7745c5c3_Err = templ.JoinStringErrs(p.ChecksSum.State + ": a failing or unfinished check blocks the merge.")
2815- if templ_7745c5c3_Err != nil {
2816- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 549, Col: 97}
2817- }
2818- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var134))
2819- if templ_7745c5c3_Err != nil {
2820- return templ_7745c5c3_Err
2821- }
2822- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 265, "</p><label class=\"d-check\"><input type=\"checkbox\" name=\"ignore_checks\"> Ignore checks</label> ")
2823- if templ_7745c5c3_Err != nil {
2824- return templ_7745c5c3_Err
2825- }
2808+ templ_7745c5c3_Err = MRMergeChecks(p.ChecksSum).Render(ctx, templ_7745c5c3_Buffer)
2809+ if templ_7745c5c3_Err != nil {
2810+ return templ_7745c5c3_Err
28262811 }
28272812 if p.Box.CanDeleteBranch {
2828- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 266, "<label class=\"d-check\"><input type=\"checkbox\" name=\"delete_branch\" value=\"1\"> delete ")
2813+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 264, "<label class=\"d-check\"><input type=\"checkbox\" name=\"delete_branch\" value=\"1\"> delete ")
28292814 if templ_7745c5c3_Err != nil {
28302815 return templ_7745c5c3_Err
28312816 }
2832- var templ_7745c5c3_Var135 string
2833- templ_7745c5c3_Var135, templ_7745c5c3_Err = templ.JoinStringErrs(p.Source)
2817+ var templ_7745c5c3_Var134 string
2818+ templ_7745c5c3_Var134, templ_7745c5c3_Err = templ.JoinStringErrs(p.Source)
28342819 if templ_7745c5c3_Err != nil {
2835- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 553, Col: 102}
2820+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 550, Col: 102}
28362821 }
2837- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var135))
2822+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var134))
28382823 if templ_7745c5c3_Err != nil {
28392824 return templ_7745c5c3_Err
28402825 }
2841- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 267, " after the merge <kbd aria-hidden=\"true\">D</kbd></label>")
2826+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 265, " after the merge <kbd aria-hidden=\"true\">D</kbd></label>")
28422827 if templ_7745c5c3_Err != nil {
28432828 return templ_7745c5c3_Err
28442829 }
28452830 }
2846- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 268, "<div class=\"d-btns\"><button type=\"submit\" class=\"btn primary\" data-default")
2831+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 266, "<div class=\"d-btns\"><button type=\"submit\" class=\"btn primary\" data-default")
28472832 if templ_7745c5c3_Err != nil {
28482833 return templ_7745c5c3_Err
28492834 }
28502835 if !p.Box.CanMerge() {
2851- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 269, " disabled")
2836+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 267, " disabled")
28522837 if templ_7745c5c3_Err != nil {
28532838 return templ_7745c5c3_Err
28542839 }
28552840 }
2856- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 270, " title=\"")
2841+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 268, " title=\"")
28572842 if templ_7745c5c3_Err != nil {
28582843 return templ_7745c5c3_Err
28592844 }
2860- var templ_7745c5c3_Var136 string
2861- templ_7745c5c3_Var136, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.Box.MergeTitle())
2845+ var templ_7745c5c3_Var135 string
2846+ templ_7745c5c3_Var135, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.Box.MergeTitle())
28622847 if templ_7745c5c3_Err != nil {
2863- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 561, Col: 33}
2848+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 558, Col: 33}
28642849 }
2865- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var136)
2850+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var135)
28662851 if templ_7745c5c3_Err != nil {
28672852 return templ_7745c5c3_Err
28682853 }
2869- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 271, "\" :disabled=\"!this.form.querySelector('input[name=mode]:checked:not(:disabled)')\" :title=\"(this.form.querySelector('input[name=mode]:checked') || {}).title || ''\">Merge into ")
2854+ 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 ")
28702855 if templ_7745c5c3_Err != nil {
28712856 return templ_7745c5c3_Err
28722857 }
2873- var templ_7745c5c3_Var137 string
2874- templ_7745c5c3_Var137, templ_7745c5c3_Err = templ.JoinStringErrs(p.Target)
2858+ var templ_7745c5c3_Var136 string
2859+ templ_7745c5c3_Var136, templ_7745c5c3_Err = templ.JoinStringErrs(p.Target)
28752860 if templ_7745c5c3_Err != nil {
2876- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 564, Col: 28}
2861+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 561, Col: 28}
28772862 }
2878- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var137))
2863+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var136))
28792864 if templ_7745c5c3_Err != nil {
28802865 return templ_7745c5c3_Err
28812866 }
2882- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 272, "</button></div></form>")
2867+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 270, "</button></div></form>")
28832868 if templ_7745c5c3_Err != nil {
28842869 return templ_7745c5c3_Err
28852870 }
28862871 if p.Box.CanAutoMerge {
2887- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 273, "<form class=\"d-acts\" method=\"post\" action=\"")
2872+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 271, "<form class=\"d-acts\" method=\"post\" action=\"")
28882873 if templ_7745c5c3_Err != nil {
28892874 return templ_7745c5c3_Err
28902875 }
2891- var templ_7745c5c3_Var138 templ.SafeURL
2892- templ_7745c5c3_Var138, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.Box.AutoAction))
2876+ var templ_7745c5c3_Var137 templ.SafeURL
2877+ templ_7745c5c3_Var137, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.Box.AutoAction))
28932878 if templ_7745c5c3_Err != nil {
2894- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 568, Col: 80}
2879+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 565, Col: 80}
28952880 }
2896- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var138))
2881+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var137))
28972882 if templ_7745c5c3_Err != nil {
28982883 return templ_7745c5c3_Err
28992884 }
2900- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 274, "\"><input type=\"hidden\" name=\"head_id\" value=\"")
2885+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 272, "\"><input type=\"hidden\" name=\"head_id\" value=\"")
29012886 if templ_7745c5c3_Err != nil {
29022887 return templ_7745c5c3_Err
29032888 }
2904- var templ_7745c5c3_Var139 string
2905- templ_7745c5c3_Var139, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.Box.Head)
2889+ var templ_7745c5c3_Var138 string
2890+ templ_7745c5c3_Var138, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.Box.Head)
29062891 if templ_7745c5c3_Err != nil {
2907- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 569, Col: 60}
2892+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 566, Col: 60}
29082893 }
2909- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var139)
2894+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var138)
29102895 if templ_7745c5c3_Err != nil {
29112896 return templ_7745c5c3_Err
29122897 }
2913- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 275, "\"><fieldset class=\"d-modes\"><legend>Auto-merge mode</legend> ")
2898+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 273, "\"><fieldset class=\"d-modes\"><legend>Auto-merge mode</legend> ")
29142899 if templ_7745c5c3_Err != nil {
29152900 return templ_7745c5c3_Err
29162901 }
29172902 for i, m := range p.Box.Modes {
2918- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 276, "<label><input type=\"radio\" name=\"mode\" value=\"")
2903+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 274, "<label><input type=\"radio\" name=\"mode\" value=\"")
29192904 if templ_7745c5c3_Err != nil {
29202905 return templ_7745c5c3_Err
29212906 }
2922- var templ_7745c5c3_Var140 string
2923- templ_7745c5c3_Var140, templ_7745c5c3_Err = templ.ResolveAttributeValue(m.Value)
2907+ var templ_7745c5c3_Var139 string
2908+ templ_7745c5c3_Var139, templ_7745c5c3_Err = templ.ResolveAttributeValue(m.Value)
29242909 if templ_7745c5c3_Err != nil {
2925- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 573, Col: 62}
2910+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 570, Col: 62}
29262911 }
2927- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var140)
2912+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var139)
29282913 if templ_7745c5c3_Err != nil {
29292914 return templ_7745c5c3_Err
29302915 }
2931- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 277, "\"")
2916+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 275, "\"")
29322917 if templ_7745c5c3_Err != nil {
29332918 return templ_7745c5c3_Err
29342919 }
29352920 if i == 0 {
2936- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 278, " checked")
2921+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 276, " checked")
29372922 if templ_7745c5c3_Err != nil {
29382923 return templ_7745c5c3_Err
29392924 }
29402925 }
2941- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 279, "> ")
2926+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 277, "> ")
29422927 if templ_7745c5c3_Err != nil {
29432928 return templ_7745c5c3_Err
29442929 }
2945- var templ_7745c5c3_Var141 string
2946- templ_7745c5c3_Var141, templ_7745c5c3_Err = templ.JoinStringErrs(m.Label)
2930+ var templ_7745c5c3_Var140 string
2931+ templ_7745c5c3_Var140, templ_7745c5c3_Err = templ.JoinStringErrs(m.Label)
29472932 if templ_7745c5c3_Err != nil {
2948- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 573, Col: 96}
2933+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 570, Col: 96}
29492934 }
2950- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var141))
2935+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var140))
29512936 if templ_7745c5c3_Err != nil {
29522937 return templ_7745c5c3_Err
29532938 }
2954- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 280, "</label>")
2939+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 278, "</label>")
29552940 if templ_7745c5c3_Err != nil {
29562941 return templ_7745c5c3_Err
29572942 }
29582943 }
2959- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 281, "</fieldset><div class=\"d-btns\"><button type=\"submit\" class=\"btn\"")
2944+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 279, "</fieldset><div class=\"d-btns\"><button type=\"submit\" class=\"btn\"")
29602945 if templ_7745c5c3_Err != nil {
29612946 return templ_7745c5c3_Err
29622947 }
29632948 if len(p.Box.Modes) == 0 {
2964- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 282, " disabled")
2949+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 280, " disabled")
29652950 if templ_7745c5c3_Err != nil {
29662951 return templ_7745c5c3_Err
29672952 }
29682953 }
2969- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 283, " title=\"merge once the checks pass\">Merge when ready</button></div></form>")
2954+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 281, " title=\"merge once the checks pass\">Merge when ready</button></div></form>")
29702955 if templ_7745c5c3_Err != nil {
29712956 return templ_7745c5c3_Err
29722957 }
29732958 }
29742959 }
2975- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 284, "</div></details>")
2960+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 282, "</div></details>")
29762961 if templ_7745c5c3_Err != nil {
29772962 return templ_7745c5c3_Err
29782963 }
@@ -2998,182 +2983,182 @@ func MRMergeability(v MergeabilityView) templ.Component {
29982983 }()
29992984 }
30002985 ctx = templ.InitializeContext(ctx)
3001- templ_7745c5c3_Var142 := templ.GetChildren(ctx)
3002- if templ_7745c5c3_Var142 == nil {
3003- templ_7745c5c3_Var142 = templ.NopComponent
2986+ templ_7745c5c3_Var141 := templ.GetChildren(ctx)
2987+ if templ_7745c5c3_Var141 == nil {
2988+ templ_7745c5c3_Var141 = templ.NopComponent
30042989 }
30052990 ctx = templ.ClearChildren(ctx)
3006- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 285, "<span data-mergeability data-state=\"")
2991+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 283, "<span data-mergeability data-state=\"")
2992+ if templ_7745c5c3_Err != nil {
2993+ return templ_7745c5c3_Err
2994+ }
2995+ var templ_7745c5c3_Var142 string
2996+ templ_7745c5c3_Var142, templ_7745c5c3_Err = templ.ResolveAttributeValue(v.State)
2997+ if templ_7745c5c3_Err != nil {
2998+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 588, Col: 22}
2999+ }
3000+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var142)
3001+ if templ_7745c5c3_Err != nil {
3002+ return templ_7745c5c3_Err
3003+ }
3004+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 284, "\" data-ff-ok=\"")
30073005 if templ_7745c5c3_Err != nil {
30083006 return templ_7745c5c3_Err
30093007 }
30103008 var templ_7745c5c3_Var143 string
3011- templ_7745c5c3_Var143, templ_7745c5c3_Err = templ.ResolveAttributeValue(v.State)
3009+ templ_7745c5c3_Var143, templ_7745c5c3_Err = templ.ResolveAttributeValue(strconv.FormatBool(v.FFOk))
30123010 if templ_7745c5c3_Err != nil {
3013- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 591, Col: 22}
3011+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 589, Col: 41}
30143012 }
30153013 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var143)
30163014 if templ_7745c5c3_Err != nil {
30173015 return templ_7745c5c3_Err
30183016 }
3019- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 286, "\" data-ff-ok=\"")
3017+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 285, "\" data-merge-ok=\"")
30203018 if templ_7745c5c3_Err != nil {
30213019 return templ_7745c5c3_Err
30223020 }
30233021 var templ_7745c5c3_Var144 string
3024- templ_7745c5c3_Var144, templ_7745c5c3_Err = templ.ResolveAttributeValue(strconv.FormatBool(v.FFOk))
3022+ templ_7745c5c3_Var144, templ_7745c5c3_Err = templ.ResolveAttributeValue(strconv.FormatBool(v.MergeOk))
30253023 if templ_7745c5c3_Err != nil {
3026- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 592, Col: 41}
3024+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 590, Col: 47}
30273025 }
30283026 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var144)
30293027 if templ_7745c5c3_Err != nil {
30303028 return templ_7745c5c3_Err
30313029 }
3032- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 287, "\" data-merge-ok=\"")
3030+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 286, "\" data-ff-reason=\"")
30333031 if templ_7745c5c3_Err != nil {
30343032 return templ_7745c5c3_Err
30353033 }
30363034 var templ_7745c5c3_Var145 string
3037- templ_7745c5c3_Var145, templ_7745c5c3_Err = templ.ResolveAttributeValue(strconv.FormatBool(v.MergeOk))
3035+ templ_7745c5c3_Var145, templ_7745c5c3_Err = templ.ResolveAttributeValue(v.FFReason)
30383036 if templ_7745c5c3_Err != nil {
3039- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 593, Col: 47}
3037+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 591, Col: 29}
30403038 }
30413039 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var145)
30423040 if templ_7745c5c3_Err != nil {
30433041 return templ_7745c5c3_Err
30443042 }
3045- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 288, "\" data-ff-reason=\"")
3043+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 287, "\" data-merge-reason=\"")
30463044 if templ_7745c5c3_Err != nil {
30473045 return templ_7745c5c3_Err
30483046 }
30493047 var templ_7745c5c3_Var146 string
3050- templ_7745c5c3_Var146, templ_7745c5c3_Err = templ.ResolveAttributeValue(v.FFReason)
3048+ templ_7745c5c3_Var146, templ_7745c5c3_Err = templ.ResolveAttributeValue(v.MergeReason)
30513049 if templ_7745c5c3_Err != nil {
3052- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 594, Col: 29}
3050+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 592, Col: 35}
30533051 }
30543052 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var146)
30553053 if templ_7745c5c3_Err != nil {
30563054 return templ_7745c5c3_Err
30573055 }
3058- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 289, "\" data-merge-reason=\"")
3056+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 288, "\"><span class=\"badge\" data-state=\"")
30593057 if templ_7745c5c3_Err != nil {
30603058 return templ_7745c5c3_Err
30613059 }
30623060 var templ_7745c5c3_Var147 string
3063- templ_7745c5c3_Var147, templ_7745c5c3_Err = templ.ResolveAttributeValue(v.MergeReason)
3061+ templ_7745c5c3_Var147, templ_7745c5c3_Err = templ.ResolveAttributeValue(v.State)
30643062 if templ_7745c5c3_Err != nil {
3065- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 595, Col: 35}
3063+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 594, Col: 42}
30663064 }
30673065 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var147)
30683066 if templ_7745c5c3_Err != nil {
30693067 return templ_7745c5c3_Err
30703068 }
3071- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 290, "\"><span class=\"badge\" data-state=\"")
3069+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 289, "\">")
30723070 if templ_7745c5c3_Err != nil {
30733071 return templ_7745c5c3_Err
30743072 }
30753073 var templ_7745c5c3_Var148 string
3076- templ_7745c5c3_Var148, templ_7745c5c3_Err = templ.ResolveAttributeValue(v.State)
3077- if templ_7745c5c3_Err != nil {
3078- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 597, Col: 42}
3079- }
3080- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var148)
3081- if templ_7745c5c3_Err != nil {
3082- return templ_7745c5c3_Err
3083- }
3084- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 291, "\">")
3085- if templ_7745c5c3_Err != nil {
3086- return templ_7745c5c3_Err
3087- }
3088- var templ_7745c5c3_Var149 string
3089- templ_7745c5c3_Var149, templ_7745c5c3_Err = templ.JoinStringErrs(v.Label)
3074+ templ_7745c5c3_Var148, templ_7745c5c3_Err = templ.JoinStringErrs(v.Label)
30903075 if templ_7745c5c3_Err != nil {
3091- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 597, Col: 54}
3076+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 594, Col: 54}
30923077 }
3093- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var149))
3078+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var148))
30943079 if templ_7745c5c3_Err != nil {
30953080 return templ_7745c5c3_Err
30963081 }
3097- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 292, "</span> ")
3082+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 290, "</span> ")
30983083 if templ_7745c5c3_Err != nil {
30993084 return templ_7745c5c3_Err
31003085 }
31013086 if v.Detail != "" {
3102- var templ_7745c5c3_Var150 string
3103- templ_7745c5c3_Var150, templ_7745c5c3_Err = templ.JoinStringErrs(" ")
3087+ var templ_7745c5c3_Var149 string
3088+ templ_7745c5c3_Var149, templ_7745c5c3_Err = templ.JoinStringErrs(" ")
31043089 if templ_7745c5c3_Err != nil {
3105- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 599, Col: 8}
3090+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 596, Col: 8}
31063091 }
3107- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var150))
3092+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var149))
31083093 if templ_7745c5c3_Err != nil {
31093094 return templ_7745c5c3_Err
31103095 }
3111- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 293, "<span class=\"dim\">")
3096+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 291, "<span class=\"dim\">")
31123097 if templ_7745c5c3_Err != nil {
31133098 return templ_7745c5c3_Err
31143099 }
3115- var templ_7745c5c3_Var151 string
3116- templ_7745c5c3_Var151, templ_7745c5c3_Err = templ.JoinStringErrs(v.Detail)
3100+ var templ_7745c5c3_Var150 string
3101+ templ_7745c5c3_Var150, templ_7745c5c3_Err = templ.JoinStringErrs(v.Detail)
31173102 if templ_7745c5c3_Err != nil {
3118- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 599, Col: 38}
3103+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 596, Col: 38}
31193104 }
3120- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var151))
3105+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var150))
31213106 if templ_7745c5c3_Err != nil {
31223107 return templ_7745c5c3_Err
31233108 }
3124- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 294, "</span>")
3109+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 292, "</span>")
31253110 if templ_7745c5c3_Err != nil {
31263111 return templ_7745c5c3_Err
31273112 }
31283113 }
3129- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 295, "</span> ")
3114+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 293, "</span> ")
31303115 if templ_7745c5c3_Err != nil {
31313116 return templ_7745c5c3_Err
31323117 }
31333118 if len(v.Paths) > 0 {
3134- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 296, "<ul class=\"mg-paths\" aria-label=\"conflicting files\">")
3119+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 294, "<ul class=\"mg-paths\" aria-label=\"conflicting files\">")
31353120 if templ_7745c5c3_Err != nil {
31363121 return templ_7745c5c3_Err
31373122 }
31383123 for _, path := range v.Paths {
3139- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 297, "<li><code>")
3124+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 295, "<li><code>")
31403125 if templ_7745c5c3_Err != nil {
31413126 return templ_7745c5c3_Err
31423127 }
3143- var templ_7745c5c3_Var152 string
3144- templ_7745c5c3_Var152, templ_7745c5c3_Err = templ.JoinStringErrs(path)
3128+ var templ_7745c5c3_Var151 string
3129+ templ_7745c5c3_Var151, templ_7745c5c3_Err = templ.JoinStringErrs(path)
31453130 if templ_7745c5c3_Err != nil {
3146- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 605, Col: 20}
3131+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 602, Col: 20}
31473132 }
3148- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var152))
3133+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var151))
31493134 if templ_7745c5c3_Err != nil {
31503135 return templ_7745c5c3_Err
31513136 }
3152- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 298, "</code></li>")
3137+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 296, "</code></li>")
31533138 if templ_7745c5c3_Err != nil {
31543139 return templ_7745c5c3_Err
31553140 }
31563141 }
3157- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 299, "</ul>")
3142+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 297, "</ul>")
31583143 if templ_7745c5c3_Err != nil {
31593144 return templ_7745c5c3_Err
31603145 }
31613146 }
31623147 if v.PathsNote != "" {
3163- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 300, "<p class=\"dim\">")
3148+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 298, "<p class=\"dim\">")
31643149 if templ_7745c5c3_Err != nil {
31653150 return templ_7745c5c3_Err
31663151 }
3167- var templ_7745c5c3_Var153 string
3168- templ_7745c5c3_Var153, templ_7745c5c3_Err = templ.JoinStringErrs(v.PathsNote)
3152+ var templ_7745c5c3_Var152 string
3153+ templ_7745c5c3_Var152, templ_7745c5c3_Err = templ.JoinStringErrs(v.PathsNote)
31693154 if templ_7745c5c3_Err != nil {
3170- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 610, Col: 30}
3155+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 607, Col: 30}
31713156 }
3172- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var153))
3157+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var152))
31733158 if templ_7745c5c3_Err != nil {
31743159 return templ_7745c5c3_Err
31753160 }
3176- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 301, "</p>")
3161+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 299, "</p>")
31773162 if templ_7745c5c3_Err != nil {
31783163 return templ_7745c5c3_Err
31793164 }
@@ -3200,12 +3185,12 @@ func mrMergeabilitySlot(v MergeabilityView) templ.Component {
32003185 }()
32013186 }
32023187 ctx = templ.InitializeContext(ctx)
3203- templ_7745c5c3_Var154 := templ.GetChildren(ctx)
3204- if templ_7745c5c3_Var154 == nil {
3205- templ_7745c5c3_Var154 = templ.NopComponent
3188+ templ_7745c5c3_Var153 := templ.GetChildren(ctx)
3189+ if templ_7745c5c3_Var153 == nil {
3190+ templ_7745c5c3_Var153 = templ.NopComponent
32063191 }
32073192 ctx = templ.ClearChildren(ctx)
3208- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 302, "<div id=\"mr-mergeability\" class=\"live-slot\" role=\"status\" data-slot>")
3193+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 300, "<div id=\"mr-mergeability\" class=\"live-slot\" role=\"status\" data-slot>")
32093194 if templ_7745c5c3_Err != nil {
32103195 return templ_7745c5c3_Err
32113196 }
@@ -3213,7 +3198,7 @@ func mrMergeabilitySlot(v MergeabilityView) templ.Component {
32133198 if templ_7745c5c3_Err != nil {
32143199 return templ_7745c5c3_Err
32153200 }
3216- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 303, "</div>")
3201+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 301, "</div>")
32173202 if templ_7745c5c3_Err != nil {
32183203 return templ_7745c5c3_Err
32193204 }
@@ -3238,9 +3223,9 @@ func MRMergeabilityFragment(v MergeabilityView) templ.Component {
32383223 }()
32393224 }
32403225 ctx = templ.InitializeContext(ctx)
3241- templ_7745c5c3_Var155 := templ.GetChildren(ctx)
3242- if templ_7745c5c3_Var155 == nil {
3243- templ_7745c5c3_Var155 = templ.NopComponent
3226+ templ_7745c5c3_Var154 := templ.GetChildren(ctx)
3227+ if templ_7745c5c3_Var154 == nil {
3228+ templ_7745c5c3_Var154 = templ.NopComponent
32443229 }
32453230 ctx = templ.ClearChildren(ctx)
32463231 templ_7745c5c3_Err = mrMergeabilitySlot(v).Render(ctx, templ_7745c5c3_Buffer)
@@ -3269,128 +3254,128 @@ func moreMenu(p MRPage) templ.Component {
32693254 }()
32703255 }
32713256 ctx = templ.InitializeContext(ctx)
3272- templ_7745c5c3_Var156 := templ.GetChildren(ctx)
3273- if templ_7745c5c3_Var156 == nil {
3274- templ_7745c5c3_Var156 = templ.NopComponent
3257+ templ_7745c5c3_Var155 := templ.GetChildren(ctx)
3258+ if templ_7745c5c3_Var155 == nil {
3259+ templ_7745c5c3_Var155 = templ.NopComponent
32753260 }
32763261 ctx = templ.ClearChildren(ctx)
3277- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 304, "<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>")
3262+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 302, "<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>")
32783263 if templ_7745c5c3_Err != nil {
32793264 return templ_7745c5c3_Err
32803265 }
3281- var templ_7745c5c3_Var157 string
3282- templ_7745c5c3_Var157, templ_7745c5c3_Err = templ.JoinStringErrs(strings.Join(p.Modes, ", "))
3266+ var templ_7745c5c3_Var156 string
3267+ templ_7745c5c3_Var156, templ_7745c5c3_Err = templ.JoinStringErrs(strings.Join(p.Modes, ", "))
32833268 if templ_7745c5c3_Err != nil {
3284- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 637, Col: 38}
3269+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 634, Col: 38}
32853270 }
3286- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var157))
3271+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var156))
32873272 if templ_7745c5c3_Err != nil {
32883273 return templ_7745c5c3_Err
32893274 }
3290- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 305, "</dd><dt>checks</dt><dd>")
3275+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 303, "</dd><dt>checks</dt><dd>")
32913276 if templ_7745c5c3_Err != nil {
32923277 return templ_7745c5c3_Err
32933278 }
32943279 if p.ChecksBlock {
3295- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 306, "failing or unfinished checks block the merge")
3280+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 304, "failing or unfinished checks block the merge")
32963281 if templ_7745c5c3_Err != nil {
32973282 return templ_7745c5c3_Err
32983283 }
32993284 } else {
3300- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 307, "do not block the merge")
3285+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 305, "do not block the merge")
33013286 if templ_7745c5c3_Err != nil {
33023287 return templ_7745c5c3_Err
33033288 }
33043289 }
3305- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 308, "</dd></dl></section>")
3290+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 306, "</dd></dl></section>")
33063291 if templ_7745c5c3_Err != nil {
33073292 return templ_7745c5c3_Err
33083293 }
33093294 if p.Box != nil {
33103295 if p.Box.Signed {
3311- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 309, "<p class=\"d-note\" id=\"mr-signing\">squash and merge commits are signed with ermite's own key (generated on first start). ")
3296+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 307, "<p class=\"d-note\" id=\"mr-signing\">squash and merge commits are signed with ermite's own key (generated on first start). ")
33123297 if templ_7745c5c3_Err != nil {
33133298 return templ_7745c5c3_Err
33143299 }
33153300 if p.Box.Fingerprint != "" {
3316- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 310, "fingerprint <code>")
3301+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 308, "fingerprint <code>")
33173302 if templ_7745c5c3_Err != nil {
33183303 return templ_7745c5c3_Err
33193304 }
3320- var templ_7745c5c3_Var158 string
3321- templ_7745c5c3_Var158, templ_7745c5c3_Err = templ.JoinStringErrs(p.Box.Fingerprint)
3305+ var templ_7745c5c3_Var157 string
3306+ templ_7745c5c3_Var157, templ_7745c5c3_Err = templ.JoinStringErrs(p.Box.Fingerprint)
33223307 if templ_7745c5c3_Err != nil {
3323- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 653, Col: 44}
3308+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 650, Col: 44}
33243309 }
3325- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var158))
3310+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var157))
33263311 if templ_7745c5c3_Err != nil {
33273312 return templ_7745c5c3_Err
33283313 }
3329- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 311, "</code> ")
3314+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 309, "</code> ")
33303315 if templ_7745c5c3_Err != nil {
33313316 return templ_7745c5c3_Err
33323317 }
33333318 }
3334- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 312, "<code>ermite signing-key show</code> prints it.</p>")
3319+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 310, "<code>ermite signing-key show</code> prints it.</p>")
33353320 if templ_7745c5c3_Err != nil {
33363321 return templ_7745c5c3_Err
33373322 }
33383323 }
3339- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 313, " ")
3324+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 311, " ")
33403325 if templ_7745c5c3_Err != nil {
33413326 return templ_7745c5c3_Err
33423327 }
33433328 if p.Box.CanMarkRead {
3344- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 314, "<form method=\"post\" action=\"")
3329+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 312, "<form method=\"post\" action=\"")
33453330 if templ_7745c5c3_Err != nil {
33463331 return templ_7745c5c3_Err
33473332 }
3348- var templ_7745c5c3_Var159 templ.SafeURL
3349- templ_7745c5c3_Var159, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.Box.ReadAction))
3333+ var templ_7745c5c3_Var158 templ.SafeURL
3334+ templ_7745c5c3_Var158, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.Box.ReadAction))
33503335 if templ_7745c5c3_Err != nil {
3351- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 659, Col: 65}
3336+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 656, Col: 65}
33523337 }
3353- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var159))
3338+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var158))
33543339 if templ_7745c5c3_Err != nil {
33553340 return templ_7745c5c3_Err
33563341 }
3357- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 315, "\"><input type=\"hidden\" name=\"head_id\" value=\"")
3342+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 313, "\"><input type=\"hidden\" name=\"head_id\" value=\"")
33583343 if templ_7745c5c3_Err != nil {
33593344 return templ_7745c5c3_Err
33603345 }
3361- var templ_7745c5c3_Var160 string
3362- templ_7745c5c3_Var160, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.Box.Head)
3346+ var templ_7745c5c3_Var159 string
3347+ templ_7745c5c3_Var159, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.Box.Head)
33633348 if templ_7745c5c3_Err != nil {
3364- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 660, Col: 60}
3349+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 657, Col: 60}
33653350 }
3366- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var160)
3351+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var159)
33673352 if templ_7745c5c3_Err != nil {
33683353 return templ_7745c5c3_Err
33693354 }
3370- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 316, "\"> <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>")
3355+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 314, "\"> <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>")
33713356 if templ_7745c5c3_Err != nil {
33723357 return templ_7745c5c3_Err
33733358 }
33743359 }
3375- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 317, " <form method=\"post\" action=\"")
3360+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 315, " <form method=\"post\" action=\"")
33763361 if templ_7745c5c3_Err != nil {
33773362 return templ_7745c5c3_Err
33783363 }
3379- var templ_7745c5c3_Var161 templ.SafeURL
3380- templ_7745c5c3_Var161, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.Box.CloseAction))
3364+ var templ_7745c5c3_Var160 templ.SafeURL
3365+ templ_7745c5c3_Var160, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.Box.CloseAction))
33813366 if templ_7745c5c3_Err != nil {
3382- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 664, Col: 65}
3367+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 661, Col: 65}
33833368 }
3384- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var161))
3369+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var160))
33853370 if templ_7745c5c3_Err != nil {
33863371 return templ_7745c5c3_Err
33873372 }
3388- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 318, "\"><button type=\"submit\" title=\"close without merging; the branch is kept\" class=\"btn danger\">Close</button></form>")
3373+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 316, "\"><button type=\"submit\" title=\"close without merging; the branch is kept\" class=\"btn danger\">Close</button></form>")
33893374 if templ_7745c5c3_Err != nil {
33903375 return templ_7745c5c3_Err
33913376 }
33923377 if !p.Box.HeadGone && p.Box.ReadyAction == "" {
3393- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 319, "<details class=\"d-or\"><summary class=\"mute\">or from a terminal</summary>")
3378+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 317, "<details class=\"d-or\"><summary class=\"mute\">or from a terminal</summary>")
33943379 if templ_7745c5c3_Err != nil {
33953380 return templ_7745c5c3_Err
33963381 }
@@ -3398,13 +3383,13 @@ func moreMenu(p MRPage) templ.Component {
33983383 if templ_7745c5c3_Err != nil {
33993384 return templ_7745c5c3_Err
34003385 }
3401- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 320, "</details>")
3386+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 318, "</details>")
34023387 if templ_7745c5c3_Err != nil {
34033388 return templ_7745c5c3_Err
34043389 }
34053390 }
34063391 }
3407- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 321, "</div></details>")
3392+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 319, "</div></details>")
34083393 if templ_7745c5c3_Err != nil {
34093394 return templ_7745c5c3_Err
34103395 }
@@ -3428,12 +3413,12 @@ func Compare(l Layout, p ComparePage) templ.Component {
34283413 }()
34293414 }
34303415 ctx = templ.InitializeContext(ctx)
3431- templ_7745c5c3_Var162 := templ.GetChildren(ctx)
3432- if templ_7745c5c3_Var162 == nil {
3433- templ_7745c5c3_Var162 = templ.NopComponent
3416+ templ_7745c5c3_Var161 := templ.GetChildren(ctx)
3417+ if templ_7745c5c3_Var161 == nil {
3418+ templ_7745c5c3_Var161 = templ.NopComponent
34343419 }
34353420 ctx = templ.ClearChildren(ctx)
3436- templ_7745c5c3_Var163 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
3421+ templ_7745c5c3_Var162 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
34373422 templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
34383423 templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
34393424 if !templ_7745c5c3_IsBuffer {
@@ -3445,263 +3430,263 @@ func Compare(l Layout, p ComparePage) templ.Component {
34453430 }()
34463431 }
34473432 ctx = templ.InitializeContext(ctx)
3448- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 322, "<header class=\"show mr-h\"><h1>")
3433+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 320, "<header class=\"show mr-h\"><h1>")
34493434 if templ_7745c5c3_Err != nil {
34503435 return templ_7745c5c3_Err
34513436 }
3452- var templ_7745c5c3_Var164 string
3453- templ_7745c5c3_Var164, templ_7745c5c3_Err = templ.JoinStringErrs(p.Source)
3437+ var templ_7745c5c3_Var163 string
3438+ templ_7745c5c3_Var163, templ_7745c5c3_Err = templ.JoinStringErrs(p.Source)
34543439 if templ_7745c5c3_Err != nil {
3455- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 681, Col: 17}
3440+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 678, Col: 17}
34563441 }
3457- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var164))
3442+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var163))
34583443 if templ_7745c5c3_Err != nil {
34593444 return templ_7745c5c3_Err
34603445 }
3461- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 323, " → ")
3446+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 321, " → ")
34623447 if templ_7745c5c3_Err != nil {
34633448 return templ_7745c5c3_Err
34643449 }
3465- var templ_7745c5c3_Var165 string
3466- templ_7745c5c3_Var165, templ_7745c5c3_Err = templ.JoinStringErrs(p.Target)
3450+ var templ_7745c5c3_Var164 string
3451+ templ_7745c5c3_Var164, templ_7745c5c3_Err = templ.JoinStringErrs(p.Target)
34673452 if templ_7745c5c3_Err != nil {
3468- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 681, Col: 34}
3453+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 678, Col: 34}
34693454 }
3470- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var165))
3455+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var164))
34713456 if templ_7745c5c3_Err != nil {
34723457 return templ_7745c5c3_Err
34733458 }
3474- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 324, "</h1><dl class=\"kv show-kv\"><dt>branch</dt><dd><a href=\"")
3459+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 322, "</h1><dl class=\"kv show-kv\"><dt>branch</dt><dd><a href=\"")
34753460 if templ_7745c5c3_Err != nil {
34763461 return templ_7745c5c3_Err
34773462 }
3478- var templ_7745c5c3_Var166 templ.SafeURL
3479- templ_7745c5c3_Var166, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.SourceHref))
3463+ var templ_7745c5c3_Var165 templ.SafeURL
3464+ templ_7745c5c3_Var165, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.SourceHref))
34803465 if templ_7745c5c3_Err != nil {
3481- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 684, Col: 45}
3466+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 681, Col: 45}
34823467 }
3483- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var166))
3468+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var165))
34843469 if templ_7745c5c3_Err != nil {
34853470 return templ_7745c5c3_Err
34863471 }
3487- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 325, "\">")
3472+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 323, "\">")
34883473 if templ_7745c5c3_Err != nil {
34893474 return templ_7745c5c3_Err
34903475 }
3491- var templ_7745c5c3_Var167 string
3492- templ_7745c5c3_Var167, templ_7745c5c3_Err = templ.JoinStringErrs(p.Source)
3476+ var templ_7745c5c3_Var166 string
3477+ templ_7745c5c3_Var166, templ_7745c5c3_Err = templ.JoinStringErrs(p.Source)
34933478 if templ_7745c5c3_Err != nil {
3494- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 684, Col: 58}
3479+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 681, Col: 58}
34953480 }
3496- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var167))
3481+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var166))
34973482 if templ_7745c5c3_Err != nil {
34983483 return templ_7745c5c3_Err
34993484 }
3500- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 326, "</a></dd><dt>target</dt><dd><a href=\"")
3485+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 324, "</a></dd><dt>target</dt><dd><a href=\"")
35013486 if templ_7745c5c3_Err != nil {
35023487 return templ_7745c5c3_Err
35033488 }
3504- var templ_7745c5c3_Var168 templ.SafeURL
3505- templ_7745c5c3_Var168, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.TargetHref))
3489+ var templ_7745c5c3_Var167 templ.SafeURL
3490+ templ_7745c5c3_Var167, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.TargetHref))
35063491 if templ_7745c5c3_Err != nil {
3507- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 686, Col: 45}
3492+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 683, Col: 45}
35083493 }
3509- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var168))
3494+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var167))
35103495 if templ_7745c5c3_Err != nil {
35113496 return templ_7745c5c3_Err
35123497 }
3513- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 327, "\">")
3498+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 325, "\">")
35143499 if templ_7745c5c3_Err != nil {
35153500 return templ_7745c5c3_Err
35163501 }
3517- var templ_7745c5c3_Var169 string
3518- templ_7745c5c3_Var169, templ_7745c5c3_Err = templ.JoinStringErrs(p.Target)
3502+ var templ_7745c5c3_Var168 string
3503+ templ_7745c5c3_Var168, templ_7745c5c3_Err = templ.JoinStringErrs(p.Target)
35193504 if templ_7745c5c3_Err != nil {
3520- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 686, Col: 58}
3505+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 683, Col: 58}
35213506 }
3522- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var169))
3507+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var168))
35233508 if templ_7745c5c3_Err != nil {
35243509 return templ_7745c5c3_Err
35253510 }
3526- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 328, "</a></dd><dt>ahead</dt><dd>")
3511+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 326, "</a></dd><dt>ahead</dt><dd>")
35273512 if templ_7745c5c3_Err != nil {
35283513 return templ_7745c5c3_Err
35293514 }
3530- var templ_7745c5c3_Var170 string
3531- templ_7745c5c3_Var170, templ_7745c5c3_Err = templ.JoinStringErrs(p.AheadText)
3515+ var templ_7745c5c3_Var169 string
3516+ templ_7745c5c3_Var169, templ_7745c5c3_Err = templ.JoinStringErrs(p.AheadText)
35323517 if templ_7745c5c3_Err != nil {
3533- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 688, Col: 21}
3518+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 685, Col: 21}
35343519 }
3535- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var170))
3520+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var169))
35363521 if templ_7745c5c3_Err != nil {
35373522 return templ_7745c5c3_Err
35383523 }
3539- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 329, "</dd></dl></header>")
3524+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 327, "</dd></dl></header>")
35403525 if templ_7745c5c3_Err != nil {
35413526 return templ_7745c5c3_Err
35423527 }
35433528 if p.Note != "" {
3544- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 330, "<p class=\"notice\">")
3529+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 328, "<p class=\"notice\">")
35453530 if templ_7745c5c3_Err != nil {
35463531 return templ_7745c5c3_Err
35473532 }
3548- var templ_7745c5c3_Var171 string
3549- templ_7745c5c3_Var171, templ_7745c5c3_Err = templ.JoinStringErrs(p.Note)
3533+ var templ_7745c5c3_Var170 string
3534+ templ_7745c5c3_Var170, templ_7745c5c3_Err = templ.JoinStringErrs(p.Note)
35503535 if templ_7745c5c3_Err != nil {
3551- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 692, Col: 29}
3536+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 689, Col: 29}
35523537 }
3553- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var171))
3538+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var170))
35543539 if templ_7745c5c3_Err != nil {
35553540 return templ_7745c5c3_Err
35563541 }
3557- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 331, "</p>")
3542+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 329, "</p>")
35583543 if templ_7745c5c3_Err != nil {
35593544 return templ_7745c5c3_Err
35603545 }
35613546 }
3562- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 332, " ")
3547+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 330, " ")
35633548 if templ_7745c5c3_Err != nil {
35643549 return templ_7745c5c3_Err
35653550 }
35663551 if p.Existing != nil {
3567- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 333, "<p class=\"notice\">an open merge request already covers these branches: <a href=\"")
3552+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 331, "<p class=\"notice\">an open merge request already covers these branches: <a href=\"")
35683553 if templ_7745c5c3_Err != nil {
35693554 return templ_7745c5c3_Err
35703555 }
3571- var templ_7745c5c3_Var172 templ.SafeURL
3572- templ_7745c5c3_Var172, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.Existing.Href))
3556+ var templ_7745c5c3_Var171 templ.SafeURL
3557+ templ_7745c5c3_Var171, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.Existing.Href))
35733558 if templ_7745c5c3_Err != nil {
3574- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 695, Col: 114}
3559+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 692, Col: 114}
35753560 }
3576- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var172))
3561+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var171))
35773562 if templ_7745c5c3_Err != nil {
35783563 return templ_7745c5c3_Err
35793564 }
3580- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 334, "\">")
3565+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 332, "\">")
35813566 if templ_7745c5c3_Err != nil {
35823567 return templ_7745c5c3_Err
35833568 }
3584- var templ_7745c5c3_Var173 string
3585- templ_7745c5c3_Var173, templ_7745c5c3_Err = templ.JoinStringErrs(p.Existing.Label)
3569+ var templ_7745c5c3_Var172 string
3570+ templ_7745c5c3_Var172, templ_7745c5c3_Err = templ.JoinStringErrs(p.Existing.Label)
35863571 if templ_7745c5c3_Err != nil {
3587- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 695, Col: 135}
3572+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 692, Col: 135}
35883573 }
3589- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var173))
3574+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var172))
35903575 if templ_7745c5c3_Err != nil {
35913576 return templ_7745c5c3_Err
35923577 }
3593- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 335, "</a></p>")
3578+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 333, "</a></p>")
35943579 if templ_7745c5c3_Err != nil {
35953580 return templ_7745c5c3_Err
35963581 }
35973582 }
3598- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 336, " ")
3583+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 334, " ")
35993584 if templ_7745c5c3_Err != nil {
36003585 return templ_7745c5c3_Err
36013586 }
36023587 if p.Create != nil {
3603- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 337, "<form class=\"cform create\" method=\"post\" action=\"")
3588+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 335, "<form class=\"cform create\" method=\"post\" action=\"")
36043589 if templ_7745c5c3_Err != nil {
36053590 return templ_7745c5c3_Err
36063591 }
3607- var templ_7745c5c3_Var174 templ.SafeURL
3608- templ_7745c5c3_Var174, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.Create.Action))
3592+ var templ_7745c5c3_Var173 templ.SafeURL
3593+ templ_7745c5c3_Var173, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.Create.Action))
36093594 if templ_7745c5c3_Err != nil {
3610- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 698, Col: 83}
3595+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 695, Col: 83}
36113596 }
3612- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var174))
3597+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var173))
36133598 if templ_7745c5c3_Err != nil {
36143599 return templ_7745c5c3_Err
36153600 }
3616- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 338, "\"><input type=\"hidden\" name=\"source\" value=\"")
3601+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 336, "\"><input type=\"hidden\" name=\"source\" value=\"")
36173602 if templ_7745c5c3_Err != nil {
36183603 return templ_7745c5c3_Err
36193604 }
3620- var templ_7745c5c3_Var175 string
3621- templ_7745c5c3_Var175, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.Create.Source)
3605+ var templ_7745c5c3_Var174 string
3606+ templ_7745c5c3_Var174, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.Create.Source)
36223607 if templ_7745c5c3_Err != nil {
3623- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 699, Col: 62}
3608+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 696, Col: 62}
36243609 }
3625- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var175)
3610+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var174)
36263611 if templ_7745c5c3_Err != nil {
36273612 return templ_7745c5c3_Err
36283613 }
3629- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 339, "\"> <input type=\"hidden\" name=\"target\" value=\"")
3614+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 337, "\"> <input type=\"hidden\" name=\"target\" value=\"")
36303615 if templ_7745c5c3_Err != nil {
36313616 return templ_7745c5c3_Err
36323617 }
3633- var templ_7745c5c3_Var176 string
3634- templ_7745c5c3_Var176, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.Create.Target)
3618+ var templ_7745c5c3_Var175 string
3619+ templ_7745c5c3_Var175, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.Create.Target)
36353620 if templ_7745c5c3_Err != nil {
3636- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 700, Col: 62}
3621+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 697, Col: 62}
36373622 }
3638- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var176)
3623+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var175)
36393624 if templ_7745c5c3_Err != nil {
36403625 return templ_7745c5c3_Err
36413626 }
3642- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 340, "\"> <label for=\"mr-title\">title</label> <input id=\"mr-title\" name=\"title\" type=\"text\" maxlength=\"120\" required value=\"")
3627+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 338, "\"> <label for=\"mr-title\">title</label> <input id=\"mr-title\" name=\"title\" type=\"text\" maxlength=\"120\" required value=\"")
36433628 if templ_7745c5c3_Err != nil {
36443629 return templ_7745c5c3_Err
36453630 }
3646- var templ_7745c5c3_Var177 string
3647- templ_7745c5c3_Var177, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.Create.Title)
3631+ var templ_7745c5c3_Var176 string
3632+ templ_7745c5c3_Var176, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.Create.Title)
36483633 if templ_7745c5c3_Err != nil {
3649- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 702, Col: 97}
3634+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 699, Col: 97}
36503635 }
3651- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var177)
3636+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var176)
36523637 if templ_7745c5c3_Err != nil {
36533638 return templ_7745c5c3_Err
36543639 }
3655- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 341, "\" 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>")
3640+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 339, "\" 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>")
36563641 if templ_7745c5c3_Err != nil {
36573642 return templ_7745c5c3_Err
36583643 }
36593644 }
3660- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 342, " ")
3645+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 340, " ")
36613646 if templ_7745c5c3_Err != nil {
36623647 return templ_7745c5c3_Err
36633648 }
36643649 if p.HasDiff {
3665- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 343, "<div class=\"diff-tools\" role=\"group\" aria-label=\"Diff view\"><span class=\"dim\">")
3650+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 341, "<div class=\"diff-tools\" role=\"group\" aria-label=\"Diff view\"><span class=\"dim\">")
36663651 if templ_7745c5c3_Err != nil {
36673652 return templ_7745c5c3_Err
36683653 }
3669- var templ_7745c5c3_Var178 string
3670- templ_7745c5c3_Var178, templ_7745c5c3_Err = templ.JoinStringErrs(plural(p.NFiles, "file", "files"))
3654+ var templ_7745c5c3_Var177 string
3655+ templ_7745c5c3_Var177, templ_7745c5c3_Err = templ.JoinStringErrs(plural(p.NFiles, "file", "files"))
36713656 if templ_7745c5c3_Err != nil {
3672- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 712, Col: 57}
3657+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 709, Col: 57}
36733658 }
3674- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var178))
3659+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var177))
36753660 if templ_7745c5c3_Err != nil {
36763661 return templ_7745c5c3_Err
36773662 }
3678- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 344, " · <span class=\"plus\">+")
3663+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 342, " · <span class=\"plus\">+")
36793664 if templ_7745c5c3_Err != nil {
36803665 return templ_7745c5c3_Err
36813666 }
3682- var templ_7745c5c3_Var179 string
3683- templ_7745c5c3_Var179, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(p.Adds))
3667+ var templ_7745c5c3_Var178 string
3668+ templ_7745c5c3_Var178, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(p.Adds))
36843669 if templ_7745c5c3_Err != nil {
3685- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 712, Col: 97}
3670+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 709, Col: 97}
36863671 }
3687- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var179))
3672+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var178))
36883673 if templ_7745c5c3_Err != nil {
36893674 return templ_7745c5c3_Err
36903675 }
3691- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 345, "</span> <span class=\"minus\">-")
3676+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 343, "</span> <span class=\"minus\">-")
36923677 if templ_7745c5c3_Err != nil {
36933678 return templ_7745c5c3_Err
36943679 }
3695- var templ_7745c5c3_Var180 string
3696- templ_7745c5c3_Var180, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(p.Dels))
3680+ var templ_7745c5c3_Var179 string
3681+ templ_7745c5c3_Var179, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(p.Dels))
36973682 if templ_7745c5c3_Err != nil {
3698- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 712, Col: 142}
3683+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 709, Col: 142}
36993684 }
3700- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var180))
3685+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var179))
37013686 if templ_7745c5c3_Err != nil {
37023687 return templ_7745c5c3_Err
37033688 }
3704- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 346, "</span></span> <span class=\"grow\"></span>")
3689+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 344, "</span></span> <span class=\"grow\"></span>")
37053690 if templ_7745c5c3_Err != nil {
37063691 return templ_7745c5c3_Err
37073692 }
@@ -3709,64 +3694,64 @@ func Compare(l Layout, p ComparePage) templ.Component {
37093694 if templ_7745c5c3_Err != nil {
37103695 return templ_7745c5c3_Err
37113696 }
3712- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 347, "</div>")
3697+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 345, "</div>")
37133698 if templ_7745c5c3_Err != nil {
37143699 return templ_7745c5c3_Err
37153700 }
37163701 if p.Invisible {
3717- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 348, "<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>")
3702+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 346, "<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>")
37183703 if templ_7745c5c3_Err != nil {
37193704 return templ_7745c5c3_Err
37203705 }
37213706 }
3722- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 349, " <div id=\"diffs\"")
3707+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 347, " <div id=\"diffs\"")
37233708 if templ_7745c5c3_Err != nil {
37243709 return templ_7745c5c3_Err
37253710 }
37263711 if p.Both {
3727- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 350, " data-diff=\"")
3712+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 348, " data-diff=\"")
37283713 if templ_7745c5c3_Err != nil {
37293714 return templ_7745c5c3_Err
37303715 }
3731- var templ_7745c5c3_Var181 string
3732- templ_7745c5c3_Var181, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.View)
3716+ var templ_7745c5c3_Var180 string
3717+ templ_7745c5c3_Var180, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.View)
37333718 if templ_7745c5c3_Err != nil {
3734- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 725, Col: 23}
3719+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 722, Col: 23}
37353720 }
3736- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var181)
3721+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var180)
37373722 if templ_7745c5c3_Err != nil {
37383723 return templ_7745c5c3_Err
37393724 }
3740- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 351, "\"")
3725+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 349, "\"")
37413726 if templ_7745c5c3_Err != nil {
37423727 return templ_7745c5c3_Err
37433728 }
37443729 } else {
3745- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 352, " data-view=\"")
3730+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 350, " data-view=\"")
37463731 if templ_7745c5c3_Err != nil {
37473732 return templ_7745c5c3_Err
37483733 }
3749- var templ_7745c5c3_Var182 string
3750- templ_7745c5c3_Var182, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.View)
3734+ var templ_7745c5c3_Var181 string
3735+ templ_7745c5c3_Var181, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.View)
37513736 if templ_7745c5c3_Err != nil {
3752- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 727, Col: 23}
3737+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 724, Col: 23}
37533738 }
3754- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var182)
3739+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var181)
37553740 if templ_7745c5c3_Err != nil {
37563741 return templ_7745c5c3_Err
37573742 }
3758- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 353, "\"")
3743+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 351, "\"")
37593744 if templ_7745c5c3_Err != nil {
37603745 return templ_7745c5c3_Err
37613746 }
37623747 }
37633748 if p.Both && !p.Pinned {
3764- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 354, " hx-live=\"this.dataset.diff = sessionStorage.getItem('diff') || this.dataset.diff\"")
3749+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 352, " hx-live=\"this.dataset.diff = sessionStorage.getItem('diff') || this.dataset.diff\"")
37653750 if templ_7745c5c3_Err != nil {
37663751 return templ_7745c5c3_Err
37673752 }
37683753 }
3769- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 355, ">")
3754+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 353, ">")
37703755 if templ_7745c5c3_Err != nil {
37713756 return templ_7745c5c3_Err
37723757 }
@@ -3776,14 +3761,14 @@ func Compare(l Layout, p ComparePage) templ.Component {
37763761 return templ_7745c5c3_Err
37773762 }
37783763 }
3779- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 356, "</div>")
3764+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 354, "</div>")
37803765 if templ_7745c5c3_Err != nil {
37813766 return templ_7745c5c3_Err
37823767 }
37833768 }
37843769 return nil
37853770 })
3786- templ_7745c5c3_Err = Shell(l, compareRail(p)).Render(templ.WithChildren(ctx, templ_7745c5c3_Var163), templ_7745c5c3_Buffer)
3771+ templ_7745c5c3_Err = Shell(l, compareRail(p)).Render(templ.WithChildren(ctx, templ_7745c5c3_Var162), templ_7745c5c3_Buffer)
37873772 if templ_7745c5c3_Err != nil {
37883773 return templ_7745c5c3_Err
37893774 }
@@ -3807,173 +3792,173 @@ func compareRail(p ComparePage) templ.Component {
38073792 }()
38083793 }
38093794 ctx = templ.InitializeContext(ctx)
3810- templ_7745c5c3_Var183 := templ.GetChildren(ctx)
3811- if templ_7745c5c3_Var183 == nil {
3812- templ_7745c5c3_Var183 = templ.NopComponent
3795+ templ_7745c5c3_Var182 := templ.GetChildren(ctx)
3796+ if templ_7745c5c3_Var182 == nil {
3797+ templ_7745c5c3_Var182 = templ.NopComponent
38133798 }
38143799 ctx = templ.ClearChildren(ctx)
3815- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 357, "<section aria-labelledby=\"r-ahead\"><h2 id=\"r-ahead\">Commits <span class=\"count\">")
3800+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 355, "<section aria-labelledby=\"r-ahead\"><h2 id=\"r-ahead\">Commits <span class=\"count\">")
38163801 if templ_7745c5c3_Err != nil {
38173802 return templ_7745c5c3_Err
38183803 }
3819- var templ_7745c5c3_Var184 string
3820- templ_7745c5c3_Var184, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(len(p.Ahead)))
3804+ var templ_7745c5c3_Var183 string
3805+ templ_7745c5c3_Var183, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(len(p.Ahead)))
38213806 if templ_7745c5c3_Err != nil {
3822- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 743, Col: 67}
3807+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 740, Col: 67}
38233808 }
3824- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var184))
3809+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var183))
38253810 if templ_7745c5c3_Err != nil {
38263811 return templ_7745c5c3_Err
38273812 }
3828- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 358, "</span></h2><ul class=\"pcommits\">")
3813+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 356, "</span></h2><ul class=\"pcommits\">")
38293814 if templ_7745c5c3_Err != nil {
38303815 return templ_7745c5c3_Err
38313816 }
38323817 for _, c := range p.Ahead {
3833- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 359, "<li><a href=\"")
3818+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 357, "<li><a href=\"")
38343819 if templ_7745c5c3_Err != nil {
38353820 return templ_7745c5c3_Err
38363821 }
3837- var templ_7745c5c3_Var185 templ.SafeURL
3838- templ_7745c5c3_Var185, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(c.CHref))
3822+ var templ_7745c5c3_Var184 templ.SafeURL
3823+ templ_7745c5c3_Var184, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(c.CHref))
38393824 if templ_7745c5c3_Err != nil {
3840- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 747, Col: 37}
3825+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 744, Col: 37}
38413826 }
3842- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var185))
3827+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var184))
38433828 if templ_7745c5c3_Err != nil {
38443829 return templ_7745c5c3_Err
38453830 }
3846- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 360, "\">")
3831+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 358, "\">")
38473832 if templ_7745c5c3_Err != nil {
38483833 return templ_7745c5c3_Err
38493834 }
3850- var templ_7745c5c3_Var186 string
3851- templ_7745c5c3_Var186, templ_7745c5c3_Err = templ.JoinStringErrs(c.Short)
3835+ var templ_7745c5c3_Var185 string
3836+ templ_7745c5c3_Var185, templ_7745c5c3_Err = templ.JoinStringErrs(c.Short)
38523837 if templ_7745c5c3_Err != nil {
3853- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 747, Col: 49}
3838+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 744, Col: 49}
38543839 }
3855- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var186))
3840+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var185))
38563841 if templ_7745c5c3_Err != nil {
38573842 return templ_7745c5c3_Err
38583843 }
3859- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 361, "</a> <span class=\"s\">")
3844+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 359, "</a> <span class=\"s\">")
38603845 if templ_7745c5c3_Err != nil {
38613846 return templ_7745c5c3_Err
38623847 }
3863- var templ_7745c5c3_Var187 string
3864- templ_7745c5c3_Var187, templ_7745c5c3_Err = templ.JoinStringErrs(c.Subject)
3848+ var templ_7745c5c3_Var186 string
3849+ templ_7745c5c3_Var186, templ_7745c5c3_Err = templ.JoinStringErrs(c.Subject)
38653850 if templ_7745c5c3_Err != nil {
3866- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 748, Col: 32}
3851+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 745, Col: 32}
38673852 }
3868- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var187))
3853+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var186))
38693854 if templ_7745c5c3_Err != nil {
38703855 return templ_7745c5c3_Err
38713856 }
3872- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 362, "</span> <span class=\"mute\">")
3857+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 360, "</span> <span class=\"mute\">")
38733858 if templ_7745c5c3_Err != nil {
38743859 return templ_7745c5c3_Err
38753860 }
3876- var templ_7745c5c3_Var188 string
3877- templ_7745c5c3_Var188, templ_7745c5c3_Err = templ.JoinStringErrs(c.Author)
3861+ var templ_7745c5c3_Var187 string
3862+ templ_7745c5c3_Var187, templ_7745c5c3_Err = templ.JoinStringErrs(c.Author)
38783863 if templ_7745c5c3_Err != nil {
3879- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 750, Col: 16}
3864+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 747, Col: 16}
38803865 }
3881- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var188))
3866+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var187))
38823867 if templ_7745c5c3_Err != nil {
38833868 return templ_7745c5c3_Err
38843869 }
3885- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 363, " ")
3870+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 361, " ")
38863871 if templ_7745c5c3_Err != nil {
38873872 return templ_7745c5c3_Err
38883873 }
38893874 if c.WhenAt != "" {
3890- var templ_7745c5c3_Var189 string
3891- templ_7745c5c3_Var189, templ_7745c5c3_Err = templ.JoinStringErrs(" · ")
3875+ var templ_7745c5c3_Var188 string
3876+ templ_7745c5c3_Var188, templ_7745c5c3_Err = templ.JoinStringErrs(" · ")
38923877 if templ_7745c5c3_Err != nil {
3893- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 752, Col: 15}
3878+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 749, Col: 15}
38943879 }
3895- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var189))
3880+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var188))
38963881 if templ_7745c5c3_Err != nil {
38973882 return templ_7745c5c3_Err
38983883 }
3899- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 364, "<time datetime=\"")
3884+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 362, "<time datetime=\"")
39003885 if templ_7745c5c3_Err != nil {
39013886 return templ_7745c5c3_Err
39023887 }
3903- var templ_7745c5c3_Var190 string
3904- templ_7745c5c3_Var190, templ_7745c5c3_Err = templ.ResolveAttributeValue(c.WhenAt)
3888+ var templ_7745c5c3_Var189 string
3889+ templ_7745c5c3_Var189, templ_7745c5c3_Err = templ.ResolveAttributeValue(c.WhenAt)
39053890 if templ_7745c5c3_Err != nil {
3906- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 752, Col: 42}
3891+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 749, Col: 42}
39073892 }
3908- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var190)
3893+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var189)
39093894 if templ_7745c5c3_Err != nil {
39103895 return templ_7745c5c3_Err
39113896 }
3912- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 365, "\">")
3897+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 363, "\">")
39133898 if templ_7745c5c3_Err != nil {
39143899 return templ_7745c5c3_Err
39153900 }
3916- var templ_7745c5c3_Var191 string
3917- templ_7745c5c3_Var191, templ_7745c5c3_Err = templ.JoinStringErrs(c.When)
3901+ var templ_7745c5c3_Var190 string
3902+ templ_7745c5c3_Var190, templ_7745c5c3_Err = templ.JoinStringErrs(c.When)
39183903 if templ_7745c5c3_Err != nil {
3919- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 752, Col: 53}
3904+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 749, Col: 53}
39203905 }
3921- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var191))
3906+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var190))
39223907 if templ_7745c5c3_Err != nil {
39233908 return templ_7745c5c3_Err
39243909 }
3925- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 366, "</time>")
3910+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 364, "</time>")
39263911 if templ_7745c5c3_Err != nil {
39273912 return templ_7745c5c3_Err
39283913 }
39293914 }
3930- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 367, "</span></li>")
3915+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 365, "</span></li>")
39313916 if templ_7745c5c3_Err != nil {
39323917 return templ_7745c5c3_Err
39333918 }
39343919 }
3935- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 368, "</ul>")
3920+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 366, "</ul>")
39363921 if templ_7745c5c3_Err != nil {
39373922 return templ_7745c5c3_Err
39383923 }
39393924 if len(p.Ahead) == 0 {
3940- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 369, "<p class=\"dim\">no commit ahead of ")
3925+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 367, "<p class=\"dim\">no commit ahead of ")
39413926 if templ_7745c5c3_Err != nil {
39423927 return templ_7745c5c3_Err
39433928 }
3944- var templ_7745c5c3_Var192 string
3945- templ_7745c5c3_Var192, templ_7745c5c3_Err = templ.JoinStringErrs(p.Target)
3929+ var templ_7745c5c3_Var191 string
3930+ templ_7745c5c3_Var191, templ_7745c5c3_Err = templ.JoinStringErrs(p.Target)
39463931 if templ_7745c5c3_Err != nil {
3947- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 759, Col: 47}
3932+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 756, Col: 47}
39483933 }
3949- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var192))
3934+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var191))
39503935 if templ_7745c5c3_Err != nil {
39513936 return templ_7745c5c3_Err
39523937 }
3953- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 370, ".</p>")
3938+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 368, ".</p>")
39543939 if templ_7745c5c3_Err != nil {
39553940 return templ_7745c5c3_Err
39563941 }
39573942 }
3958- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 371, "</section>")
3943+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 369, "</section>")
39593944 if templ_7745c5c3_Err != nil {
39603945 return templ_7745c5c3_Err
39613946 }
39623947 if p.HasDiff {
3963- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 372, "<section aria-labelledby=\"r-files\"><h2 id=\"r-files\">Files <span class=\"count\">")
3948+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 370, "<section aria-labelledby=\"r-files\"><h2 id=\"r-files\">Files <span class=\"count\">")
39643949 if templ_7745c5c3_Err != nil {
39653950 return templ_7745c5c3_Err
39663951 }
3967- var templ_7745c5c3_Var193 string
3968- templ_7745c5c3_Var193, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(len(p.Files)))
3952+ var templ_7745c5c3_Var192 string
3953+ templ_7745c5c3_Var192, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(len(p.Files)))
39693954 if templ_7745c5c3_Err != nil {
3970- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 764, Col: 66}
3955+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 761, Col: 66}
39713956 }
3972- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var193))
3957+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var192))
39733958 if templ_7745c5c3_Err != nil {
39743959 return templ_7745c5c3_Err
39753960 }
3976- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 373, "</span></h2>")
3961+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 371, "</span></h2>")
39773962 if templ_7745c5c3_Err != nil {
39783963 return templ_7745c5c3_Err
39793964 }
@@ -3981,12 +3966,12 @@ func compareRail(p ComparePage) templ.Component {
39813966 if templ_7745c5c3_Err != nil {
39823967 return templ_7745c5c3_Err
39833968 }
3984- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 374, "</section>")
3969+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 372, "</section>")
39853970 if templ_7745c5c3_Err != nil {
39863971 return templ_7745c5c3_Err
39873972 }
39883973 }
3989- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 375, "<section aria-labelledby=\"r-cli\"><h2 id=\"r-cli\">From a terminal</h2>")
3974+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 373, "<section aria-labelledby=\"r-cli\"><h2 id=\"r-cli\">From a terminal</h2>")
39903975 if templ_7745c5c3_Err != nil {
39913976 return templ_7745c5c3_Err
39923977 }
@@ -3994,7 +3979,61 @@ func compareRail(p ComparePage) templ.Component {
39943979 if templ_7745c5c3_Err != nil {
39953980 return templ_7745c5c3_Err
39963981 }
3997- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 376, "</section>")
3982+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 374, "</section>")
3983+ if templ_7745c5c3_Err != nil {
3984+ return templ_7745c5c3_Err
3985+ }
3986+ return nil
3987+ })
3988+}
3989+
3990+// MRMergeChecks is the part of the owner's merge form that depends on the
3991+// checks: a live update replaces it and keeps "Ignore checks" ticked.
3992+func MRMergeChecks(c ChecksSummary) templ.Component {
3993+ return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
3994+ templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
3995+ if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil {
3996+ return templ_7745c5c3_CtxErr
3997+ }
3998+ templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
3999+ if !templ_7745c5c3_IsBuffer {
4000+ defer func() {
4001+ templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer)
4002+ if templ_7745c5c3_Err == nil {
4003+ templ_7745c5c3_Err = templ_7745c5c3_BufErr
4004+ }
4005+ }()
4006+ }
4007+ ctx = templ.InitializeContext(ctx)
4008+ templ_7745c5c3_Var193 := templ.GetChildren(ctx)
4009+ if templ_7745c5c3_Var193 == nil {
4010+ templ_7745c5c3_Var193 = templ.NopComponent
4011+ }
4012+ ctx = templ.ClearChildren(ctx)
4013+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 375, "<div id=\"mr-merge-checks\" data-keep-checks>")
4014+ if templ_7745c5c3_Err != nil {
4015+ return templ_7745c5c3_Err
4016+ }
4017+ if c.Kind == "bad" || c.Kind == "running" {
4018+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 376, "<p class=\"d-note\">")
4019+ if templ_7745c5c3_Err != nil {
4020+ return templ_7745c5c3_Err
4021+ }
4022+ var templ_7745c5c3_Var194 string
4023+ templ_7745c5c3_Var194, templ_7745c5c3_Err = templ.JoinStringErrs(c.State + ": a failing or unfinished check blocks the merge.")
4024+ if templ_7745c5c3_Err != nil {
4025+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 776, Col: 84}
4026+ }
4027+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var194))
4028+ if templ_7745c5c3_Err != nil {
4029+ return templ_7745c5c3_Err
4030+ }
4031+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 377, "</p><label class=\"d-check\"><input type=\"checkbox\" name=\"ignore_checks\"> Ignore checks</label>")
4032+ if templ_7745c5c3_Err != nil {
4033+ return templ_7745c5c3_Err
4034+ }
4035+ }
4036+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 378, "</div>")
39984037 if templ_7745c5c3_Err != nil {
39994038 return templ_7745c5c3_Err
40004039 }
@@ -2805,174 +2805,159 @@ func mergeMenu(p MRPage) templ.Component {
2805 if templ_7745c5c3_Err != nil {2805 if templ_7745c5c3_Err != nil {
2806 return templ_7745c5c3_Err2806 return templ_7745c5c3_Err
2807 }2807 }
2808- if p.ChecksSum.Kind == "bad" || p.ChecksSum.Kind == "running" {2808+ templ_7745c5c3_Err = MRMergeChecks(p.ChecksSum).Render(ctx, templ_7745c5c3_Buffer)
2809- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 264, "<p class=\"d-note\">")2809+ if templ_7745c5c3_Err != nil {
2810- if templ_7745c5c3_Err != nil {2810+ return templ_7745c5c3_Err
2811- return templ_7745c5c3_Err
2812- }
2813- var templ_7745c5c3_Var134 string
2814- templ_7745c5c3_Var134, templ_7745c5c3_Err = templ.JoinStringErrs(p.ChecksSum.State + ": a failing or unfinished check blocks the merge.")
2815- if templ_7745c5c3_Err != nil {
2816- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 549, Col: 97}
2817- }
2818- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var134))
2819- if templ_7745c5c3_Err != nil {
2820- return templ_7745c5c3_Err
2821- }
2822- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 265, "</p><label class=\"d-check\"><input type=\"checkbox\" name=\"ignore_checks\"> Ignore checks</label> ")
2823- if templ_7745c5c3_Err != nil {
2824- return templ_7745c5c3_Err
2825- }
2826 }2811 }
2827 if p.Box.CanDeleteBranch {2812 if p.Box.CanDeleteBranch {
2828- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 266, "<label class=\"d-check\"><input type=\"checkbox\" name=\"delete_branch\" value=\"1\"> delete ")2813+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 264, "<label class=\"d-check\"><input type=\"checkbox\" name=\"delete_branch\" value=\"1\"> delete ")
2829 if templ_7745c5c3_Err != nil {2814 if templ_7745c5c3_Err != nil {
2830 return templ_7745c5c3_Err2815 return templ_7745c5c3_Err
2831 }2816 }
2832- var templ_7745c5c3_Var135 string2817+ var templ_7745c5c3_Var134 string
2833- templ_7745c5c3_Var135, templ_7745c5c3_Err = templ.JoinStringErrs(p.Source)2818+ templ_7745c5c3_Var134, templ_7745c5c3_Err = templ.JoinStringErrs(p.Source)
2834 if templ_7745c5c3_Err != nil {2819 if templ_7745c5c3_Err != nil {
2835- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 553, Col: 102}2820+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 550, Col: 102}
2836 }2821 }
2837- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var135))2822+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var134))
2838 if templ_7745c5c3_Err != nil {2823 if templ_7745c5c3_Err != nil {
2839 return templ_7745c5c3_Err2824 return templ_7745c5c3_Err
2840 }2825 }
2841- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 267, " after the merge <kbd aria-hidden=\"true\">D</kbd></label>")2826+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 265, " after the merge <kbd aria-hidden=\"true\">D</kbd></label>")
2842 if templ_7745c5c3_Err != nil {2827 if templ_7745c5c3_Err != nil {
2843 return templ_7745c5c3_Err2828 return templ_7745c5c3_Err
2844 }2829 }
2845 }2830 }
2846- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 268, "<div class=\"d-btns\"><button type=\"submit\" class=\"btn primary\" data-default")2831+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 266, "<div class=\"d-btns\"><button type=\"submit\" class=\"btn primary\" data-default")
2847 if templ_7745c5c3_Err != nil {2832 if templ_7745c5c3_Err != nil {
2848 return templ_7745c5c3_Err2833 return templ_7745c5c3_Err
2849 }2834 }
2850 if !p.Box.CanMerge() {2835 if !p.Box.CanMerge() {
2851- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 269, " disabled")2836+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 267, " disabled")
2852 if templ_7745c5c3_Err != nil {2837 if templ_7745c5c3_Err != nil {
2853 return templ_7745c5c3_Err2838 return templ_7745c5c3_Err
2854 }2839 }
2855 }2840 }
2856- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 270, " title=\"")2841+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 268, " title=\"")
2857 if templ_7745c5c3_Err != nil {2842 if templ_7745c5c3_Err != nil {
2858 return templ_7745c5c3_Err2843 return templ_7745c5c3_Err
2859 }2844 }
2860- var templ_7745c5c3_Var136 string2845+ var templ_7745c5c3_Var135 string
2861- templ_7745c5c3_Var136, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.Box.MergeTitle())2846+ templ_7745c5c3_Var135, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.Box.MergeTitle())
2862 if templ_7745c5c3_Err != nil {2847 if templ_7745c5c3_Err != nil {
2863- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 561, Col: 33}2848+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 558, Col: 33}
2864 }2849 }
2865- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var136)2850+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var135)
2866 if templ_7745c5c3_Err != nil {2851 if templ_7745c5c3_Err != nil {
2867 return templ_7745c5c3_Err2852 return templ_7745c5c3_Err
2868 }2853 }
2869- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 271, "\" :disabled=\"!this.form.querySelector('input[name=mode]:checked:not(:disabled)')\" :title=\"(this.form.querySelector('input[name=mode]:checked') || {}).title || ''\">Merge into ")2854+ 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 ")
2870 if templ_7745c5c3_Err != nil {2855 if templ_7745c5c3_Err != nil {
2871 return templ_7745c5c3_Err2856 return templ_7745c5c3_Err
2872 }2857 }
2873- var templ_7745c5c3_Var137 string2858+ var templ_7745c5c3_Var136 string
2874- templ_7745c5c3_Var137, templ_7745c5c3_Err = templ.JoinStringErrs(p.Target)2859+ templ_7745c5c3_Var136, templ_7745c5c3_Err = templ.JoinStringErrs(p.Target)
2875 if templ_7745c5c3_Err != nil {2860 if templ_7745c5c3_Err != nil {
2876- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 564, Col: 28}2861+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 561, Col: 28}
2877 }2862 }
2878- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var137))2863+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var136))
2879 if templ_7745c5c3_Err != nil {2864 if templ_7745c5c3_Err != nil {
2880 return templ_7745c5c3_Err2865 return templ_7745c5c3_Err
2881 }2866 }
2882- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 272, "</button></div></form>")2867+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 270, "</button></div></form>")
2883 if templ_7745c5c3_Err != nil {2868 if templ_7745c5c3_Err != nil {
2884 return templ_7745c5c3_Err2869 return templ_7745c5c3_Err
2885 }2870 }
2886 if p.Box.CanAutoMerge {2871 if p.Box.CanAutoMerge {
2887- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 273, "<form class=\"d-acts\" method=\"post\" action=\"")2872+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 271, "<form class=\"d-acts\" method=\"post\" action=\"")
2888 if templ_7745c5c3_Err != nil {2873 if templ_7745c5c3_Err != nil {
2889 return templ_7745c5c3_Err2874 return templ_7745c5c3_Err
2890 }2875 }
2891- var templ_7745c5c3_Var138 templ.SafeURL2876+ var templ_7745c5c3_Var137 templ.SafeURL
2892- templ_7745c5c3_Var138, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.Box.AutoAction))2877+ templ_7745c5c3_Var137, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.Box.AutoAction))
2893 if templ_7745c5c3_Err != nil {2878 if templ_7745c5c3_Err != nil {
2894- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 568, Col: 80}2879+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 565, Col: 80}
2895 }2880 }
2896- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var138))2881+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var137))
2897 if templ_7745c5c3_Err != nil {2882 if templ_7745c5c3_Err != nil {
2898 return templ_7745c5c3_Err2883 return templ_7745c5c3_Err
2899 }2884 }
2900- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 274, "\"><input type=\"hidden\" name=\"head_id\" value=\"")2885+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 272, "\"><input type=\"hidden\" name=\"head_id\" value=\"")
2901 if templ_7745c5c3_Err != nil {2886 if templ_7745c5c3_Err != nil {
2902 return templ_7745c5c3_Err2887 return templ_7745c5c3_Err
2903 }2888 }
2904- var templ_7745c5c3_Var139 string2889+ var templ_7745c5c3_Var138 string
2905- templ_7745c5c3_Var139, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.Box.Head)2890+ templ_7745c5c3_Var138, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.Box.Head)
2906 if templ_7745c5c3_Err != nil {2891 if templ_7745c5c3_Err != nil {
2907- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 569, Col: 60}2892+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 566, Col: 60}
2908 }2893 }
2909- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var139)2894+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var138)
2910 if templ_7745c5c3_Err != nil {2895 if templ_7745c5c3_Err != nil {
2911 return templ_7745c5c3_Err2896 return templ_7745c5c3_Err
2912 }2897 }
2913- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 275, "\"><fieldset class=\"d-modes\"><legend>Auto-merge mode</legend> ")2898+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 273, "\"><fieldset class=\"d-modes\"><legend>Auto-merge mode</legend> ")
2914 if templ_7745c5c3_Err != nil {2899 if templ_7745c5c3_Err != nil {
2915 return templ_7745c5c3_Err2900 return templ_7745c5c3_Err
2916 }2901 }
2917 for i, m := range p.Box.Modes {2902 for i, m := range p.Box.Modes {
2918- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 276, "<label><input type=\"radio\" name=\"mode\" value=\"")2903+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 274, "<label><input type=\"radio\" name=\"mode\" value=\"")
2919 if templ_7745c5c3_Err != nil {2904 if templ_7745c5c3_Err != nil {
2920 return templ_7745c5c3_Err2905 return templ_7745c5c3_Err
2921 }2906 }
2922- var templ_7745c5c3_Var140 string2907+ var templ_7745c5c3_Var139 string
2923- templ_7745c5c3_Var140, templ_7745c5c3_Err = templ.ResolveAttributeValue(m.Value)2908+ templ_7745c5c3_Var139, templ_7745c5c3_Err = templ.ResolveAttributeValue(m.Value)
2924 if templ_7745c5c3_Err != nil {2909 if templ_7745c5c3_Err != nil {
2925- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 573, Col: 62}2910+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 570, Col: 62}
2926 }2911 }
2927- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var140)2912+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var139)
2928 if templ_7745c5c3_Err != nil {2913 if templ_7745c5c3_Err != nil {
2929 return templ_7745c5c3_Err2914 return templ_7745c5c3_Err
2930 }2915 }
2931- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 277, "\"")2916+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 275, "\"")
2932 if templ_7745c5c3_Err != nil {2917 if templ_7745c5c3_Err != nil {
2933 return templ_7745c5c3_Err2918 return templ_7745c5c3_Err
2934 }2919 }
2935 if i == 0 {2920 if i == 0 {
2936- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 278, " checked")2921+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 276, " checked")
2937 if templ_7745c5c3_Err != nil {2922 if templ_7745c5c3_Err != nil {
2938 return templ_7745c5c3_Err2923 return templ_7745c5c3_Err
2939 }2924 }
2940 }2925 }
2941- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 279, "> ")2926+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 277, "> ")
2942 if templ_7745c5c3_Err != nil {2927 if templ_7745c5c3_Err != nil {
2943 return templ_7745c5c3_Err2928 return templ_7745c5c3_Err
2944 }2929 }
2945- var templ_7745c5c3_Var141 string2930+ var templ_7745c5c3_Var140 string
2946- templ_7745c5c3_Var141, templ_7745c5c3_Err = templ.JoinStringErrs(m.Label)2931+ templ_7745c5c3_Var140, templ_7745c5c3_Err = templ.JoinStringErrs(m.Label)
2947 if templ_7745c5c3_Err != nil {2932 if templ_7745c5c3_Err != nil {
2948- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 573, Col: 96}2933+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 570, Col: 96}
2949 }2934 }
2950- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var141))2935+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var140))
2951 if templ_7745c5c3_Err != nil {2936 if templ_7745c5c3_Err != nil {
2952 return templ_7745c5c3_Err2937 return templ_7745c5c3_Err
2953 }2938 }
2954- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 280, "</label>")2939+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 278, "</label>")
2955 if templ_7745c5c3_Err != nil {2940 if templ_7745c5c3_Err != nil {
2956 return templ_7745c5c3_Err2941 return templ_7745c5c3_Err
2957 }2942 }
2958 }2943 }
2959- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 281, "</fieldset><div class=\"d-btns\"><button type=\"submit\" class=\"btn\"")2944+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 279, "</fieldset><div class=\"d-btns\"><button type=\"submit\" class=\"btn\"")
2960 if templ_7745c5c3_Err != nil {2945 if templ_7745c5c3_Err != nil {
2961 return templ_7745c5c3_Err2946 return templ_7745c5c3_Err
2962 }2947 }
2963 if len(p.Box.Modes) == 0 {2948 if len(p.Box.Modes) == 0 {
2964- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 282, " disabled")2949+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 280, " disabled")
2965 if templ_7745c5c3_Err != nil {2950 if templ_7745c5c3_Err != nil {
2966 return templ_7745c5c3_Err2951 return templ_7745c5c3_Err
2967 }2952 }
2968 }2953 }
2969- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 283, " title=\"merge once the checks pass\">Merge when ready</button></div></form>")2954+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 281, " title=\"merge once the checks pass\">Merge when ready</button></div></form>")
2970 if templ_7745c5c3_Err != nil {2955 if templ_7745c5c3_Err != nil {
2971 return templ_7745c5c3_Err2956 return templ_7745c5c3_Err
2972 }2957 }
2973 }2958 }
2974 }2959 }
2975- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 284, "</div></details>")2960+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 282, "</div></details>")
2976 if templ_7745c5c3_Err != nil {2961 if templ_7745c5c3_Err != nil {
2977 return templ_7745c5c3_Err2962 return templ_7745c5c3_Err
2978 }2963 }
@@ -2998,182 +2983,182 @@ func MRMergeability(v MergeabilityView) templ.Component {
2998 }()2983 }()
2999 }2984 }
3000 ctx = templ.InitializeContext(ctx)2985 ctx = templ.InitializeContext(ctx)
3001- templ_7745c5c3_Var142 := templ.GetChildren(ctx)2986+ templ_7745c5c3_Var141 := templ.GetChildren(ctx)
3002- if templ_7745c5c3_Var142 == nil {2987+ if templ_7745c5c3_Var141 == nil {
3003- templ_7745c5c3_Var142 = templ.NopComponent2988+ templ_7745c5c3_Var141 = templ.NopComponent
3004 }2989 }
3005 ctx = templ.ClearChildren(ctx)2990 ctx = templ.ClearChildren(ctx)
3006- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 285, "<span data-mergeability data-state=\"")2991+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 283, "<span data-mergeability data-state=\"")
2992+ if templ_7745c5c3_Err != nil {
2993+ return templ_7745c5c3_Err
2994+ }
2995+ var templ_7745c5c3_Var142 string
2996+ templ_7745c5c3_Var142, templ_7745c5c3_Err = templ.ResolveAttributeValue(v.State)
2997+ if templ_7745c5c3_Err != nil {
2998+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 588, Col: 22}
2999+ }
3000+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var142)
3001+ if templ_7745c5c3_Err != nil {
3002+ return templ_7745c5c3_Err
3003+ }
3004+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 284, "\" data-ff-ok=\"")
3007 if templ_7745c5c3_Err != nil {3005 if templ_7745c5c3_Err != nil {
3008 return templ_7745c5c3_Err3006 return templ_7745c5c3_Err
3009 }3007 }
3010 var templ_7745c5c3_Var143 string3008 var templ_7745c5c3_Var143 string
3011- templ_7745c5c3_Var143, templ_7745c5c3_Err = templ.ResolveAttributeValue(v.State)3009+ templ_7745c5c3_Var143, templ_7745c5c3_Err = templ.ResolveAttributeValue(strconv.FormatBool(v.FFOk))
3012 if templ_7745c5c3_Err != nil {3010 if templ_7745c5c3_Err != nil {
3013- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 591, Col: 22}3011+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 589, Col: 41}
3014 }3012 }
3015 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var143)3013 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var143)
3016 if templ_7745c5c3_Err != nil {3014 if templ_7745c5c3_Err != nil {
3017 return templ_7745c5c3_Err3015 return templ_7745c5c3_Err
3018 }3016 }
3019- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 286, "\" data-ff-ok=\"")3017+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 285, "\" data-merge-ok=\"")
3020 if templ_7745c5c3_Err != nil {3018 if templ_7745c5c3_Err != nil {
3021 return templ_7745c5c3_Err3019 return templ_7745c5c3_Err
3022 }3020 }
3023 var templ_7745c5c3_Var144 string3021 var templ_7745c5c3_Var144 string
3024- templ_7745c5c3_Var144, templ_7745c5c3_Err = templ.ResolveAttributeValue(strconv.FormatBool(v.FFOk))3022+ templ_7745c5c3_Var144, templ_7745c5c3_Err = templ.ResolveAttributeValue(strconv.FormatBool(v.MergeOk))
3025 if templ_7745c5c3_Err != nil {3023 if templ_7745c5c3_Err != nil {
3026- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 592, Col: 41}3024+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 590, Col: 47}
3027 }3025 }
3028 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var144)3026 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var144)
3029 if templ_7745c5c3_Err != nil {3027 if templ_7745c5c3_Err != nil {
3030 return templ_7745c5c3_Err3028 return templ_7745c5c3_Err
3031 }3029 }
3032- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 287, "\" data-merge-ok=\"")3030+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 286, "\" data-ff-reason=\"")
3033 if templ_7745c5c3_Err != nil {3031 if templ_7745c5c3_Err != nil {
3034 return templ_7745c5c3_Err3032 return templ_7745c5c3_Err
3035 }3033 }
3036 var templ_7745c5c3_Var145 string3034 var templ_7745c5c3_Var145 string
3037- templ_7745c5c3_Var145, templ_7745c5c3_Err = templ.ResolveAttributeValue(strconv.FormatBool(v.MergeOk))3035+ templ_7745c5c3_Var145, templ_7745c5c3_Err = templ.ResolveAttributeValue(v.FFReason)
3038 if templ_7745c5c3_Err != nil {3036 if templ_7745c5c3_Err != nil {
3039- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 593, Col: 47}3037+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 591, Col: 29}
3040 }3038 }
3041 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var145)3039 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var145)
3042 if templ_7745c5c3_Err != nil {3040 if templ_7745c5c3_Err != nil {
3043 return templ_7745c5c3_Err3041 return templ_7745c5c3_Err
3044 }3042 }
3045- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 288, "\" data-ff-reason=\"")3043+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 287, "\" data-merge-reason=\"")
3046 if templ_7745c5c3_Err != nil {3044 if templ_7745c5c3_Err != nil {
3047 return templ_7745c5c3_Err3045 return templ_7745c5c3_Err
3048 }3046 }
3049 var templ_7745c5c3_Var146 string3047 var templ_7745c5c3_Var146 string
3050- templ_7745c5c3_Var146, templ_7745c5c3_Err = templ.ResolveAttributeValue(v.FFReason)3048+ templ_7745c5c3_Var146, templ_7745c5c3_Err = templ.ResolveAttributeValue(v.MergeReason)
3051 if templ_7745c5c3_Err != nil {3049 if templ_7745c5c3_Err != nil {
3052- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 594, Col: 29}3050+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 592, Col: 35}
3053 }3051 }
3054 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var146)3052 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var146)
3055 if templ_7745c5c3_Err != nil {3053 if templ_7745c5c3_Err != nil {
3056 return templ_7745c5c3_Err3054 return templ_7745c5c3_Err
3057 }3055 }
3058- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 289, "\" data-merge-reason=\"")3056+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 288, "\"><span class=\"badge\" data-state=\"")
3059 if templ_7745c5c3_Err != nil {3057 if templ_7745c5c3_Err != nil {
3060 return templ_7745c5c3_Err3058 return templ_7745c5c3_Err
3061 }3059 }
3062 var templ_7745c5c3_Var147 string3060 var templ_7745c5c3_Var147 string
3063- templ_7745c5c3_Var147, templ_7745c5c3_Err = templ.ResolveAttributeValue(v.MergeReason)3061+ templ_7745c5c3_Var147, templ_7745c5c3_Err = templ.ResolveAttributeValue(v.State)
3064 if templ_7745c5c3_Err != nil {3062 if templ_7745c5c3_Err != nil {
3065- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 595, Col: 35}3063+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 594, Col: 42}
3066 }3064 }
3067 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var147)3065 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var147)
3068 if templ_7745c5c3_Err != nil {3066 if templ_7745c5c3_Err != nil {
3069 return templ_7745c5c3_Err3067 return templ_7745c5c3_Err
3070 }3068 }
3071- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 290, "\"><span class=\"badge\" data-state=\"")3069+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 289, "\">")
3072 if templ_7745c5c3_Err != nil {3070 if templ_7745c5c3_Err != nil {
3073 return templ_7745c5c3_Err3071 return templ_7745c5c3_Err
3074 }3072 }
3075 var templ_7745c5c3_Var148 string3073 var templ_7745c5c3_Var148 string
3076- templ_7745c5c3_Var148, templ_7745c5c3_Err = templ.ResolveAttributeValue(v.State)3074+ templ_7745c5c3_Var148, templ_7745c5c3_Err = templ.JoinStringErrs(v.Label)
3077- if templ_7745c5c3_Err != nil {
3078- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 597, Col: 42}
3079- }
3080- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var148)
3081- if templ_7745c5c3_Err != nil {
3082- return templ_7745c5c3_Err
3083- }
3084- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 291, "\">")
3085- if templ_7745c5c3_Err != nil {
3086- return templ_7745c5c3_Err
3087- }
3088- var templ_7745c5c3_Var149 string
3089- templ_7745c5c3_Var149, templ_7745c5c3_Err = templ.JoinStringErrs(v.Label)
3090 if templ_7745c5c3_Err != nil {3075 if templ_7745c5c3_Err != nil {
3091- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 597, Col: 54}3076+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 594, Col: 54}
3092 }3077 }
3093- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var149))3078+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var148))
3094 if templ_7745c5c3_Err != nil {3079 if templ_7745c5c3_Err != nil {
3095 return templ_7745c5c3_Err3080 return templ_7745c5c3_Err
3096 }3081 }
3097- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 292, "</span> ")3082+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 290, "</span> ")
3098 if templ_7745c5c3_Err != nil {3083 if templ_7745c5c3_Err != nil {
3099 return templ_7745c5c3_Err3084 return templ_7745c5c3_Err
3100 }3085 }
3101 if v.Detail != "" {3086 if v.Detail != "" {
3102- var templ_7745c5c3_Var150 string3087+ var templ_7745c5c3_Var149 string
3103- templ_7745c5c3_Var150, templ_7745c5c3_Err = templ.JoinStringErrs(" ")3088+ templ_7745c5c3_Var149, templ_7745c5c3_Err = templ.JoinStringErrs(" ")
3104 if templ_7745c5c3_Err != nil {3089 if templ_7745c5c3_Err != nil {
3105- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 599, Col: 8}3090+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 596, Col: 8}
3106 }3091 }
3107- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var150))3092+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var149))
3108 if templ_7745c5c3_Err != nil {3093 if templ_7745c5c3_Err != nil {
3109 return templ_7745c5c3_Err3094 return templ_7745c5c3_Err
3110 }3095 }
3111- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 293, "<span class=\"dim\">")3096+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 291, "<span class=\"dim\">")
3112 if templ_7745c5c3_Err != nil {3097 if templ_7745c5c3_Err != nil {
3113 return templ_7745c5c3_Err3098 return templ_7745c5c3_Err
3114 }3099 }
3115- var templ_7745c5c3_Var151 string3100+ var templ_7745c5c3_Var150 string
3116- templ_7745c5c3_Var151, templ_7745c5c3_Err = templ.JoinStringErrs(v.Detail)3101+ templ_7745c5c3_Var150, templ_7745c5c3_Err = templ.JoinStringErrs(v.Detail)
3117 if templ_7745c5c3_Err != nil {3102 if templ_7745c5c3_Err != nil {
3118- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 599, Col: 38}3103+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 596, Col: 38}
3119 }3104 }
3120- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var151))3105+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var150))
3121 if templ_7745c5c3_Err != nil {3106 if templ_7745c5c3_Err != nil {
3122 return templ_7745c5c3_Err3107 return templ_7745c5c3_Err
3123 }3108 }
3124- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 294, "</span>")3109+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 292, "</span>")
3125 if templ_7745c5c3_Err != nil {3110 if templ_7745c5c3_Err != nil {
3126 return templ_7745c5c3_Err3111 return templ_7745c5c3_Err
3127 }3112 }
3128 }3113 }
3129- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 295, "</span> ")3114+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 293, "</span> ")
3130 if templ_7745c5c3_Err != nil {3115 if templ_7745c5c3_Err != nil {
3131 return templ_7745c5c3_Err3116 return templ_7745c5c3_Err
3132 }3117 }
3133 if len(v.Paths) > 0 {3118 if len(v.Paths) > 0 {
3134- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 296, "<ul class=\"mg-paths\" aria-label=\"conflicting files\">")3119+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 294, "<ul class=\"mg-paths\" aria-label=\"conflicting files\">")
3135 if templ_7745c5c3_Err != nil {3120 if templ_7745c5c3_Err != nil {
3136 return templ_7745c5c3_Err3121 return templ_7745c5c3_Err
3137 }3122 }
3138 for _, path := range v.Paths {3123 for _, path := range v.Paths {
3139- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 297, "<li><code>")3124+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 295, "<li><code>")
3140 if templ_7745c5c3_Err != nil {3125 if templ_7745c5c3_Err != nil {
3141 return templ_7745c5c3_Err3126 return templ_7745c5c3_Err
3142 }3127 }
3143- var templ_7745c5c3_Var152 string3128+ var templ_7745c5c3_Var151 string
3144- templ_7745c5c3_Var152, templ_7745c5c3_Err = templ.JoinStringErrs(path)3129+ templ_7745c5c3_Var151, templ_7745c5c3_Err = templ.JoinStringErrs(path)
3145 if templ_7745c5c3_Err != nil {3130 if templ_7745c5c3_Err != nil {
3146- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 605, Col: 20}3131+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 602, Col: 20}
3147 }3132 }
3148- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var152))3133+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var151))
3149 if templ_7745c5c3_Err != nil {3134 if templ_7745c5c3_Err != nil {
3150 return templ_7745c5c3_Err3135 return templ_7745c5c3_Err
3151 }3136 }
3152- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 298, "</code></li>")3137+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 296, "</code></li>")
3153 if templ_7745c5c3_Err != nil {3138 if templ_7745c5c3_Err != nil {
3154 return templ_7745c5c3_Err3139 return templ_7745c5c3_Err
3155 }3140 }
3156 }3141 }
3157- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 299, "</ul>")3142+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 297, "</ul>")
3158 if templ_7745c5c3_Err != nil {3143 if templ_7745c5c3_Err != nil {
3159 return templ_7745c5c3_Err3144 return templ_7745c5c3_Err
3160 }3145 }
3161 }3146 }
3162 if v.PathsNote != "" {3147 if v.PathsNote != "" {
3163- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 300, "<p class=\"dim\">")3148+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 298, "<p class=\"dim\">")
3164 if templ_7745c5c3_Err != nil {3149 if templ_7745c5c3_Err != nil {
3165 return templ_7745c5c3_Err3150 return templ_7745c5c3_Err
3166 }3151 }
3167- var templ_7745c5c3_Var153 string3152+ var templ_7745c5c3_Var152 string
3168- templ_7745c5c3_Var153, templ_7745c5c3_Err = templ.JoinStringErrs(v.PathsNote)3153+ templ_7745c5c3_Var152, templ_7745c5c3_Err = templ.JoinStringErrs(v.PathsNote)
3169 if templ_7745c5c3_Err != nil {3154 if templ_7745c5c3_Err != nil {
3170- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 610, Col: 30}3155+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 607, Col: 30}
3171 }3156 }
3172- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var153))3157+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var152))
3173 if templ_7745c5c3_Err != nil {3158 if templ_7745c5c3_Err != nil {
3174 return templ_7745c5c3_Err3159 return templ_7745c5c3_Err
3175 }3160 }
3176- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 301, "</p>")3161+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 299, "</p>")
3177 if templ_7745c5c3_Err != nil {3162 if templ_7745c5c3_Err != nil {
3178 return templ_7745c5c3_Err3163 return templ_7745c5c3_Err
3179 }3164 }
@@ -3200,12 +3185,12 @@ func mrMergeabilitySlot(v MergeabilityView) templ.Component {
3200 }()3185 }()
3201 }3186 }
3202 ctx = templ.InitializeContext(ctx)3187 ctx = templ.InitializeContext(ctx)
3203- templ_7745c5c3_Var154 := templ.GetChildren(ctx)3188+ templ_7745c5c3_Var153 := templ.GetChildren(ctx)
3204- if templ_7745c5c3_Var154 == nil {3189+ if templ_7745c5c3_Var153 == nil {
3205- templ_7745c5c3_Var154 = templ.NopComponent3190+ templ_7745c5c3_Var153 = templ.NopComponent
3206 }3191 }
3207 ctx = templ.ClearChildren(ctx)3192 ctx = templ.ClearChildren(ctx)
3208- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 302, "<div id=\"mr-mergeability\" class=\"live-slot\" role=\"status\" data-slot>")3193+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 300, "<div id=\"mr-mergeability\" class=\"live-slot\" role=\"status\" data-slot>")
3209 if templ_7745c5c3_Err != nil {3194 if templ_7745c5c3_Err != nil {
3210 return templ_7745c5c3_Err3195 return templ_7745c5c3_Err
3211 }3196 }
@@ -3213,7 +3198,7 @@ func mrMergeabilitySlot(v MergeabilityView) templ.Component {
3213 if templ_7745c5c3_Err != nil {3198 if templ_7745c5c3_Err != nil {
3214 return templ_7745c5c3_Err3199 return templ_7745c5c3_Err
3215 }3200 }
3216- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 303, "</div>")3201+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 301, "</div>")
3217 if templ_7745c5c3_Err != nil {3202 if templ_7745c5c3_Err != nil {
3218 return templ_7745c5c3_Err3203 return templ_7745c5c3_Err
3219 }3204 }
@@ -3238,9 +3223,9 @@ func MRMergeabilityFragment(v MergeabilityView) templ.Component {
3238 }()3223 }()
3239 }3224 }
3240 ctx = templ.InitializeContext(ctx)3225 ctx = templ.InitializeContext(ctx)
3241- templ_7745c5c3_Var155 := templ.GetChildren(ctx)3226+ templ_7745c5c3_Var154 := templ.GetChildren(ctx)
3242- if templ_7745c5c3_Var155 == nil {3227+ if templ_7745c5c3_Var154 == nil {
3243- templ_7745c5c3_Var155 = templ.NopComponent3228+ templ_7745c5c3_Var154 = templ.NopComponent
3244 }3229 }
3245 ctx = templ.ClearChildren(ctx)3230 ctx = templ.ClearChildren(ctx)
3246 templ_7745c5c3_Err = mrMergeabilitySlot(v).Render(ctx, templ_7745c5c3_Buffer)3231 templ_7745c5c3_Err = mrMergeabilitySlot(v).Render(ctx, templ_7745c5c3_Buffer)
@@ -3269,128 +3254,128 @@ func moreMenu(p MRPage) templ.Component {
3269 }()3254 }()
3270 }3255 }
3271 ctx = templ.InitializeContext(ctx)3256 ctx = templ.InitializeContext(ctx)
3272- templ_7745c5c3_Var156 := templ.GetChildren(ctx)3257+ templ_7745c5c3_Var155 := templ.GetChildren(ctx)
3273- if templ_7745c5c3_Var156 == nil {3258+ if templ_7745c5c3_Var155 == nil {
3274- templ_7745c5c3_Var156 = templ.NopComponent3259+ templ_7745c5c3_Var155 = templ.NopComponent
3275 }3260 }
3276 ctx = templ.ClearChildren(ctx)3261 ctx = templ.ClearChildren(ctx)
3277- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 304, "<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>")3262+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 302, "<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>")
3278 if templ_7745c5c3_Err != nil {3263 if templ_7745c5c3_Err != nil {
3279 return templ_7745c5c3_Err3264 return templ_7745c5c3_Err
3280 }3265 }
3281- var templ_7745c5c3_Var157 string3266+ var templ_7745c5c3_Var156 string
3282- templ_7745c5c3_Var157, templ_7745c5c3_Err = templ.JoinStringErrs(strings.Join(p.Modes, ", "))3267+ templ_7745c5c3_Var156, templ_7745c5c3_Err = templ.JoinStringErrs(strings.Join(p.Modes, ", "))
3283 if templ_7745c5c3_Err != nil {3268 if templ_7745c5c3_Err != nil {
3284- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 637, Col: 38}3269+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 634, Col: 38}
3285 }3270 }
3286- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var157))3271+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var156))
3287 if templ_7745c5c3_Err != nil {3272 if templ_7745c5c3_Err != nil {
3288 return templ_7745c5c3_Err3273 return templ_7745c5c3_Err
3289 }3274 }
3290- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 305, "</dd><dt>checks</dt><dd>")3275+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 303, "</dd><dt>checks</dt><dd>")
3291 if templ_7745c5c3_Err != nil {3276 if templ_7745c5c3_Err != nil {
3292 return templ_7745c5c3_Err3277 return templ_7745c5c3_Err
3293 }3278 }
3294 if p.ChecksBlock {3279 if p.ChecksBlock {
3295- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 306, "failing or unfinished checks block the merge")3280+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 304, "failing or unfinished checks block the merge")
3296 if templ_7745c5c3_Err != nil {3281 if templ_7745c5c3_Err != nil {
3297 return templ_7745c5c3_Err3282 return templ_7745c5c3_Err
3298 }3283 }
3299 } else {3284 } else {
3300- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 307, "do not block the merge")3285+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 305, "do not block the merge")
3301 if templ_7745c5c3_Err != nil {3286 if templ_7745c5c3_Err != nil {
3302 return templ_7745c5c3_Err3287 return templ_7745c5c3_Err
3303 }3288 }
3304 }3289 }
3305- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 308, "</dd></dl></section>")3290+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 306, "</dd></dl></section>")
3306 if templ_7745c5c3_Err != nil {3291 if templ_7745c5c3_Err != nil {
3307 return templ_7745c5c3_Err3292 return templ_7745c5c3_Err
3308 }3293 }
3309 if p.Box != nil {3294 if p.Box != nil {
3310 if p.Box.Signed {3295 if p.Box.Signed {
3311- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 309, "<p class=\"d-note\" id=\"mr-signing\">squash and merge commits are signed with ermite's own key (generated on first start). ")3296+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 307, "<p class=\"d-note\" id=\"mr-signing\">squash and merge commits are signed with ermite's own key (generated on first start). ")
3312 if templ_7745c5c3_Err != nil {3297 if templ_7745c5c3_Err != nil {
3313 return templ_7745c5c3_Err3298 return templ_7745c5c3_Err
3314 }3299 }
3315 if p.Box.Fingerprint != "" {3300 if p.Box.Fingerprint != "" {
3316- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 310, "fingerprint <code>")3301+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 308, "fingerprint <code>")
3317 if templ_7745c5c3_Err != nil {3302 if templ_7745c5c3_Err != nil {
3318 return templ_7745c5c3_Err3303 return templ_7745c5c3_Err
3319 }3304 }
3320- var templ_7745c5c3_Var158 string3305+ var templ_7745c5c3_Var157 string
3321- templ_7745c5c3_Var158, templ_7745c5c3_Err = templ.JoinStringErrs(p.Box.Fingerprint)3306+ templ_7745c5c3_Var157, templ_7745c5c3_Err = templ.JoinStringErrs(p.Box.Fingerprint)
3322 if templ_7745c5c3_Err != nil {3307 if templ_7745c5c3_Err != nil {
3323- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 653, Col: 44}3308+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 650, Col: 44}
3324 }3309 }
3325- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var158))3310+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var157))
3326 if templ_7745c5c3_Err != nil {3311 if templ_7745c5c3_Err != nil {
3327 return templ_7745c5c3_Err3312 return templ_7745c5c3_Err
3328 }3313 }
3329- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 311, "</code> ")3314+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 309, "</code> ")
3330 if templ_7745c5c3_Err != nil {3315 if templ_7745c5c3_Err != nil {
3331 return templ_7745c5c3_Err3316 return templ_7745c5c3_Err
3332 }3317 }
3333 }3318 }
3334- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 312, "<code>ermite signing-key show</code> prints it.</p>")3319+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 310, "<code>ermite signing-key show</code> prints it.</p>")
3335 if templ_7745c5c3_Err != nil {3320 if templ_7745c5c3_Err != nil {
3336 return templ_7745c5c3_Err3321 return templ_7745c5c3_Err
3337 }3322 }
3338 }3323 }
3339- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 313, " ")3324+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 311, " ")
3340 if templ_7745c5c3_Err != nil {3325 if templ_7745c5c3_Err != nil {
3341 return templ_7745c5c3_Err3326 return templ_7745c5c3_Err
3342 }3327 }
3343 if p.Box.CanMarkRead {3328 if p.Box.CanMarkRead {
3344- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 314, "<form method=\"post\" action=\"")3329+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 312, "<form method=\"post\" action=\"")
3345 if templ_7745c5c3_Err != nil {3330 if templ_7745c5c3_Err != nil {
3346 return templ_7745c5c3_Err3331 return templ_7745c5c3_Err
3347 }3332 }
3348- var templ_7745c5c3_Var159 templ.SafeURL3333+ var templ_7745c5c3_Var158 templ.SafeURL
3349- templ_7745c5c3_Var159, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.Box.ReadAction))3334+ templ_7745c5c3_Var158, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.Box.ReadAction))
3350 if templ_7745c5c3_Err != nil {3335 if templ_7745c5c3_Err != nil {
3351- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 659, Col: 65}3336+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 656, Col: 65}
3352 }3337 }
3353- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var159))3338+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var158))
3354 if templ_7745c5c3_Err != nil {3339 if templ_7745c5c3_Err != nil {
3355 return templ_7745c5c3_Err3340 return templ_7745c5c3_Err
3356 }3341 }
3357- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 315, "\"><input type=\"hidden\" name=\"head_id\" value=\"")3342+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 313, "\"><input type=\"hidden\" name=\"head_id\" value=\"")
3358 if templ_7745c5c3_Err != nil {3343 if templ_7745c5c3_Err != nil {
3359 return templ_7745c5c3_Err3344 return templ_7745c5c3_Err
3360 }3345 }
3361- var templ_7745c5c3_Var160 string3346+ var templ_7745c5c3_Var159 string
3362- templ_7745c5c3_Var160, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.Box.Head)3347+ templ_7745c5c3_Var159, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.Box.Head)
3363 if templ_7745c5c3_Err != nil {3348 if templ_7745c5c3_Err != nil {
3364- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 660, Col: 60}3349+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 657, Col: 60}
3365 }3350 }
3366- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var160)3351+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var159)
3367 if templ_7745c5c3_Err != nil {3352 if templ_7745c5c3_Err != nil {
3368 return templ_7745c5c3_Err3353 return templ_7745c5c3_Err
3369 }3354 }
3370- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 316, "\"> <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>")3355+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 314, "\"> <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>")
3371 if templ_7745c5c3_Err != nil {3356 if templ_7745c5c3_Err != nil {
3372 return templ_7745c5c3_Err3357 return templ_7745c5c3_Err
3373 }3358 }
3374 }3359 }
3375- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 317, " <form method=\"post\" action=\"")3360+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 315, " <form method=\"post\" action=\"")
3376 if templ_7745c5c3_Err != nil {3361 if templ_7745c5c3_Err != nil {
3377 return templ_7745c5c3_Err3362 return templ_7745c5c3_Err
3378 }3363 }
3379- var templ_7745c5c3_Var161 templ.SafeURL3364+ var templ_7745c5c3_Var160 templ.SafeURL
3380- templ_7745c5c3_Var161, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.Box.CloseAction))3365+ templ_7745c5c3_Var160, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.Box.CloseAction))
3381 if templ_7745c5c3_Err != nil {3366 if templ_7745c5c3_Err != nil {
3382- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 664, Col: 65}3367+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 661, Col: 65}
3383 }3368 }
3384- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var161))3369+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var160))
3385 if templ_7745c5c3_Err != nil {3370 if templ_7745c5c3_Err != nil {
3386 return templ_7745c5c3_Err3371 return templ_7745c5c3_Err
3387 }3372 }
3388- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 318, "\"><button type=\"submit\" title=\"close without merging; the branch is kept\" class=\"btn danger\">Close</button></form>")3373+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 316, "\"><button type=\"submit\" title=\"close without merging; the branch is kept\" class=\"btn danger\">Close</button></form>")
3389 if templ_7745c5c3_Err != nil {3374 if templ_7745c5c3_Err != nil {
3390 return templ_7745c5c3_Err3375 return templ_7745c5c3_Err
3391 }3376 }
3392 if !p.Box.HeadGone && p.Box.ReadyAction == "" {3377 if !p.Box.HeadGone && p.Box.ReadyAction == "" {
3393- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 319, "<details class=\"d-or\"><summary class=\"mute\">or from a terminal</summary>")3378+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 317, "<details class=\"d-or\"><summary class=\"mute\">or from a terminal</summary>")
3394 if templ_7745c5c3_Err != nil {3379 if templ_7745c5c3_Err != nil {
3395 return templ_7745c5c3_Err3380 return templ_7745c5c3_Err
3396 }3381 }
@@ -3398,13 +3383,13 @@ func moreMenu(p MRPage) templ.Component {
3398 if templ_7745c5c3_Err != nil {3383 if templ_7745c5c3_Err != nil {
3399 return templ_7745c5c3_Err3384 return templ_7745c5c3_Err
3400 }3385 }
3401- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 320, "</details>")3386+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 318, "</details>")
3402 if templ_7745c5c3_Err != nil {3387 if templ_7745c5c3_Err != nil {
3403 return templ_7745c5c3_Err3388 return templ_7745c5c3_Err
3404 }3389 }
3405 }3390 }
3406 }3391 }
3407- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 321, "</div></details>")3392+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 319, "</div></details>")
3408 if templ_7745c5c3_Err != nil {3393 if templ_7745c5c3_Err != nil {
3409 return templ_7745c5c3_Err3394 return templ_7745c5c3_Err
3410 }3395 }
@@ -3428,12 +3413,12 @@ func Compare(l Layout, p ComparePage) templ.Component {
3428 }()3413 }()
3429 }3414 }
3430 ctx = templ.InitializeContext(ctx)3415 ctx = templ.InitializeContext(ctx)
3431- templ_7745c5c3_Var162 := templ.GetChildren(ctx)3416+ templ_7745c5c3_Var161 := templ.GetChildren(ctx)
3432- if templ_7745c5c3_Var162 == nil {3417+ if templ_7745c5c3_Var161 == nil {
3433- templ_7745c5c3_Var162 = templ.NopComponent3418+ templ_7745c5c3_Var161 = templ.NopComponent
3434 }3419 }
3435 ctx = templ.ClearChildren(ctx)3420 ctx = templ.ClearChildren(ctx)
3436- templ_7745c5c3_Var163 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {3421+ templ_7745c5c3_Var162 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
3437 templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context3422 templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
3438 templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)3423 templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
3439 if !templ_7745c5c3_IsBuffer {3424 if !templ_7745c5c3_IsBuffer {
@@ -3445,263 +3430,263 @@ func Compare(l Layout, p ComparePage) templ.Component {
3445 }()3430 }()
3446 }3431 }
3447 ctx = templ.InitializeContext(ctx)3432 ctx = templ.InitializeContext(ctx)
3448- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 322, "<header class=\"show mr-h\"><h1>")3433+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 320, "<header class=\"show mr-h\"><h1>")
3449 if templ_7745c5c3_Err != nil {3434 if templ_7745c5c3_Err != nil {
3450 return templ_7745c5c3_Err3435 return templ_7745c5c3_Err
3451 }3436 }
3452- var templ_7745c5c3_Var164 string3437+ var templ_7745c5c3_Var163 string
3453- templ_7745c5c3_Var164, templ_7745c5c3_Err = templ.JoinStringErrs(p.Source)3438+ templ_7745c5c3_Var163, templ_7745c5c3_Err = templ.JoinStringErrs(p.Source)
3454 if templ_7745c5c3_Err != nil {3439 if templ_7745c5c3_Err != nil {
3455- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 681, Col: 17}3440+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 678, Col: 17}
3456 }3441 }
3457- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var164))3442+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var163))
3458 if templ_7745c5c3_Err != nil {3443 if templ_7745c5c3_Err != nil {
3459 return templ_7745c5c3_Err3444 return templ_7745c5c3_Err
3460 }3445 }
3461- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 323, " → ")3446+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 321, " → ")
3462 if templ_7745c5c3_Err != nil {3447 if templ_7745c5c3_Err != nil {
3463 return templ_7745c5c3_Err3448 return templ_7745c5c3_Err
3464 }3449 }
3465- var templ_7745c5c3_Var165 string3450+ var templ_7745c5c3_Var164 string
3466- templ_7745c5c3_Var165, templ_7745c5c3_Err = templ.JoinStringErrs(p.Target)3451+ templ_7745c5c3_Var164, templ_7745c5c3_Err = templ.JoinStringErrs(p.Target)
3467 if templ_7745c5c3_Err != nil {3452 if templ_7745c5c3_Err != nil {
3468- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 681, Col: 34}3453+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 678, Col: 34}
3469 }3454 }
3470- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var165))3455+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var164))
3471 if templ_7745c5c3_Err != nil {3456 if templ_7745c5c3_Err != nil {
3472 return templ_7745c5c3_Err3457 return templ_7745c5c3_Err
3473 }3458 }
3474- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 324, "</h1><dl class=\"kv show-kv\"><dt>branch</dt><dd><a href=\"")3459+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 322, "</h1><dl class=\"kv show-kv\"><dt>branch</dt><dd><a href=\"")
3475 if templ_7745c5c3_Err != nil {3460 if templ_7745c5c3_Err != nil {
3476 return templ_7745c5c3_Err3461 return templ_7745c5c3_Err
3477 }3462 }
3478- var templ_7745c5c3_Var166 templ.SafeURL3463+ var templ_7745c5c3_Var165 templ.SafeURL
3479- templ_7745c5c3_Var166, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.SourceHref))3464+ templ_7745c5c3_Var165, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.SourceHref))
3480 if templ_7745c5c3_Err != nil {3465 if templ_7745c5c3_Err != nil {
3481- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 684, Col: 45}3466+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 681, Col: 45}
3482 }3467 }
3483- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var166))3468+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var165))
3484 if templ_7745c5c3_Err != nil {3469 if templ_7745c5c3_Err != nil {
3485 return templ_7745c5c3_Err3470 return templ_7745c5c3_Err
3486 }3471 }
3487- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 325, "\">")3472+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 323, "\">")
3488 if templ_7745c5c3_Err != nil {3473 if templ_7745c5c3_Err != nil {
3489 return templ_7745c5c3_Err3474 return templ_7745c5c3_Err
3490 }3475 }
3491- var templ_7745c5c3_Var167 string3476+ var templ_7745c5c3_Var166 string
3492- templ_7745c5c3_Var167, templ_7745c5c3_Err = templ.JoinStringErrs(p.Source)3477+ templ_7745c5c3_Var166, templ_7745c5c3_Err = templ.JoinStringErrs(p.Source)
3493 if templ_7745c5c3_Err != nil {3478 if templ_7745c5c3_Err != nil {
3494- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 684, Col: 58}3479+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 681, Col: 58}
3495 }3480 }
3496- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var167))3481+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var166))
3497 if templ_7745c5c3_Err != nil {3482 if templ_7745c5c3_Err != nil {
3498 return templ_7745c5c3_Err3483 return templ_7745c5c3_Err
3499 }3484 }
3500- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 326, "</a></dd><dt>target</dt><dd><a href=\"")3485+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 324, "</a></dd><dt>target</dt><dd><a href=\"")
3501 if templ_7745c5c3_Err != nil {3486 if templ_7745c5c3_Err != nil {
3502 return templ_7745c5c3_Err3487 return templ_7745c5c3_Err
3503 }3488 }
3504- var templ_7745c5c3_Var168 templ.SafeURL3489+ var templ_7745c5c3_Var167 templ.SafeURL
3505- templ_7745c5c3_Var168, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.TargetHref))3490+ templ_7745c5c3_Var167, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.TargetHref))
3506 if templ_7745c5c3_Err != nil {3491 if templ_7745c5c3_Err != nil {
3507- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 686, Col: 45}3492+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 683, Col: 45}
3508 }3493 }
3509- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var168))3494+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var167))
3510 if templ_7745c5c3_Err != nil {3495 if templ_7745c5c3_Err != nil {
3511 return templ_7745c5c3_Err3496 return templ_7745c5c3_Err
3512 }3497 }
3513- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 327, "\">")3498+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 325, "\">")
3514 if templ_7745c5c3_Err != nil {3499 if templ_7745c5c3_Err != nil {
3515 return templ_7745c5c3_Err3500 return templ_7745c5c3_Err
3516 }3501 }
3517- var templ_7745c5c3_Var169 string3502+ var templ_7745c5c3_Var168 string
3518- templ_7745c5c3_Var169, templ_7745c5c3_Err = templ.JoinStringErrs(p.Target)3503+ templ_7745c5c3_Var168, templ_7745c5c3_Err = templ.JoinStringErrs(p.Target)
3519 if templ_7745c5c3_Err != nil {3504 if templ_7745c5c3_Err != nil {
3520- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 686, Col: 58}3505+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 683, Col: 58}
3521 }3506 }
3522- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var169))3507+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var168))
3523 if templ_7745c5c3_Err != nil {3508 if templ_7745c5c3_Err != nil {
3524 return templ_7745c5c3_Err3509 return templ_7745c5c3_Err
3525 }3510 }
3526- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 328, "</a></dd><dt>ahead</dt><dd>")3511+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 326, "</a></dd><dt>ahead</dt><dd>")
3527 if templ_7745c5c3_Err != nil {3512 if templ_7745c5c3_Err != nil {
3528 return templ_7745c5c3_Err3513 return templ_7745c5c3_Err
3529 }3514 }
3530- var templ_7745c5c3_Var170 string3515+ var templ_7745c5c3_Var169 string
3531- templ_7745c5c3_Var170, templ_7745c5c3_Err = templ.JoinStringErrs(p.AheadText)3516+ templ_7745c5c3_Var169, templ_7745c5c3_Err = templ.JoinStringErrs(p.AheadText)
3532 if templ_7745c5c3_Err != nil {3517 if templ_7745c5c3_Err != nil {
3533- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 688, Col: 21}3518+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 685, Col: 21}
3534 }3519 }
3535- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var170))3520+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var169))
3536 if templ_7745c5c3_Err != nil {3521 if templ_7745c5c3_Err != nil {
3537 return templ_7745c5c3_Err3522 return templ_7745c5c3_Err
3538 }3523 }
3539- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 329, "</dd></dl></header>")3524+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 327, "</dd></dl></header>")
3540 if templ_7745c5c3_Err != nil {3525 if templ_7745c5c3_Err != nil {
3541 return templ_7745c5c3_Err3526 return templ_7745c5c3_Err
3542 }3527 }
3543 if p.Note != "" {3528 if p.Note != "" {
3544- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 330, "<p class=\"notice\">")3529+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 328, "<p class=\"notice\">")
3545 if templ_7745c5c3_Err != nil {3530 if templ_7745c5c3_Err != nil {
3546 return templ_7745c5c3_Err3531 return templ_7745c5c3_Err
3547 }3532 }
3548- var templ_7745c5c3_Var171 string3533+ var templ_7745c5c3_Var170 string
3549- templ_7745c5c3_Var171, templ_7745c5c3_Err = templ.JoinStringErrs(p.Note)3534+ templ_7745c5c3_Var170, templ_7745c5c3_Err = templ.JoinStringErrs(p.Note)
3550 if templ_7745c5c3_Err != nil {3535 if templ_7745c5c3_Err != nil {
3551- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 692, Col: 29}3536+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 689, Col: 29}
3552 }3537 }
3553- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var171))3538+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var170))
3554 if templ_7745c5c3_Err != nil {3539 if templ_7745c5c3_Err != nil {
3555 return templ_7745c5c3_Err3540 return templ_7745c5c3_Err
3556 }3541 }
3557- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 331, "</p>")3542+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 329, "</p>")
3558 if templ_7745c5c3_Err != nil {3543 if templ_7745c5c3_Err != nil {
3559 return templ_7745c5c3_Err3544 return templ_7745c5c3_Err
3560 }3545 }
3561 }3546 }
3562- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 332, " ")3547+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 330, " ")
3563 if templ_7745c5c3_Err != nil {3548 if templ_7745c5c3_Err != nil {
3564 return templ_7745c5c3_Err3549 return templ_7745c5c3_Err
3565 }3550 }
3566 if p.Existing != nil {3551 if p.Existing != nil {
3567- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 333, "<p class=\"notice\">an open merge request already covers these branches: <a href=\"")3552+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 331, "<p class=\"notice\">an open merge request already covers these branches: <a href=\"")
3568 if templ_7745c5c3_Err != nil {3553 if templ_7745c5c3_Err != nil {
3569 return templ_7745c5c3_Err3554 return templ_7745c5c3_Err
3570 }3555 }
3571- var templ_7745c5c3_Var172 templ.SafeURL3556+ var templ_7745c5c3_Var171 templ.SafeURL
3572- templ_7745c5c3_Var172, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.Existing.Href))3557+ templ_7745c5c3_Var171, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.Existing.Href))
3573 if templ_7745c5c3_Err != nil {3558 if templ_7745c5c3_Err != nil {
3574- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 695, Col: 114}3559+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 692, Col: 114}
3575 }3560 }
3576- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var172))3561+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var171))
3577 if templ_7745c5c3_Err != nil {3562 if templ_7745c5c3_Err != nil {
3578 return templ_7745c5c3_Err3563 return templ_7745c5c3_Err
3579 }3564 }
3580- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 334, "\">")3565+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 332, "\">")
3581 if templ_7745c5c3_Err != nil {3566 if templ_7745c5c3_Err != nil {
3582 return templ_7745c5c3_Err3567 return templ_7745c5c3_Err
3583 }3568 }
3584- var templ_7745c5c3_Var173 string3569+ var templ_7745c5c3_Var172 string
3585- templ_7745c5c3_Var173, templ_7745c5c3_Err = templ.JoinStringErrs(p.Existing.Label)3570+ templ_7745c5c3_Var172, templ_7745c5c3_Err = templ.JoinStringErrs(p.Existing.Label)
3586 if templ_7745c5c3_Err != nil {3571 if templ_7745c5c3_Err != nil {
3587- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 695, Col: 135}3572+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 692, Col: 135}
3588 }3573 }
3589- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var173))3574+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var172))
3590 if templ_7745c5c3_Err != nil {3575 if templ_7745c5c3_Err != nil {
3591 return templ_7745c5c3_Err3576 return templ_7745c5c3_Err
3592 }3577 }
3593- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 335, "</a></p>")3578+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 333, "</a></p>")
3594 if templ_7745c5c3_Err != nil {3579 if templ_7745c5c3_Err != nil {
3595 return templ_7745c5c3_Err3580 return templ_7745c5c3_Err
3596 }3581 }
3597 }3582 }
3598- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 336, " ")3583+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 334, " ")
3599 if templ_7745c5c3_Err != nil {3584 if templ_7745c5c3_Err != nil {
3600 return templ_7745c5c3_Err3585 return templ_7745c5c3_Err
3601 }3586 }
3602 if p.Create != nil {3587 if p.Create != nil {
3603- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 337, "<form class=\"cform create\" method=\"post\" action=\"")3588+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 335, "<form class=\"cform create\" method=\"post\" action=\"")
3604 if templ_7745c5c3_Err != nil {3589 if templ_7745c5c3_Err != nil {
3605 return templ_7745c5c3_Err3590 return templ_7745c5c3_Err
3606 }3591 }
3607- var templ_7745c5c3_Var174 templ.SafeURL3592+ var templ_7745c5c3_Var173 templ.SafeURL
3608- templ_7745c5c3_Var174, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.Create.Action))3593+ templ_7745c5c3_Var173, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.Create.Action))
3609 if templ_7745c5c3_Err != nil {3594 if templ_7745c5c3_Err != nil {
3610- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 698, Col: 83}3595+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 695, Col: 83}
3611 }3596 }
3612- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var174))3597+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var173))
3613 if templ_7745c5c3_Err != nil {3598 if templ_7745c5c3_Err != nil {
3614 return templ_7745c5c3_Err3599 return templ_7745c5c3_Err
3615 }3600 }
3616- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 338, "\"><input type=\"hidden\" name=\"source\" value=\"")3601+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 336, "\"><input type=\"hidden\" name=\"source\" value=\"")
3617 if templ_7745c5c3_Err != nil {3602 if templ_7745c5c3_Err != nil {
3618 return templ_7745c5c3_Err3603 return templ_7745c5c3_Err
3619 }3604 }
3620- var templ_7745c5c3_Var175 string3605+ var templ_7745c5c3_Var174 string
3621- templ_7745c5c3_Var175, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.Create.Source)3606+ templ_7745c5c3_Var174, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.Create.Source)
3622 if templ_7745c5c3_Err != nil {3607 if templ_7745c5c3_Err != nil {
3623- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 699, Col: 62}3608+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 696, Col: 62}
3624 }3609 }
3625- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var175)3610+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var174)
3626 if templ_7745c5c3_Err != nil {3611 if templ_7745c5c3_Err != nil {
3627 return templ_7745c5c3_Err3612 return templ_7745c5c3_Err
3628 }3613 }
3629- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 339, "\"> <input type=\"hidden\" name=\"target\" value=\"")3614+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 337, "\"> <input type=\"hidden\" name=\"target\" value=\"")
3630 if templ_7745c5c3_Err != nil {3615 if templ_7745c5c3_Err != nil {
3631 return templ_7745c5c3_Err3616 return templ_7745c5c3_Err
3632 }3617 }
3633- var templ_7745c5c3_Var176 string3618+ var templ_7745c5c3_Var175 string
3634- templ_7745c5c3_Var176, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.Create.Target)3619+ templ_7745c5c3_Var175, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.Create.Target)
3635 if templ_7745c5c3_Err != nil {3620 if templ_7745c5c3_Err != nil {
3636- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 700, Col: 62}3621+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 697, Col: 62}
3637 }3622 }
3638- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var176)3623+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var175)
3639 if templ_7745c5c3_Err != nil {3624 if templ_7745c5c3_Err != nil {
3640 return templ_7745c5c3_Err3625 return templ_7745c5c3_Err
3641 }3626 }
3642- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 340, "\"> <label for=\"mr-title\">title</label> <input id=\"mr-title\" name=\"title\" type=\"text\" maxlength=\"120\" required value=\"")3627+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 338, "\"> <label for=\"mr-title\">title</label> <input id=\"mr-title\" name=\"title\" type=\"text\" maxlength=\"120\" required value=\"")
3643 if templ_7745c5c3_Err != nil {3628 if templ_7745c5c3_Err != nil {
3644 return templ_7745c5c3_Err3629 return templ_7745c5c3_Err
3645 }3630 }
3646- var templ_7745c5c3_Var177 string3631+ var templ_7745c5c3_Var176 string
3647- templ_7745c5c3_Var177, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.Create.Title)3632+ templ_7745c5c3_Var176, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.Create.Title)
3648 if templ_7745c5c3_Err != nil {3633 if templ_7745c5c3_Err != nil {
3649- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 702, Col: 97}3634+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 699, Col: 97}
3650 }3635 }
3651- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var177)3636+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var176)
3652 if templ_7745c5c3_Err != nil {3637 if templ_7745c5c3_Err != nil {
3653 return templ_7745c5c3_Err3638 return templ_7745c5c3_Err
3654 }3639 }
3655- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 341, "\" 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>")3640+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 339, "\" 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>")
3656 if templ_7745c5c3_Err != nil {3641 if templ_7745c5c3_Err != nil {
3657 return templ_7745c5c3_Err3642 return templ_7745c5c3_Err
3658 }3643 }
3659 }3644 }
3660- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 342, " ")3645+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 340, " ")
3661 if templ_7745c5c3_Err != nil {3646 if templ_7745c5c3_Err != nil {
3662 return templ_7745c5c3_Err3647 return templ_7745c5c3_Err
3663 }3648 }
3664 if p.HasDiff {3649 if p.HasDiff {
3665- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 343, "<div class=\"diff-tools\" role=\"group\" aria-label=\"Diff view\"><span class=\"dim\">")3650+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 341, "<div class=\"diff-tools\" role=\"group\" aria-label=\"Diff view\"><span class=\"dim\">")
3666 if templ_7745c5c3_Err != nil {3651 if templ_7745c5c3_Err != nil {
3667 return templ_7745c5c3_Err3652 return templ_7745c5c3_Err
3668 }3653 }
3669- var templ_7745c5c3_Var178 string3654+ var templ_7745c5c3_Var177 string
3670- templ_7745c5c3_Var178, templ_7745c5c3_Err = templ.JoinStringErrs(plural(p.NFiles, "file", "files"))3655+ templ_7745c5c3_Var177, templ_7745c5c3_Err = templ.JoinStringErrs(plural(p.NFiles, "file", "files"))
3671 if templ_7745c5c3_Err != nil {3656 if templ_7745c5c3_Err != nil {
3672- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 712, Col: 57}3657+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 709, Col: 57}
3673 }3658 }
3674- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var178))3659+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var177))
3675 if templ_7745c5c3_Err != nil {3660 if templ_7745c5c3_Err != nil {
3676 return templ_7745c5c3_Err3661 return templ_7745c5c3_Err
3677 }3662 }
3678- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 344, " · <span class=\"plus\">+")3663+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 342, " · <span class=\"plus\">+")
3679 if templ_7745c5c3_Err != nil {3664 if templ_7745c5c3_Err != nil {
3680 return templ_7745c5c3_Err3665 return templ_7745c5c3_Err
3681 }3666 }
3682- var templ_7745c5c3_Var179 string3667+ var templ_7745c5c3_Var178 string
3683- templ_7745c5c3_Var179, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(p.Adds))3668+ templ_7745c5c3_Var178, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(p.Adds))
3684 if templ_7745c5c3_Err != nil {3669 if templ_7745c5c3_Err != nil {
3685- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 712, Col: 97}3670+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 709, Col: 97}
3686 }3671 }
3687- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var179))3672+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var178))
3688 if templ_7745c5c3_Err != nil {3673 if templ_7745c5c3_Err != nil {
3689 return templ_7745c5c3_Err3674 return templ_7745c5c3_Err
3690 }3675 }
3691- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 345, "</span> <span class=\"minus\">-")3676+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 343, "</span> <span class=\"minus\">-")
3692 if templ_7745c5c3_Err != nil {3677 if templ_7745c5c3_Err != nil {
3693 return templ_7745c5c3_Err3678 return templ_7745c5c3_Err
3694 }3679 }
3695- var templ_7745c5c3_Var180 string3680+ var templ_7745c5c3_Var179 string
3696- templ_7745c5c3_Var180, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(p.Dels))3681+ templ_7745c5c3_Var179, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(p.Dels))
3697 if templ_7745c5c3_Err != nil {3682 if templ_7745c5c3_Err != nil {
3698- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 712, Col: 142}3683+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 709, Col: 142}
3699 }3684 }
3700- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var180))3685+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var179))
3701 if templ_7745c5c3_Err != nil {3686 if templ_7745c5c3_Err != nil {
3702 return templ_7745c5c3_Err3687 return templ_7745c5c3_Err
3703 }3688 }
3704- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 346, "</span></span> <span class=\"grow\"></span>")3689+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 344, "</span></span> <span class=\"grow\"></span>")
3705 if templ_7745c5c3_Err != nil {3690 if templ_7745c5c3_Err != nil {
3706 return templ_7745c5c3_Err3691 return templ_7745c5c3_Err
3707 }3692 }
@@ -3709,64 +3694,64 @@ func Compare(l Layout, p ComparePage) templ.Component {
3709 if templ_7745c5c3_Err != nil {3694 if templ_7745c5c3_Err != nil {
3710 return templ_7745c5c3_Err3695 return templ_7745c5c3_Err
3711 }3696 }
3712- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 347, "</div>")3697+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 345, "</div>")
3713 if templ_7745c5c3_Err != nil {3698 if templ_7745c5c3_Err != nil {
3714 return templ_7745c5c3_Err3699 return templ_7745c5c3_Err
3715 }3700 }
3716 if p.Invisible {3701 if p.Invisible {
3717- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 348, "<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>")3702+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 346, "<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>")
3718 if templ_7745c5c3_Err != nil {3703 if templ_7745c5c3_Err != nil {
3719 return templ_7745c5c3_Err3704 return templ_7745c5c3_Err
3720 }3705 }
3721 }3706 }
3722- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 349, " <div id=\"diffs\"")3707+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 347, " <div id=\"diffs\"")
3723 if templ_7745c5c3_Err != nil {3708 if templ_7745c5c3_Err != nil {
3724 return templ_7745c5c3_Err3709 return templ_7745c5c3_Err
3725 }3710 }
3726 if p.Both {3711 if p.Both {
3727- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 350, " data-diff=\"")3712+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 348, " data-diff=\"")
3728 if templ_7745c5c3_Err != nil {3713 if templ_7745c5c3_Err != nil {
3729 return templ_7745c5c3_Err3714 return templ_7745c5c3_Err
3730 }3715 }
3731- var templ_7745c5c3_Var181 string3716+ var templ_7745c5c3_Var180 string
3732- templ_7745c5c3_Var181, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.View)3717+ templ_7745c5c3_Var180, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.View)
3733 if templ_7745c5c3_Err != nil {3718 if templ_7745c5c3_Err != nil {
3734- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 725, Col: 23}3719+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 722, Col: 23}
3735 }3720 }
3736- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var181)3721+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var180)
3737 if templ_7745c5c3_Err != nil {3722 if templ_7745c5c3_Err != nil {
3738 return templ_7745c5c3_Err3723 return templ_7745c5c3_Err
3739 }3724 }
3740- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 351, "\"")3725+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 349, "\"")
3741 if templ_7745c5c3_Err != nil {3726 if templ_7745c5c3_Err != nil {
3742 return templ_7745c5c3_Err3727 return templ_7745c5c3_Err
3743 }3728 }
3744 } else {3729 } else {
3745- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 352, " data-view=\"")3730+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 350, " data-view=\"")
3746 if templ_7745c5c3_Err != nil {3731 if templ_7745c5c3_Err != nil {
3747 return templ_7745c5c3_Err3732 return templ_7745c5c3_Err
3748 }3733 }
3749- var templ_7745c5c3_Var182 string3734+ var templ_7745c5c3_Var181 string
3750- templ_7745c5c3_Var182, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.View)3735+ templ_7745c5c3_Var181, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.View)
3751 if templ_7745c5c3_Err != nil {3736 if templ_7745c5c3_Err != nil {
3752- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 727, Col: 23}3737+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 724, Col: 23}
3753 }3738 }
3754- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var182)3739+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var181)
3755 if templ_7745c5c3_Err != nil {3740 if templ_7745c5c3_Err != nil {
3756 return templ_7745c5c3_Err3741 return templ_7745c5c3_Err
3757 }3742 }
3758- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 353, "\"")3743+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 351, "\"")
3759 if templ_7745c5c3_Err != nil {3744 if templ_7745c5c3_Err != nil {
3760 return templ_7745c5c3_Err3745 return templ_7745c5c3_Err
3761 }3746 }
3762 }3747 }
3763 if p.Both && !p.Pinned {3748 if p.Both && !p.Pinned {
3764- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 354, " hx-live=\"this.dataset.diff = sessionStorage.getItem('diff') || this.dataset.diff\"")3749+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 352, " hx-live=\"this.dataset.diff = sessionStorage.getItem('diff') || this.dataset.diff\"")
3765 if templ_7745c5c3_Err != nil {3750 if templ_7745c5c3_Err != nil {
3766 return templ_7745c5c3_Err3751 return templ_7745c5c3_Err
3767 }3752 }
3768 }3753 }
3769- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 355, ">")3754+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 353, ">")
3770 if templ_7745c5c3_Err != nil {3755 if templ_7745c5c3_Err != nil {
3771 return templ_7745c5c3_Err3756 return templ_7745c5c3_Err
3772 }3757 }
@@ -3776,14 +3761,14 @@ func Compare(l Layout, p ComparePage) templ.Component {
3776 return templ_7745c5c3_Err3761 return templ_7745c5c3_Err
3777 }3762 }
3778 }3763 }
3779- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 356, "</div>")3764+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 354, "</div>")
3780 if templ_7745c5c3_Err != nil {3765 if templ_7745c5c3_Err != nil {
3781 return templ_7745c5c3_Err3766 return templ_7745c5c3_Err
3782 }3767 }
3783 }3768 }
3784 return nil3769 return nil
3785 })3770 })
3786- templ_7745c5c3_Err = Shell(l, compareRail(p)).Render(templ.WithChildren(ctx, templ_7745c5c3_Var163), templ_7745c5c3_Buffer)3771+ templ_7745c5c3_Err = Shell(l, compareRail(p)).Render(templ.WithChildren(ctx, templ_7745c5c3_Var162), templ_7745c5c3_Buffer)
3787 if templ_7745c5c3_Err != nil {3772 if templ_7745c5c3_Err != nil {
3788 return templ_7745c5c3_Err3773 return templ_7745c5c3_Err
3789 }3774 }
@@ -3807,173 +3792,173 @@ func compareRail(p ComparePage) templ.Component {
3807 }()3792 }()
3808 }3793 }
3809 ctx = templ.InitializeContext(ctx)3794 ctx = templ.InitializeContext(ctx)
3810- templ_7745c5c3_Var183 := templ.GetChildren(ctx)3795+ templ_7745c5c3_Var182 := templ.GetChildren(ctx)
3811- if templ_7745c5c3_Var183 == nil {3796+ if templ_7745c5c3_Var182 == nil {
3812- templ_7745c5c3_Var183 = templ.NopComponent3797+ templ_7745c5c3_Var182 = templ.NopComponent
3813 }3798 }
3814 ctx = templ.ClearChildren(ctx)3799 ctx = templ.ClearChildren(ctx)
3815- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 357, "<section aria-labelledby=\"r-ahead\"><h2 id=\"r-ahead\">Commits <span class=\"count\">")3800+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 355, "<section aria-labelledby=\"r-ahead\"><h2 id=\"r-ahead\">Commits <span class=\"count\">")
3816 if templ_7745c5c3_Err != nil {3801 if templ_7745c5c3_Err != nil {
3817 return templ_7745c5c3_Err3802 return templ_7745c5c3_Err
3818 }3803 }
3819- var templ_7745c5c3_Var184 string3804+ var templ_7745c5c3_Var183 string
3820- templ_7745c5c3_Var184, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(len(p.Ahead)))3805+ templ_7745c5c3_Var183, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(len(p.Ahead)))
3821 if templ_7745c5c3_Err != nil {3806 if templ_7745c5c3_Err != nil {
3822- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 743, Col: 67}3807+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 740, Col: 67}
3823 }3808 }
3824- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var184))3809+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var183))
3825 if templ_7745c5c3_Err != nil {3810 if templ_7745c5c3_Err != nil {
3826 return templ_7745c5c3_Err3811 return templ_7745c5c3_Err
3827 }3812 }
3828- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 358, "</span></h2><ul class=\"pcommits\">")3813+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 356, "</span></h2><ul class=\"pcommits\">")
3829 if templ_7745c5c3_Err != nil {3814 if templ_7745c5c3_Err != nil {
3830 return templ_7745c5c3_Err3815 return templ_7745c5c3_Err
3831 }3816 }
3832 for _, c := range p.Ahead {3817 for _, c := range p.Ahead {
3833- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 359, "<li><a href=\"")3818+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 357, "<li><a href=\"")
3834 if templ_7745c5c3_Err != nil {3819 if templ_7745c5c3_Err != nil {
3835 return templ_7745c5c3_Err3820 return templ_7745c5c3_Err
3836 }3821 }
3837- var templ_7745c5c3_Var185 templ.SafeURL3822+ var templ_7745c5c3_Var184 templ.SafeURL
3838- templ_7745c5c3_Var185, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(c.CHref))3823+ templ_7745c5c3_Var184, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(c.CHref))
3839 if templ_7745c5c3_Err != nil {3824 if templ_7745c5c3_Err != nil {
3840- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 747, Col: 37}3825+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 744, Col: 37}
3841 }3826 }
3842- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var185))3827+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var184))
3843 if templ_7745c5c3_Err != nil {3828 if templ_7745c5c3_Err != nil {
3844 return templ_7745c5c3_Err3829 return templ_7745c5c3_Err
3845 }3830 }
3846- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 360, "\">")3831+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 358, "\">")
3847 if templ_7745c5c3_Err != nil {3832 if templ_7745c5c3_Err != nil {
3848 return templ_7745c5c3_Err3833 return templ_7745c5c3_Err
3849 }3834 }
3850- var templ_7745c5c3_Var186 string3835+ var templ_7745c5c3_Var185 string
3851- templ_7745c5c3_Var186, templ_7745c5c3_Err = templ.JoinStringErrs(c.Short)3836+ templ_7745c5c3_Var185, templ_7745c5c3_Err = templ.JoinStringErrs(c.Short)
3852 if templ_7745c5c3_Err != nil {3837 if templ_7745c5c3_Err != nil {
3853- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 747, Col: 49}3838+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 744, Col: 49}
3854 }3839 }
3855- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var186))3840+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var185))
3856 if templ_7745c5c3_Err != nil {3841 if templ_7745c5c3_Err != nil {
3857 return templ_7745c5c3_Err3842 return templ_7745c5c3_Err
3858 }3843 }
3859- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 361, "</a> <span class=\"s\">")3844+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 359, "</a> <span class=\"s\">")
3860 if templ_7745c5c3_Err != nil {3845 if templ_7745c5c3_Err != nil {
3861 return templ_7745c5c3_Err3846 return templ_7745c5c3_Err
3862 }3847 }
3863- var templ_7745c5c3_Var187 string3848+ var templ_7745c5c3_Var186 string
3864- templ_7745c5c3_Var187, templ_7745c5c3_Err = templ.JoinStringErrs(c.Subject)3849+ templ_7745c5c3_Var186, templ_7745c5c3_Err = templ.JoinStringErrs(c.Subject)
3865 if templ_7745c5c3_Err != nil {3850 if templ_7745c5c3_Err != nil {
3866- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 748, Col: 32}3851+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 745, Col: 32}
3867 }3852 }
3868- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var187))3853+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var186))
3869 if templ_7745c5c3_Err != nil {3854 if templ_7745c5c3_Err != nil {
3870 return templ_7745c5c3_Err3855 return templ_7745c5c3_Err
3871 }3856 }
3872- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 362, "</span> <span class=\"mute\">")3857+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 360, "</span> <span class=\"mute\">")
3873 if templ_7745c5c3_Err != nil {3858 if templ_7745c5c3_Err != nil {
3874 return templ_7745c5c3_Err3859 return templ_7745c5c3_Err
3875 }3860 }
3876- var templ_7745c5c3_Var188 string3861+ var templ_7745c5c3_Var187 string
3877- templ_7745c5c3_Var188, templ_7745c5c3_Err = templ.JoinStringErrs(c.Author)3862+ templ_7745c5c3_Var187, templ_7745c5c3_Err = templ.JoinStringErrs(c.Author)
3878 if templ_7745c5c3_Err != nil {3863 if templ_7745c5c3_Err != nil {
3879- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 750, Col: 16}3864+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 747, Col: 16}
3880 }3865 }
3881- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var188))3866+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var187))
3882 if templ_7745c5c3_Err != nil {3867 if templ_7745c5c3_Err != nil {
3883 return templ_7745c5c3_Err3868 return templ_7745c5c3_Err
3884 }3869 }
3885- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 363, " ")3870+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 361, " ")
3886 if templ_7745c5c3_Err != nil {3871 if templ_7745c5c3_Err != nil {
3887 return templ_7745c5c3_Err3872 return templ_7745c5c3_Err
3888 }3873 }
3889 if c.WhenAt != "" {3874 if c.WhenAt != "" {
3890- var templ_7745c5c3_Var189 string3875+ var templ_7745c5c3_Var188 string
3891- templ_7745c5c3_Var189, templ_7745c5c3_Err = templ.JoinStringErrs(" · ")3876+ templ_7745c5c3_Var188, templ_7745c5c3_Err = templ.JoinStringErrs(" · ")
3892 if templ_7745c5c3_Err != nil {3877 if templ_7745c5c3_Err != nil {
3893- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 752, Col: 15}3878+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 749, Col: 15}
3894 }3879 }
3895- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var189))3880+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var188))
3896 if templ_7745c5c3_Err != nil {3881 if templ_7745c5c3_Err != nil {
3897 return templ_7745c5c3_Err3882 return templ_7745c5c3_Err
3898 }3883 }
3899- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 364, "<time datetime=\"")3884+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 362, "<time datetime=\"")
3900 if templ_7745c5c3_Err != nil {3885 if templ_7745c5c3_Err != nil {
3901 return templ_7745c5c3_Err3886 return templ_7745c5c3_Err
3902 }3887 }
3903- var templ_7745c5c3_Var190 string3888+ var templ_7745c5c3_Var189 string
3904- templ_7745c5c3_Var190, templ_7745c5c3_Err = templ.ResolveAttributeValue(c.WhenAt)3889+ templ_7745c5c3_Var189, templ_7745c5c3_Err = templ.ResolveAttributeValue(c.WhenAt)
3905 if templ_7745c5c3_Err != nil {3890 if templ_7745c5c3_Err != nil {
3906- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 752, Col: 42}3891+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 749, Col: 42}
3907 }3892 }
3908- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var190)3893+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var189)
3909 if templ_7745c5c3_Err != nil {3894 if templ_7745c5c3_Err != nil {
3910 return templ_7745c5c3_Err3895 return templ_7745c5c3_Err
3911 }3896 }
3912- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 365, "\">")3897+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 363, "\">")
3913 if templ_7745c5c3_Err != nil {3898 if templ_7745c5c3_Err != nil {
3914 return templ_7745c5c3_Err3899 return templ_7745c5c3_Err
3915 }3900 }
3916- var templ_7745c5c3_Var191 string3901+ var templ_7745c5c3_Var190 string
3917- templ_7745c5c3_Var191, templ_7745c5c3_Err = templ.JoinStringErrs(c.When)3902+ templ_7745c5c3_Var190, templ_7745c5c3_Err = templ.JoinStringErrs(c.When)
3918 if templ_7745c5c3_Err != nil {3903 if templ_7745c5c3_Err != nil {
3919- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 752, Col: 53}3904+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 749, Col: 53}
3920 }3905 }
3921- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var191))3906+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var190))
3922 if templ_7745c5c3_Err != nil {3907 if templ_7745c5c3_Err != nil {
3923 return templ_7745c5c3_Err3908 return templ_7745c5c3_Err
3924 }3909 }
3925- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 366, "</time>")3910+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 364, "</time>")
3926 if templ_7745c5c3_Err != nil {3911 if templ_7745c5c3_Err != nil {
3927 return templ_7745c5c3_Err3912 return templ_7745c5c3_Err
3928 }3913 }
3929 }3914 }
3930- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 367, "</span></li>")3915+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 365, "</span></li>")
3931 if templ_7745c5c3_Err != nil {3916 if templ_7745c5c3_Err != nil {
3932 return templ_7745c5c3_Err3917 return templ_7745c5c3_Err
3933 }3918 }
3934 }3919 }
3935- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 368, "</ul>")3920+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 366, "</ul>")
3936 if templ_7745c5c3_Err != nil {3921 if templ_7745c5c3_Err != nil {
3937 return templ_7745c5c3_Err3922 return templ_7745c5c3_Err
3938 }3923 }
3939 if len(p.Ahead) == 0 {3924 if len(p.Ahead) == 0 {
3940- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 369, "<p class=\"dim\">no commit ahead of ")3925+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 367, "<p class=\"dim\">no commit ahead of ")
3941 if templ_7745c5c3_Err != nil {3926 if templ_7745c5c3_Err != nil {
3942 return templ_7745c5c3_Err3927 return templ_7745c5c3_Err
3943 }3928 }
3944- var templ_7745c5c3_Var192 string3929+ var templ_7745c5c3_Var191 string
3945- templ_7745c5c3_Var192, templ_7745c5c3_Err = templ.JoinStringErrs(p.Target)3930+ templ_7745c5c3_Var191, templ_7745c5c3_Err = templ.JoinStringErrs(p.Target)
3946 if templ_7745c5c3_Err != nil {3931 if templ_7745c5c3_Err != nil {
3947- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 759, Col: 47}3932+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 756, Col: 47}
3948 }3933 }
3949- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var192))3934+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var191))
3950 if templ_7745c5c3_Err != nil {3935 if templ_7745c5c3_Err != nil {
3951 return templ_7745c5c3_Err3936 return templ_7745c5c3_Err
3952 }3937 }
3953- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 370, ".</p>")3938+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 368, ".</p>")
3954 if templ_7745c5c3_Err != nil {3939 if templ_7745c5c3_Err != nil {
3955 return templ_7745c5c3_Err3940 return templ_7745c5c3_Err
3956 }3941 }
3957 }3942 }
3958- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 371, "</section>")3943+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 369, "</section>")
3959 if templ_7745c5c3_Err != nil {3944 if templ_7745c5c3_Err != nil {
3960 return templ_7745c5c3_Err3945 return templ_7745c5c3_Err
3961 }3946 }
3962 if p.HasDiff {3947 if p.HasDiff {
3963- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 372, "<section aria-labelledby=\"r-files\"><h2 id=\"r-files\">Files <span class=\"count\">")3948+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 370, "<section aria-labelledby=\"r-files\"><h2 id=\"r-files\">Files <span class=\"count\">")
3964 if templ_7745c5c3_Err != nil {3949 if templ_7745c5c3_Err != nil {
3965 return templ_7745c5c3_Err3950 return templ_7745c5c3_Err
3966 }3951 }
3967- var templ_7745c5c3_Var193 string3952+ var templ_7745c5c3_Var192 string
3968- templ_7745c5c3_Var193, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(len(p.Files)))3953+ templ_7745c5c3_Var192, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(len(p.Files)))
3969 if templ_7745c5c3_Err != nil {3954 if templ_7745c5c3_Err != nil {
3970- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 764, Col: 66}3955+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 761, Col: 66}
3971 }3956 }
3972- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var193))3957+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var192))
3973 if templ_7745c5c3_Err != nil {3958 if templ_7745c5c3_Err != nil {
3974 return templ_7745c5c3_Err3959 return templ_7745c5c3_Err
3975 }3960 }
3976- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 373, "</span></h2>")3961+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 371, "</span></h2>")
3977 if templ_7745c5c3_Err != nil {3962 if templ_7745c5c3_Err != nil {
3978 return templ_7745c5c3_Err3963 return templ_7745c5c3_Err
3979 }3964 }
@@ -3981,12 +3966,12 @@ func compareRail(p ComparePage) templ.Component {
3981 if templ_7745c5c3_Err != nil {3966 if templ_7745c5c3_Err != nil {
3982 return templ_7745c5c3_Err3967 return templ_7745c5c3_Err
3983 }3968 }
3984- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 374, "</section>")3969+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 372, "</section>")
3985 if templ_7745c5c3_Err != nil {3970 if templ_7745c5c3_Err != nil {
3986 return templ_7745c5c3_Err3971 return templ_7745c5c3_Err
3987 }3972 }
3988 }3973 }
3989- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 375, "<section aria-labelledby=\"r-cli\"><h2 id=\"r-cli\">From a terminal</h2>")3974+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 373, "<section aria-labelledby=\"r-cli\"><h2 id=\"r-cli\">From a terminal</h2>")
3990 if templ_7745c5c3_Err != nil {3975 if templ_7745c5c3_Err != nil {
3991 return templ_7745c5c3_Err3976 return templ_7745c5c3_Err
3992 }3977 }
@@ -3994,7 +3979,61 @@ func compareRail(p ComparePage) templ.Component {
3994 if templ_7745c5c3_Err != nil {3979 if templ_7745c5c3_Err != nil {
3995 return templ_7745c5c3_Err3980 return templ_7745c5c3_Err
3996 }3981 }
3997- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 376, "</section>")3982+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 374, "</section>")
3983+ if templ_7745c5c3_Err != nil {
3984+ return templ_7745c5c3_Err
3985+ }
3986+ return nil
3987+ })
3988+}
3989+
3990+// MRMergeChecks is the part of the owner's merge form that depends on the
3991+// checks: a live update replaces it and keeps "Ignore checks" ticked.
3992+func MRMergeChecks(c ChecksSummary) templ.Component {
3993+ return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
3994+ templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
3995+ if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil {
3996+ return templ_7745c5c3_CtxErr
3997+ }
3998+ templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
3999+ if !templ_7745c5c3_IsBuffer {
4000+ defer func() {
4001+ templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer)
4002+ if templ_7745c5c3_Err == nil {
4003+ templ_7745c5c3_Err = templ_7745c5c3_BufErr
4004+ }
4005+ }()
4006+ }
4007+ ctx = templ.InitializeContext(ctx)
4008+ templ_7745c5c3_Var193 := templ.GetChildren(ctx)
4009+ if templ_7745c5c3_Var193 == nil {
4010+ templ_7745c5c3_Var193 = templ.NopComponent
4011+ }
4012+ ctx = templ.ClearChildren(ctx)
4013+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 375, "<div id=\"mr-merge-checks\" data-keep-checks>")
4014+ if templ_7745c5c3_Err != nil {
4015+ return templ_7745c5c3_Err
4016+ }
4017+ if c.Kind == "bad" || c.Kind == "running" {
4018+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 376, "<p class=\"d-note\">")
4019+ if templ_7745c5c3_Err != nil {
4020+ return templ_7745c5c3_Err
4021+ }
4022+ var templ_7745c5c3_Var194 string
4023+ templ_7745c5c3_Var194, templ_7745c5c3_Err = templ.JoinStringErrs(c.State + ": a failing or unfinished check blocks the merge.")
4024+ if templ_7745c5c3_Err != nil {
4025+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 776, Col: 84}
4026+ }
4027+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var194))
4028+ if templ_7745c5c3_Err != nil {
4029+ return templ_7745c5c3_Err
4030+ }
4031+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 377, "</p><label class=\"d-check\"><input type=\"checkbox\" name=\"ignore_checks\"> Ignore checks</label>")
4032+ if templ_7745c5c3_Err != nil {
4033+ return templ_7745c5c3_Err
4034+ }
4035+ }
4036+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 378, "</div>")
3998 if templ_7745c5c3_Err != nil {4037 if templ_7745c5c3_Err != nil {
3999 return templ_7745c5c3_Err4038 return templ_7745c5c3_Err
4000 }4039 }
M internal/adapters/web/static/js/ermite.js +7 -0
@@ -966,6 +966,13 @@ window.ermiteLive = (() => {
966966 continue;
967967 }
968968 if (old.hasAttribute('data-cursor')) el.setAttribute('data-cursor', '');
969+ // data-keep-checks: the checkboxes the user ticked stay ticked.
970+ if (old.hasAttribute('data-keep-checks')) {
971+ for (const box of old.querySelectorAll('input[type=checkbox][name]:checked')) {
972+ const same = el.querySelector(`input[type=checkbox][name="${CSS.escape(box.name)}"]`);
973+ if (same) same.checked = true;
974+ }
975+ }
969976 old.replaceWith(el);
970977 const rows = document.getElementById('repo-rows');
971978 if (rows && el.parentElement === rows && rows.dataset.sort === 'activity' &&
@@ -966,6 +966,13 @@ window.ermiteLive = (() => {
966 continue;966 continue;
967 }967 }
968 if (old.hasAttribute('data-cursor')) el.setAttribute('data-cursor', '');968 if (old.hasAttribute('data-cursor')) el.setAttribute('data-cursor', '');
969+ // data-keep-checks: the checkboxes the user ticked stay ticked.
970+ if (old.hasAttribute('data-keep-checks')) {
971+ for (const box of old.querySelectorAll('input[type=checkbox][name]:checked')) {
972+ const same = el.querySelector(`input[type=checkbox][name="${CSS.escape(box.name)}"]`);
973+ if (same) same.checked = true;
974+ }
975+ }
969 old.replaceWith(el);976 old.replaceWith(el);
970 const rows = document.getElementById('repo-rows');977 const rows = document.getElementById('repo-rows');
971 if (rows && el.parentElement === rows && rows.dataset.sort === 'activity' &&978 if (rows && el.parentElement === rows && rows.dataset.sort === 'activity' &&
M internal/adapters/web/summary_actions_test.go +52 -0
@@ -4,6 +4,7 @@ package web
44
55 import (
66 "bytes"
7+ "context"
78 "errors"
89 "strings"
910 "testing"
@@ -125,3 +126,54 @@ func TestRunUpdatedOnSummaryWhenCIIsNotReadable(t *testing.T) {
125126 assert.Contains(t, got[0].html, "hidden", "the block empties and hides, no run leaks")
126127 assert.NotContains(t, got[0].html, "rr-name")
127128 }
129+
130+func TestMRChecksLiveMergeControls(t *testing.T) {
131+ t.Parallel()
132+ repo := repoName(t, "proj")
133+ head := strings.Repeat("a", domain.ObjectIDLen)
134+ for _, kind := range []string{"bad", "running", "ok", ""} {
135+ t.Run(kind, func(t *testing.T) {
136+ runs := mocks.NewRunService(t)
137+ var checks []ports.CheckView
138+ if kind != "" {
139+ check := domain.CICheck{Name: "ci", Status: domain.CICompleted, Conclusion: domain.CISuccess}
140+ if kind == "bad" {
141+ check.Conclusion = domain.CIFailure
142+ }
143+ if kind == "running" {
144+ check.Status, check.Conclusion = domain.CIQueued, ""
145+ }
146+ checks = []ports.CheckView{{CICheck: check}}
147+ }
148+ runs.EXPECT().ListChecks(mock.Anything, mock.Anything, repo, head).Return(ports.ChecksResult{Checks: checks}, nil)
149+ srv := newTestServer(t, Config{Repos: reposServing(t, publicRepo(t, "proj")), Browse: mocks.NewBrowseService(t), Runs: runs})
150+
151+ // A visitor's stream never carries the owner's merge form.
152+ visitor, err := (&liveStream{s: srv, repo: "proj", head: head, view: "mr"}).mrChecks(t.Context())
153+ require.NoError(t, err)
154+ require.Len(t, visitor, 2)
155+ for _, f := range visitor {
156+ assert.NotContains(t, f.html, `mr-merge-checks`)
157+ }
158+
159+ owner := context.WithValue(t.Context(), signedInKey{}, struct{}{})
160+ ls := &liveStream{s: srv, repo: "proj", head: head, view: "mr"}
161+ got, err := ls.mrChecks(owner)
162+ require.NoError(t, err)
163+ require.Len(t, got, 3)
164+ assert.Contains(t, got[2].html, `data-keep-checks`, "a swap keeps the ticked box")
165+ assert.Equal(t, "ci-run", got[2].event)
166+ assert.Contains(t, got[2].html, `id="mr-merge-checks"`)
167+ assert.Equal(t, renderToString(t, MRMergeChecks(checksSummary(repo, head, checks))), got[2].html)
168+ if kind == "bad" || kind == "running" {
169+ assert.Contains(t, got[2].html, `name="ignore_checks"`)
170+ } else {
171+ assert.NotContains(t, got[2].html, `name="ignore_checks"`)
172+ }
173+ // An unrelated job event with identical checks must not reset the checkbox.
174+ got, err = ls.mrChecks(owner)
175+ require.NoError(t, err)
176+ require.Len(t, got, 2)
177+ })
178+ }
179+}
@@ -4,6 +4,7 @@ package web
4 4
5 import (5 import (
6 "bytes"6 "bytes"
7+ "context"
7 "errors"8 "errors"
8 "strings"9 "strings"
9 "testing"10 "testing"
@@ -125,3 +126,54 @@ func TestRunUpdatedOnSummaryWhenCIIsNotReadable(t *testing.T) {
125 assert.Contains(t, got[0].html, "hidden", "the block empties and hides, no run leaks")126 assert.Contains(t, got[0].html, "hidden", "the block empties and hides, no run leaks")
126 assert.NotContains(t, got[0].html, "rr-name")127 assert.NotContains(t, got[0].html, "rr-name")
127 }128 }
129+
130+func TestMRChecksLiveMergeControls(t *testing.T) {
131+ t.Parallel()
132+ repo := repoName(t, "proj")
133+ head := strings.Repeat("a", domain.ObjectIDLen)
134+ for _, kind := range []string{"bad", "running", "ok", ""} {
135+ t.Run(kind, func(t *testing.T) {
136+ runs := mocks.NewRunService(t)
137+ var checks []ports.CheckView
138+ if kind != "" {
139+ check := domain.CICheck{Name: "ci", Status: domain.CICompleted, Conclusion: domain.CISuccess}
140+ if kind == "bad" {
141+ check.Conclusion = domain.CIFailure
142+ }
143+ if kind == "running" {
144+ check.Status, check.Conclusion = domain.CIQueued, ""
145+ }
146+ checks = []ports.CheckView{{CICheck: check}}
147+ }
148+ runs.EXPECT().ListChecks(mock.Anything, mock.Anything, repo, head).Return(ports.ChecksResult{Checks: checks}, nil)
149+ srv := newTestServer(t, Config{Repos: reposServing(t, publicRepo(t, "proj")), Browse: mocks.NewBrowseService(t), Runs: runs})
150+
151+ // A visitor's stream never carries the owner's merge form.
152+ visitor, err := (&liveStream{s: srv, repo: "proj", head: head, view: "mr"}).mrChecks(t.Context())
153+ require.NoError(t, err)
154+ require.Len(t, visitor, 2)
155+ for _, f := range visitor {
156+ assert.NotContains(t, f.html, `mr-merge-checks`)
157+ }
158+
159+ owner := context.WithValue(t.Context(), signedInKey{}, struct{}{})
160+ ls := &liveStream{s: srv, repo: "proj", head: head, view: "mr"}
161+ got, err := ls.mrChecks(owner)
162+ require.NoError(t, err)
163+ require.Len(t, got, 3)
164+ assert.Contains(t, got[2].html, `data-keep-checks`, "a swap keeps the ticked box")
165+ assert.Equal(t, "ci-run", got[2].event)
166+ assert.Contains(t, got[2].html, `id="mr-merge-checks"`)
167+ assert.Equal(t, renderToString(t, MRMergeChecks(checksSummary(repo, head, checks))), got[2].html)
168+ if kind == "bad" || kind == "running" {
169+ assert.Contains(t, got[2].html, `name="ignore_checks"`)
170+ } else {
171+ assert.NotContains(t, got[2].html, `name="ignore_checks"`)
172+ }
173+ // An unrelated job event with identical checks must not reset the checkbox.
174+ got, err = ls.mrChecks(owner)
175+ require.NoError(t, err)
176+ require.Len(t, got, 2)
177+ })
178+ }
179+}
M internal/usecase/mergerequests.go +3 -2
@@ -995,8 +995,9 @@ func (m *MergeRequests) MarkRead(ctx context.Context, p domain.Principal, name d
995995 // allowed by the settings of the repository, the source branch no longer
996996 // points to the head ("branch moved, read again") or is gone, the target is
997997 // gone, the mode's own condition does not hold (see below), or the branch
998-// brings nothing. Checks come with CI (CI-1): there are none yet, so the
999-// setting that lets failing checks block the merge has nothing to act on.
998+// brings nothing. Checks on the head must pass: none may be failed, queued
999+// or running; a head with no checks may be merged. params.IgnoreChecks bypasses
1000+// this requirement and needs mr:force-merge.
10001001 //
10011002 // The conditions are always checked with Git, under the lock, never from the
10021003 // stored mergeability. A fast-forward needs the target to be an ancestor of
@@ -995,8 +995,9 @@ func (m *MergeRequests) MarkRead(ctx context.Context, p domain.Principal, name d
995 // allowed by the settings of the repository, the source branch no longer995 // allowed by the settings of the repository, the source branch no longer
996 // points to the head ("branch moved, read again") or is gone, the target is996 // points to the head ("branch moved, read again") or is gone, the target is
997 // gone, the mode's own condition does not hold (see below), or the branch997 // gone, the mode's own condition does not hold (see below), or the branch
998-// brings nothing. Checks come with CI (CI-1): there are none yet, so the998+// brings nothing. Checks on the head must pass: none may be failed, queued
999-// setting that lets failing checks block the merge has nothing to act on.999+// or running; a head with no checks may be merged. params.IgnoreChecks bypasses
1000+// this requirement and needs mr:force-merge.
1000 //1001 //
1001 // The conditions are always checked with Git, under the lock, never from the1002 // The conditions are always checked with Git, under the lock, never from the
1002 // stored mergeability. A fast-forward needs the target to be an ancestor of1003 // stored mergeability. A fast-forward needs the target to be an ancestor of

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 42

↑↓ moveenter openesc close