fix(ci): bound the summaries a page reads and stop reading the run on live job updates
- commit
- 3bc6931d1790eb7bae68fe26f6f4676f9c6d259a
- author
- brice · · 2026-10-13 12:58 UTC
- parent
- 19fda0c
- signature
- GPG Verified
CD88F9E564E0102646FB6077A1A07C7C7C3E349D· arch-gpg Verified for the committer email
17 files · +734 -411
M internal/adapters/cisummaries/cisummaries.go +55 -2
| @@ -13,6 +13,7 @@ import ( | |||
| 13 | 13 | "context" | |
| 14 | 14 | "errors" | |
| 15 | 15 | "fmt" | |
| 16 | + | "io" | |
| 16 | 17 | "io/fs" | |
| 17 | 18 | "os" | |
| 18 | 19 | "path/filepath" | |
| @@ -89,7 +90,7 @@ func (s *Store) Put(_ context.Context, ref ports.CILogRef, step int32, markdown | |||
| 89 | 90 | } | |
| 90 | 91 | ||
| 91 | 92 | // List returns the summaries of the steps that have one, by step number. | |
| 92 | - | func (s *Store) List(_ context.Context, ref ports.CILogRef, limit int) ([]domain.CIStepSummary, bool, error) { | |
| 93 | + | func (s *Store) List(_ context.Context, ref ports.CILogRef, limit int, maxBytes int64) ([]domain.CIStepSummary, bool, error) { | |
| 93 | 94 | if !validRef(ref) { | |
| 94 | 95 | return nil, false, nil | |
| 95 | 96 | } | |
| @@ -118,19 +119,71 @@ func (s *Store) List(_ context.Context, ref ports.CILogRef, limit int) ([]domain | |||
| 118 | 119 | steps = steps[:limit] | |
| 119 | 120 | } | |
| 120 | 121 | out := make([]domain.CIStepSummary, 0, len(steps)) | |
| 122 | + | var read int64 | |
| 123 | + | exhausted := false | |
| 121 | 124 | for _, n := range steps { | |
| 122 | - | b, err := os.ReadFile(s.path(ref, n)) | |
| 125 | + | if exhausted { | |
| 126 | + | out = append(out, domain.CIStepSummary{Step: n, Omitted: true}) | |
| 127 | + | continue | |
| 128 | + | } | |
| 129 | + | if maxBytes > 0 { | |
| 130 | + | // Size the file first: a summary that does not fit is not read. | |
| 131 | + | info, err := os.Stat(s.path(ref, n)) | |
| 132 | + | if errors.Is(err, fs.ErrNotExist) { | |
| 133 | + | continue // removed meanwhile | |
| 134 | + | } | |
| 135 | + | if err != nil { | |
| 136 | + | return nil, false, fmt.Errorf("stat summary: %w", err) | |
| 137 | + | } | |
| 138 | + | if read+info.Size() > maxBytes { | |
| 139 | + | exhausted = true | |
| 140 | + | out = append(out, domain.CIStepSummary{Step: n, Omitted: true}) | |
| 141 | + | continue | |
| 142 | + | } | |
| 143 | + | } | |
| 144 | + | b, err := readCapped(s.path(ref, n), maxBytes, read) | |
| 123 | 145 | if errors.Is(err, fs.ErrNotExist) { | |
| 124 | 146 | continue // removed meanwhile | |
| 125 | 147 | } | |
| 148 | + | if errors.Is(err, errOverBudget) { | |
| 149 | + | exhausted = true // replaced by a larger file since the stat | |
| 150 | + | out = append(out, domain.CIStepSummary{Step: n, Omitted: true}) | |
| 151 | + | continue | |
| 152 | + | } | |
| 126 | 153 | if err != nil { | |
| 127 | 154 | return nil, false, fmt.Errorf("read summary: %w", err) | |
| 128 | 155 | } | |
| 156 | + | read += int64(len(b)) | |
| 129 | 157 | out = append(out, domain.CIStepSummary{Step: n, Markdown: string(b)}) | |
| 130 | 158 | } | |
| 131 | 159 | return out, more, nil | |
| 132 | 160 | } | |
| 133 | 161 | ||
| 162 | + | var errOverBudget = errors.New("over budget") | |
| 163 | + | ||
| 164 | + | // readCapped reads a file, at most what is left of maxBytes after read bytes | |
| 165 | + | // (no cap when maxBytes is 0): a file that is longer than that, because it grew | |
| 166 | + | // since it was sized, is errOverBudget and its content is dropped. | |
| 167 | + | func readCapped(path string, maxBytes, read int64) ([]byte, error) { | |
| 168 | + | f, err := os.Open(path) | |
| 169 | + | if err != nil { | |
| 170 | + | return nil, err | |
| 171 | + | } | |
| 172 | + | defer func() { _ = f.Close() }() | |
| 173 | + | if maxBytes <= 0 { | |
| 174 | + | return io.ReadAll(f) | |
| 175 | + | } | |
| 176 | + | left := maxBytes - read | |
| 177 | + | b, err := io.ReadAll(io.LimitReader(f, left+1)) | |
| 178 | + | if err != nil { | |
| 179 | + | return nil, err | |
| 180 | + | } | |
| 181 | + | if int64(len(b)) > left { | |
| 182 | + | return nil, errOverBudget | |
| 183 | + | } | |
| 184 | + | return b, nil | |
| 185 | + | } | |
| 186 | + | ||
| 134 | 187 | // RemoveJob deletes the summaries of one execution of a job. | |
| 135 | 188 | func (s *Store) RemoveJob(_ context.Context, ref ports.CILogRef) error { | |
| 136 | 189 | if !validRef(ref) { | |
| @@ -13,6 +13,7 @@ import ( | |||||
| 13 | "context" | 13 | "context" | ||
| 14 | "errors" | 14 | "errors" | ||
| 15 | "fmt" | 15 | "fmt" | ||
| 16 | + | "io" | |||
| 16 | "io/fs" | 17 | "io/fs" | ||
| 17 | "os" | 18 | "os" | ||
| 18 | "path/filepath" | 19 | "path/filepath" | ||
| @@ -89,7 +90,7 @@ func (s *Store) Put(_ context.Context, ref ports.CILogRef, step int32, markdown | |||||
| 89 | } | 90 | } | ||
| 90 | 91 | ||||
| 91 | // List returns the summaries of the steps that have one, by step number. | 92 | // List returns the summaries of the steps that have one, by step number. | ||
| 92 | - | func (s *Store) List(_ context.Context, ref ports.CILogRef, limit int) ([]domain.CIStepSummary, bool, error) { | 93 | + | func (s *Store) List(_ context.Context, ref ports.CILogRef, limit int, maxBytes int64) ([]domain.CIStepSummary, bool, error) { |
| 93 | if !validRef(ref) { | 94 | if !validRef(ref) { | ||
| 94 | return nil, false, nil | 95 | return nil, false, nil | ||
| 95 | } | 96 | } | ||
| @@ -118,19 +119,71 @@ func (s *Store) List(_ context.Context, ref ports.CILogRef, limit int) ([]domain | |||||
| 118 | steps = steps[:limit] | 119 | steps = steps[:limit] | ||
| 119 | } | 120 | } | ||
| 120 | out := make([]domain.CIStepSummary, 0, len(steps)) | 121 | out := make([]domain.CIStepSummary, 0, len(steps)) | ||
| 122 | + | var read int64 | |||
| 123 | + | exhausted := false | |||
| 121 | for _, n := range steps { | 124 | for _, n := range steps { | ||
| 122 | - | b, err := os.ReadFile(s.path(ref, n)) | 125 | + | if exhausted { |
| 126 | + | out = append(out, domain.CIStepSummary{Step: n, Omitted: true}) | |||
| 127 | + | continue | |||
| 128 | + | } | |||
| 129 | + | if maxBytes > 0 { | |||
| 130 | + | // Size the file first: a summary that does not fit is not read. | |||
| 131 | + | info, err := os.Stat(s.path(ref, n)) | |||
| 132 | + | if errors.Is(err, fs.ErrNotExist) { | |||
| 133 | + | continue // removed meanwhile | |||
| 134 | + | } | |||
| 135 | + | if err != nil { | |||
| 136 | + | return nil, false, fmt.Errorf("stat summary: %w", err) | |||
| 137 | + | } | |||
| 138 | + | if read+info.Size() > maxBytes { | |||
| 139 | + | exhausted = true | |||
| 140 | + | out = append(out, domain.CIStepSummary{Step: n, Omitted: true}) | |||
| 141 | + | continue | |||
| 142 | + | } | |||
| 143 | + | } | |||
| 144 | + | b, err := readCapped(s.path(ref, n), maxBytes, read) | |||
| 123 | if errors.Is(err, fs.ErrNotExist) { | 145 | if errors.Is(err, fs.ErrNotExist) { | ||
| 124 | continue // removed meanwhile | 146 | continue // removed meanwhile | ||
| 125 | } | 147 | } | ||
| 148 | + | if errors.Is(err, errOverBudget) { | |||
| 149 | + | exhausted = true // replaced by a larger file since the stat | |||
| 150 | + | out = append(out, domain.CIStepSummary{Step: n, Omitted: true}) | |||
| 151 | + | continue | |||
| 152 | + | } | |||
| 126 | if err != nil { | 153 | if err != nil { | ||
| 127 | return nil, false, fmt.Errorf("read summary: %w", err) | 154 | return nil, false, fmt.Errorf("read summary: %w", err) | ||
| 128 | } | 155 | } | ||
| 156 | + | read += int64(len(b)) | |||
| 129 | out = append(out, domain.CIStepSummary{Step: n, Markdown: string(b)}) | 157 | out = append(out, domain.CIStepSummary{Step: n, Markdown: string(b)}) | ||
| 130 | } | 158 | } | ||
| 131 | return out, more, nil | 159 | return out, more, nil | ||
| 132 | } | 160 | } | ||
| 133 | 161 | ||||
| 162 | + | var errOverBudget = errors.New("over budget") | |||
| 163 | + | ||||
| 164 | + | // readCapped reads a file, at most what is left of maxBytes after read bytes | |||
| 165 | + | // (no cap when maxBytes is 0): a file that is longer than that, because it grew | |||
| 166 | + | // since it was sized, is errOverBudget and its content is dropped. | |||
| 167 | + | func readCapped(path string, maxBytes, read int64) ([]byte, error) { | |||
| 168 | + | f, err := os.Open(path) | |||
| 169 | + | if err != nil { | |||
| 170 | + | return nil, err | |||
| 171 | + | } | |||
| 172 | + | defer func() { _ = f.Close() }() | |||
| 173 | + | if maxBytes <= 0 { | |||
| 174 | + | return io.ReadAll(f) | |||
| 175 | + | } | |||
| 176 | + | left := maxBytes - read | |||
| 177 | + | b, err := io.ReadAll(io.LimitReader(f, left+1)) | |||
| 178 | + | if err != nil { | |||
| 179 | + | return nil, err | |||
| 180 | + | } | |||
| 181 | + | if int64(len(b)) > left { | |||
| 182 | + | return nil, errOverBudget | |||
| 183 | + | } | |||
| 184 | + | return b, nil | |||
| 185 | + | } | |||
| 186 | + | ||||
| 134 | // RemoveJob deletes the summaries of one execution of a job. | 187 | // RemoveJob deletes the summaries of one execution of a job. | ||
| 135 | func (s *Store) RemoveJob(_ context.Context, ref ports.CILogRef) error { | 188 | func (s *Store) RemoveJob(_ context.Context, ref ports.CILogRef) error { | ||
| 136 | if !validRef(ref) { | 189 | if !validRef(ref) { | ||
M internal/adapters/cisummaries/cisummaries_test.go +68 -14
| @@ -23,7 +23,7 @@ func TestPutListReplaceAndRemove(t *testing.T) { | |||
| 23 | 23 | root := t.TempDir() | |
| 24 | 24 | s := cisummaries.New(root) | |
| 25 | 25 | ||
| 26 | - | got, more, err := s.List(ctx, ref, 20) | |
| 26 | + | got, more, err := s.List(ctx, ref, 20, 0) | |
| 27 | 27 | require.NoError(t, err) | |
| 28 | 28 | assert.Empty(t, got) | |
| 29 | 29 | assert.False(t, more) | |
| @@ -35,23 +35,23 @@ func TestPutListReplaceAndRemove(t *testing.T) { | |||
| 35 | 35 | require.NoError(t, err) | |
| 36 | 36 | assert.Equal(t, "two", string(b)) | |
| 37 | 37 | ||
| 38 | - | got, _, err = s.List(ctx, ref, 20) | |
| 38 | + | got, _, err = s.List(ctx, ref, 20, 0) | |
| 39 | 39 | require.NoError(t, err) | |
| 40 | 40 | assert.Equal(t, []domain.CIStepSummary{{Step: 2, Markdown: "two"}, {Step: 10, Markdown: "# ten"}}, got, "by step number, not by name") | |
| 41 | 41 | ||
| 42 | 42 | // Replace, and an empty markdown removes. | |
| 43 | 43 | require.NoError(t, s.Put(ctx, ref, 2, "again")) | |
| 44 | - | got, _, _ = s.List(ctx, ref, 20) | |
| 44 | + | got, _, _ = s.List(ctx, ref, 20, 0) | |
| 45 | 45 | assert.Equal(t, "again", got[0].Markdown) | |
| 46 | 46 | require.NoError(t, s.Put(ctx, ref, 2, "")) | |
| 47 | 47 | require.NoError(t, s.Put(ctx, ref, 3, ""), "removing what is not there is fine") | |
| 48 | - | got, _, _ = s.List(ctx, ref, 20) | |
| 48 | + | got, _, _ = s.List(ctx, ref, 20, 0) | |
| 49 | 49 | require.Len(t, got, 1) | |
| 50 | 50 | assert.EqualValues(t, 10, got[0].Step) | |
| 51 | 51 | ||
| 52 | 52 | // Another attempt and another job have their own. | |
| 53 | 53 | other := ports.CILogRef{RunID: 7, JobID: "7-0-0", Attempt: 2} | |
| 54 | - | got, _, _ = s.List(ctx, other, 20) | |
| 54 | + | got, _, _ = s.List(ctx, other, 20, 0) | |
| 55 | 55 | assert.Empty(t, got) | |
| 56 | 56 | ||
| 57 | 57 | // A write leaves no temporary file behind. | |
| @@ -68,12 +68,12 @@ func TestListStopsAtTheLimit(t *testing.T) { | |||
| 68 | 68 | for i := int32(1); i <= 25; i++ { | |
| 69 | 69 | require.NoError(t, s.Put(ctx, ref, i, "s")) | |
| 70 | 70 | } | |
| 71 | - | got, more, err := s.List(ctx, ref, 20) | |
| 71 | + | got, more, err := s.List(ctx, ref, 20, 0) | |
| 72 | 72 | require.NoError(t, err) | |
| 73 | 73 | assert.Len(t, got, 20) | |
| 74 | 74 | assert.True(t, more) | |
| 75 | 75 | assert.EqualValues(t, 20, got[19].Step, "the first 20 steps that have one") | |
| 76 | - | got, more, _ = s.List(ctx, ref, 25) | |
| 76 | + | got, more, _ = s.List(ctx, ref, 25, 0) | |
| 77 | 77 | assert.Len(t, got, 25) | |
| 78 | 78 | assert.False(t, more) | |
| 79 | 79 | } | |
| @@ -88,7 +88,7 @@ func TestListIgnoresStrayFiles(t *testing.T) { | |||
| 88 | 88 | for _, n := range []string{".tmp-123", "x.md", "01.md", "0.md", "-1.md", "notes.txt"} { | |
| 89 | 89 | require.NoError(t, os.WriteFile(filepath.Join(dir, n), []byte("stray"), 0o600)) | |
| 90 | 90 | } | |
| 91 | - | got, _, err := s.List(ctx, ref, 20) | |
| 91 | + | got, _, err := s.List(ctx, ref, 20, 0) | |
| 92 | 92 | require.NoError(t, err) | |
| 93 | 93 | require.Len(t, got, 1) | |
| 94 | 94 | assert.Equal(t, "one", got[0].Markdown) | |
| @@ -110,15 +110,15 @@ func TestRemoveJobRemoveRunsAndRunIDs(t *testing.T) { | |||
| 110 | 110 | assert.ElementsMatch(t, []int64{7, 8}, ids) | |
| 111 | 111 | ||
| 112 | 112 | require.NoError(t, s.RemoveJob(ctx, ref)) | |
| 113 | - | got, _, _ := s.List(ctx, ref, 20) | |
| 113 | + | got, _, _ := s.List(ctx, ref, 20, 0) | |
| 114 | 114 | assert.Empty(t, got) | |
| 115 | - | got, _, _ = s.List(ctx, second, 20) | |
| 115 | + | got, _, _ = s.List(ctx, second, 20, 0) | |
| 116 | 116 | assert.Len(t, got, 1, "the other job of the run stays") | |
| 117 | 117 | ||
| 118 | 118 | require.NoError(t, s.RemoveRuns(ctx, []int64{7, 0, -3, 99})) | |
| 119 | - | got, _, _ = s.List(ctx, second, 20) | |
| 119 | + | got, _, _ = s.List(ctx, second, 20, 0) | |
| 120 | 120 | assert.Empty(t, got) | |
| 121 | - | got, _, _ = s.List(ctx, third, 20) | |
| 121 | + | got, _, _ = s.List(ctx, third, 20, 0) | |
| 122 | 122 | assert.Len(t, got, 1) | |
| 123 | 123 | ids, _ = s.RunIDs(ctx) | |
| 124 | 124 | assert.Equal(t, []int64{8}, ids) | |
| @@ -136,7 +136,7 @@ func TestRefsCannotEscape(t *testing.T) { | |||
| 136 | 136 | {RunID: 7, JobID: "7-0-0", Attempt: 0}, | |
| 137 | 137 | } { | |
| 138 | 138 | assert.ErrorIs(t, s.Put(ctx, bad, 1, "x"), domain.ErrNotFound) | |
| 139 | - | got, _, err := s.List(ctx, bad, 20) | |
| 139 | + | got, _, err := s.List(ctx, bad, 20, 0) | |
| 140 | 140 | require.NoError(t, err) | |
| 141 | 141 | assert.Empty(t, got) | |
| 142 | 142 | } | |
| @@ -151,7 +151,61 @@ func TestASummaryOfTheMaximumSizeRoundTrips(t *testing.T) { | |||
| 151 | 151 | s := cisummaries.New(t.TempDir()) | |
| 152 | 152 | big := strings.Repeat("x", domain.CIMaxSummaryBytes) | |
| 153 | 153 | require.NoError(t, s.Put(ctx, ref, 1, big)) | |
| 154 | - | got, _, err := s.List(ctx, ref, 20) | |
| 154 | + | got, _, err := s.List(ctx, ref, 20, 0) | |
| 155 | 155 | require.NoError(t, err) | |
| 156 | 156 | assert.Len(t, got[0].Markdown, domain.CIMaxSummaryBytes) | |
| 157 | 157 | } | |
| 158 | + | ||
| 159 | + | // With a byte budget the files are sized before they are read: a summary that | |
| 160 | + | // does not fit, and every one after it, comes back Omitted and is never opened. | |
| 161 | + | func TestListReadsNoMoreThanTheBudget(t *testing.T) { | |
| 162 | + | ctx := t.Context() | |
| 163 | + | root := t.TempDir() | |
| 164 | + | s := cisummaries.New(root) | |
| 165 | + | require.NoError(t, s.Put(ctx, ref, 1, strings.Repeat("a", 100))) | |
| 166 | + | require.NoError(t, s.Put(ctx, ref, 2, strings.Repeat("b", 100))) | |
| 167 | + | require.NoError(t, s.Put(ctx, ref, 3, strings.Repeat("c", 10))) | |
| 168 | + | require.NoError(t, s.Put(ctx, ref, 4, "d")) | |
| 169 | + | dir := filepath.Join(root, "7", "7-0-0", "1") | |
| 170 | + | // A file that cannot be opened proves it was sized, not read. | |
| 171 | + | if os.Geteuid() != 0 { | |
| 172 | + | for _, n := range []string{"2.md", "3.md", "4.md"} { | |
| 173 | + | require.NoError(t, os.Chmod(filepath.Join(dir, n), 0)) | |
| 174 | + | } | |
| 175 | + | } | |
| 176 | + | ||
| 177 | + | got, more, err := s.List(ctx, ref, 20, 150) | |
| 178 | + | require.NoError(t, err) | |
| 179 | + | assert.False(t, more) | |
| 180 | + | require.Len(t, got, 4) | |
| 181 | + | assert.Equal(t, strings.Repeat("a", 100), got[0].Markdown) | |
| 182 | + | assert.False(t, got[0].Omitted) | |
| 183 | + | for _, o := range got[1:] { | |
| 184 | + | assert.True(t, o.Omitted, "step %d", o.Step) | |
| 185 | + | assert.Empty(t, o.Markdown) | |
| 186 | + | } | |
| 187 | + | assert.EqualValues(t, []int32{1, 2, 3, 4}, []int32{got[0].Step, got[1].Step, got[2].Step, got[3].Step}, "the steps are still listed") | |
| 188 | + | } | |
| 189 | + | ||
| 190 | + | func TestListBudgetBoundaries(t *testing.T) { | |
| 191 | + | ctx := t.Context() | |
| 192 | + | s := cisummaries.New(t.TempDir()) | |
| 193 | + | require.NoError(t, s.Put(ctx, ref, 1, "12345")) | |
| 194 | + | require.NoError(t, s.Put(ctx, ref, 2, "678")) | |
| 195 | + | ||
| 196 | + | got, _, _ := s.List(ctx, ref, 20, 8) | |
| 197 | + | assert.False(t, got[0].Omitted || got[1].Omitted, "exactly the budget fits") | |
| 198 | + | got, _, _ = s.List(ctx, ref, 20, 7) | |
| 199 | + | assert.False(t, got[0].Omitted) | |
| 200 | + | assert.True(t, got[1].Omitted, "one byte over") | |
| 201 | + | got, _, _ = s.List(ctx, ref, 20, 4) | |
| 202 | + | assert.True(t, got[0].Omitted && got[1].Omitted, "the first does not fit") | |
| 203 | + | got, _, _ = s.List(ctx, ref, 20, 0) | |
| 204 | + | assert.False(t, got[0].Omitted || got[1].Omitted, "no budget, no bound") | |
| 205 | + | ||
| 206 | + | // A smaller file after one that does not fit is still omitted: the order | |
| 207 | + | // of steps is kept and nothing is read past the first omission. | |
| 208 | + | require.NoError(t, s.Put(ctx, ref, 3, "x")) | |
| 209 | + | got, _, _ = s.List(ctx, ref, 20, 7) | |
| 210 | + | assert.True(t, got[2].Omitted) | |
| 211 | + | } | |
| @@ -23,7 +23,7 @@ func TestPutListReplaceAndRemove(t *testing.T) { | |||||
| 23 | root := t.TempDir() | 23 | root := t.TempDir() | ||
| 24 | s := cisummaries.New(root) | 24 | s := cisummaries.New(root) | ||
| 25 | 25 | ||||
| 26 | - | got, more, err := s.List(ctx, ref, 20) | 26 | + | got, more, err := s.List(ctx, ref, 20, 0) |
| 27 | require.NoError(t, err) | 27 | require.NoError(t, err) | ||
| 28 | assert.Empty(t, got) | 28 | assert.Empty(t, got) | ||
| 29 | assert.False(t, more) | 29 | assert.False(t, more) | ||
| @@ -35,23 +35,23 @@ func TestPutListReplaceAndRemove(t *testing.T) { | |||||
| 35 | require.NoError(t, err) | 35 | require.NoError(t, err) | ||
| 36 | assert.Equal(t, "two", string(b)) | 36 | assert.Equal(t, "two", string(b)) | ||
| 37 | 37 | ||||
| 38 | - | got, _, err = s.List(ctx, ref, 20) | 38 | + | got, _, err = s.List(ctx, ref, 20, 0) |
| 39 | require.NoError(t, err) | 39 | require.NoError(t, err) | ||
| 40 | assert.Equal(t, []domain.CIStepSummary{{Step: 2, Markdown: "two"}, {Step: 10, Markdown: "# ten"}}, got, "by step number, not by name") | 40 | assert.Equal(t, []domain.CIStepSummary{{Step: 2, Markdown: "two"}, {Step: 10, Markdown: "# ten"}}, got, "by step number, not by name") | ||
| 41 | 41 | ||||
| 42 | // Replace, and an empty markdown removes. | 42 | // Replace, and an empty markdown removes. | ||
| 43 | require.NoError(t, s.Put(ctx, ref, 2, "again")) | 43 | require.NoError(t, s.Put(ctx, ref, 2, "again")) | ||
| 44 | - | got, _, _ = s.List(ctx, ref, 20) | 44 | + | got, _, _ = s.List(ctx, ref, 20, 0) |
| 45 | assert.Equal(t, "again", got[0].Markdown) | 45 | assert.Equal(t, "again", got[0].Markdown) | ||
| 46 | require.NoError(t, s.Put(ctx, ref, 2, "")) | 46 | require.NoError(t, s.Put(ctx, ref, 2, "")) | ||
| 47 | require.NoError(t, s.Put(ctx, ref, 3, ""), "removing what is not there is fine") | 47 | require.NoError(t, s.Put(ctx, ref, 3, ""), "removing what is not there is fine") | ||
| 48 | - | got, _, _ = s.List(ctx, ref, 20) | 48 | + | got, _, _ = s.List(ctx, ref, 20, 0) |
| 49 | require.Len(t, got, 1) | 49 | require.Len(t, got, 1) | ||
| 50 | assert.EqualValues(t, 10, got[0].Step) | 50 | assert.EqualValues(t, 10, got[0].Step) | ||
| 51 | 51 | ||||
| 52 | // Another attempt and another job have their own. | 52 | // Another attempt and another job have their own. | ||
| 53 | other := ports.CILogRef{RunID: 7, JobID: "7-0-0", Attempt: 2} | 53 | other := ports.CILogRef{RunID: 7, JobID: "7-0-0", Attempt: 2} | ||
| 54 | - | got, _, _ = s.List(ctx, other, 20) | 54 | + | got, _, _ = s.List(ctx, other, 20, 0) |
| 55 | assert.Empty(t, got) | 55 | assert.Empty(t, got) | ||
| 56 | 56 | ||||
| 57 | // A write leaves no temporary file behind. | 57 | // A write leaves no temporary file behind. | ||
| @@ -68,12 +68,12 @@ func TestListStopsAtTheLimit(t *testing.T) { | |||||
| 68 | for i := int32(1); i <= 25; i++ { | 68 | for i := int32(1); i <= 25; i++ { | ||
| 69 | require.NoError(t, s.Put(ctx, ref, i, "s")) | 69 | require.NoError(t, s.Put(ctx, ref, i, "s")) | ||
| 70 | } | 70 | } | ||
| 71 | - | got, more, err := s.List(ctx, ref, 20) | 71 | + | got, more, err := s.List(ctx, ref, 20, 0) |
| 72 | require.NoError(t, err) | 72 | require.NoError(t, err) | ||
| 73 | assert.Len(t, got, 20) | 73 | assert.Len(t, got, 20) | ||
| 74 | assert.True(t, more) | 74 | assert.True(t, more) | ||
| 75 | assert.EqualValues(t, 20, got[19].Step, "the first 20 steps that have one") | 75 | assert.EqualValues(t, 20, got[19].Step, "the first 20 steps that have one") | ||
| 76 | - | got, more, _ = s.List(ctx, ref, 25) | 76 | + | got, more, _ = s.List(ctx, ref, 25, 0) |
| 77 | assert.Len(t, got, 25) | 77 | assert.Len(t, got, 25) | ||
| 78 | assert.False(t, more) | 78 | assert.False(t, more) | ||
| 79 | } | 79 | } | ||
| @@ -88,7 +88,7 @@ func TestListIgnoresStrayFiles(t *testing.T) { | |||||
| 88 | for _, n := range []string{".tmp-123", "x.md", "01.md", "0.md", "-1.md", "notes.txt"} { | 88 | for _, n := range []string{".tmp-123", "x.md", "01.md", "0.md", "-1.md", "notes.txt"} { | ||
| 89 | require.NoError(t, os.WriteFile(filepath.Join(dir, n), []byte("stray"), 0o600)) | 89 | require.NoError(t, os.WriteFile(filepath.Join(dir, n), []byte("stray"), 0o600)) | ||
| 90 | } | 90 | } | ||
| 91 | - | got, _, err := s.List(ctx, ref, 20) | 91 | + | got, _, err := s.List(ctx, ref, 20, 0) |
| 92 | require.NoError(t, err) | 92 | require.NoError(t, err) | ||
| 93 | require.Len(t, got, 1) | 93 | require.Len(t, got, 1) | ||
| 94 | assert.Equal(t, "one", got[0].Markdown) | 94 | assert.Equal(t, "one", got[0].Markdown) | ||
| @@ -110,15 +110,15 @@ func TestRemoveJobRemoveRunsAndRunIDs(t *testing.T) { | |||||
| 110 | assert.ElementsMatch(t, []int64{7, 8}, ids) | 110 | assert.ElementsMatch(t, []int64{7, 8}, ids) | ||
| 111 | 111 | ||||
| 112 | require.NoError(t, s.RemoveJob(ctx, ref)) | 112 | require.NoError(t, s.RemoveJob(ctx, ref)) | ||
| 113 | - | got, _, _ := s.List(ctx, ref, 20) | 113 | + | got, _, _ := s.List(ctx, ref, 20, 0) |
| 114 | assert.Empty(t, got) | 114 | assert.Empty(t, got) | ||
| 115 | - | got, _, _ = s.List(ctx, second, 20) | 115 | + | got, _, _ = s.List(ctx, second, 20, 0) |
| 116 | assert.Len(t, got, 1, "the other job of the run stays") | 116 | assert.Len(t, got, 1, "the other job of the run stays") | ||
| 117 | 117 | ||||
| 118 | require.NoError(t, s.RemoveRuns(ctx, []int64{7, 0, -3, 99})) | 118 | require.NoError(t, s.RemoveRuns(ctx, []int64{7, 0, -3, 99})) | ||
| 119 | - | got, _, _ = s.List(ctx, second, 20) | 119 | + | got, _, _ = s.List(ctx, second, 20, 0) |
| 120 | assert.Empty(t, got) | 120 | assert.Empty(t, got) | ||
| 121 | - | got, _, _ = s.List(ctx, third, 20) | 121 | + | got, _, _ = s.List(ctx, third, 20, 0) |
| 122 | assert.Len(t, got, 1) | 122 | assert.Len(t, got, 1) | ||
| 123 | ids, _ = s.RunIDs(ctx) | 123 | ids, _ = s.RunIDs(ctx) | ||
| 124 | assert.Equal(t, []int64{8}, ids) | 124 | assert.Equal(t, []int64{8}, ids) | ||
| @@ -136,7 +136,7 @@ func TestRefsCannotEscape(t *testing.T) { | |||||
| 136 | {RunID: 7, JobID: "7-0-0", Attempt: 0}, | 136 | {RunID: 7, JobID: "7-0-0", Attempt: 0}, | ||
| 137 | } { | 137 | } { | ||
| 138 | assert.ErrorIs(t, s.Put(ctx, bad, 1, "x"), domain.ErrNotFound) | 138 | assert.ErrorIs(t, s.Put(ctx, bad, 1, "x"), domain.ErrNotFound) | ||
| 139 | - | got, _, err := s.List(ctx, bad, 20) | 139 | + | got, _, err := s.List(ctx, bad, 20, 0) |
| 140 | require.NoError(t, err) | 140 | require.NoError(t, err) | ||
| 141 | assert.Empty(t, got) | 141 | assert.Empty(t, got) | ||
| 142 | } | 142 | } | ||
| @@ -151,7 +151,61 @@ func TestASummaryOfTheMaximumSizeRoundTrips(t *testing.T) { | |||||
| 151 | s := cisummaries.New(t.TempDir()) | 151 | s := cisummaries.New(t.TempDir()) | ||
| 152 | big := strings.Repeat("x", domain.CIMaxSummaryBytes) | 152 | big := strings.Repeat("x", domain.CIMaxSummaryBytes) | ||
| 153 | require.NoError(t, s.Put(ctx, ref, 1, big)) | 153 | require.NoError(t, s.Put(ctx, ref, 1, big)) | ||
| 154 | - | got, _, err := s.List(ctx, ref, 20) | 154 | + | got, _, err := s.List(ctx, ref, 20, 0) |
| 155 | require.NoError(t, err) | 155 | require.NoError(t, err) | ||
| 156 | assert.Len(t, got[0].Markdown, domain.CIMaxSummaryBytes) | 156 | assert.Len(t, got[0].Markdown, domain.CIMaxSummaryBytes) | ||
| 157 | } | 157 | } | ||
| 158 | + | ||||
| 159 | + | // With a byte budget the files are sized before they are read: a summary that | |||
| 160 | + | // does not fit, and every one after it, comes back Omitted and is never opened. | |||
| 161 | + | func TestListReadsNoMoreThanTheBudget(t *testing.T) { | |||
| 162 | + | ctx := t.Context() | |||
| 163 | + | root := t.TempDir() | |||
| 164 | + | s := cisummaries.New(root) | |||
| 165 | + | require.NoError(t, s.Put(ctx, ref, 1, strings.Repeat("a", 100))) | |||
| 166 | + | require.NoError(t, s.Put(ctx, ref, 2, strings.Repeat("b", 100))) | |||
| 167 | + | require.NoError(t, s.Put(ctx, ref, 3, strings.Repeat("c", 10))) | |||
| 168 | + | require.NoError(t, s.Put(ctx, ref, 4, "d")) | |||
| 169 | + | dir := filepath.Join(root, "7", "7-0-0", "1") | |||
| 170 | + | // A file that cannot be opened proves it was sized, not read. | |||
| 171 | + | if os.Geteuid() != 0 { | |||
| 172 | + | for _, n := range []string{"2.md", "3.md", "4.md"} { | |||
| 173 | + | require.NoError(t, os.Chmod(filepath.Join(dir, n), 0)) | |||
| 174 | + | } | |||
| 175 | + | } | |||
| 176 | + | ||||
| 177 | + | got, more, err := s.List(ctx, ref, 20, 150) | |||
| 178 | + | require.NoError(t, err) | |||
| 179 | + | assert.False(t, more) | |||
| 180 | + | require.Len(t, got, 4) | |||
| 181 | + | assert.Equal(t, strings.Repeat("a", 100), got[0].Markdown) | |||
| 182 | + | assert.False(t, got[0].Omitted) | |||
| 183 | + | for _, o := range got[1:] { | |||
| 184 | + | assert.True(t, o.Omitted, "step %d", o.Step) | |||
| 185 | + | assert.Empty(t, o.Markdown) | |||
| 186 | + | } | |||
| 187 | + | assert.EqualValues(t, []int32{1, 2, 3, 4}, []int32{got[0].Step, got[1].Step, got[2].Step, got[3].Step}, "the steps are still listed") | |||
| 188 | + | } | |||
| 189 | + | ||||
| 190 | + | func TestListBudgetBoundaries(t *testing.T) { | |||
| 191 | + | ctx := t.Context() | |||
| 192 | + | s := cisummaries.New(t.TempDir()) | |||
| 193 | + | require.NoError(t, s.Put(ctx, ref, 1, "12345")) | |||
| 194 | + | require.NoError(t, s.Put(ctx, ref, 2, "678")) | |||
| 195 | + | ||||
| 196 | + | got, _, _ := s.List(ctx, ref, 20, 8) | |||
| 197 | + | assert.False(t, got[0].Omitted || got[1].Omitted, "exactly the budget fits") | |||
| 198 | + | got, _, _ = s.List(ctx, ref, 20, 7) | |||
| 199 | + | assert.False(t, got[0].Omitted) | |||
| 200 | + | assert.True(t, got[1].Omitted, "one byte over") | |||
| 201 | + | got, _, _ = s.List(ctx, ref, 20, 4) | |||
| 202 | + | assert.True(t, got[0].Omitted && got[1].Omitted, "the first does not fit") | |||
| 203 | + | got, _, _ = s.List(ctx, ref, 20, 0) | |||
| 204 | + | assert.False(t, got[0].Omitted || got[1].Omitted, "no budget, no bound") | |||
| 205 | + | ||||
| 206 | + | // A smaller file after one that does not fit is still omitted: the order | |||
| 207 | + | // of steps is kept and nothing is read past the first omission. | |||
| 208 | + | require.NoError(t, s.Put(ctx, ref, 3, "x")) | |||
| 209 | + | got, _, _ = s.List(ctx, ref, 20, 7) | |||
| 210 | + | assert.True(t, got[2].Omitted) | |||
| 211 | + | } | |||
M internal/adapters/rpc/ci.go +1 -1
| @@ -367,7 +367,7 @@ func (s *runService) GetStepSummaries(ctx context.Context, req *connect.Request[ | |||
| 367 | 367 | if err != nil { | |
| 368 | 368 | return nil, ciError(ctx, err) | |
| 369 | 369 | } | |
| 370 | - | res, err := s.runs.GetStepSummaries(ctx, caller(ctx), name, req.Msg.GetJobId(), req.Msg.GetAttempt()) | |
| 370 | + | res, err := s.runs.GetStepSummaries(ctx, caller(ctx), name, req.Msg.GetJobId(), req.Msg.GetAttempt(), 0) | |
| 371 | 371 | if err != nil { | |
| 372 | 372 | return nil, ciError(ctx, err) | |
| 373 | 373 | } | |
| @@ -367,7 +367,7 @@ func (s *runService) GetStepSummaries(ctx context.Context, req *connect.Request[ | |||||
| 367 | if err != nil { | 367 | if err != nil { | ||
| 368 | return nil, ciError(ctx, err) | 368 | return nil, ciError(ctx, err) | ||
| 369 | } | 369 | } | ||
| 370 | - | res, err := s.runs.GetStepSummaries(ctx, caller(ctx), name, req.Msg.GetJobId(), req.Msg.GetAttempt()) | 370 | + | res, err := s.runs.GetStepSummaries(ctx, caller(ctx), name, req.Msg.GetJobId(), req.Msg.GetAttempt(), 0) |
| 371 | if err != nil { | 371 | if err != nil { | ||
| 372 | return nil, ciError(ctx, err) | 372 | return nil, ciError(ctx, err) | ||
| 373 | } | 373 | } | ||
M internal/adapters/rpc/ci_test.go +1 -1
| @@ -175,7 +175,7 @@ func TestRunServiceAnnotationsAndSummaries(t *testing.T) { | |||
| 175 | 175 | Annotations: []ports.JobAnnotation{{JobID: "7-0-0", Annotation: domain.CIAnnotation{Level: domain.AnnotationWarning, Message: "m", File: "a.go", StartLine: 4, Step: 3}}}, | |
| 176 | 176 | Truncated: true, | |
| 177 | 177 | }, nil).Once() | |
| 178 | - | runs.EXPECT().GetStepSummaries(mock.Anything, domain.Owner(), repo, "7-0-0", int32(0)).Return(ports.SummaryList{ | |
| 178 | + | runs.EXPECT().GetStepSummaries(mock.Anything, domain.Owner(), repo, "7-0-0", int32(0), int64(0)).Return(ports.SummaryList{ | |
| 179 | 179 | Summaries: []domain.CIStepSummary{{Step: 2, Markdown: "# s"}}, Truncated: true, | |
| 180 | 180 | }, nil).Once() | |
| 181 | 181 | runs.EXPECT().ListAnnotations(mock.Anything, mock.Anything, repo, int64(8), int32(0), "").Return(ports.AnnotationList{}, domain.ErrNotFound).Once() | |
| @@ -175,7 +175,7 @@ func TestRunServiceAnnotationsAndSummaries(t *testing.T) { | |||||
| 175 | Annotations: []ports.JobAnnotation{{JobID: "7-0-0", Annotation: domain.CIAnnotation{Level: domain.AnnotationWarning, Message: "m", File: "a.go", StartLine: 4, Step: 3}}}, | 175 | Annotations: []ports.JobAnnotation{{JobID: "7-0-0", Annotation: domain.CIAnnotation{Level: domain.AnnotationWarning, Message: "m", File: "a.go", StartLine: 4, Step: 3}}}, | ||
| 176 | Truncated: true, | 176 | Truncated: true, | ||
| 177 | }, nil).Once() | 177 | }, nil).Once() | ||
| 178 | - | runs.EXPECT().GetStepSummaries(mock.Anything, domain.Owner(), repo, "7-0-0", int32(0)).Return(ports.SummaryList{ | 178 | + | runs.EXPECT().GetStepSummaries(mock.Anything, domain.Owner(), repo, "7-0-0", int32(0), int64(0)).Return(ports.SummaryList{ |
| 179 | Summaries: []domain.CIStepSummary{{Step: 2, Markdown: "# s"}}, Truncated: true, | 179 | Summaries: []domain.CIStepSummary{{Step: 2, Markdown: "# s"}}, Truncated: true, | ||
| 180 | }, nil).Once() | 180 | }, nil).Once() | ||
| 181 | runs.EXPECT().ListAnnotations(mock.Anything, mock.Anything, repo, int64(8), int32(0), "").Return(ports.AnnotationList{}, domain.ErrNotFound).Once() | 181 | runs.EXPECT().ListAnnotations(mock.Anything, mock.Anything, repo, int64(8), int32(0), "").Return(ports.AnnotationList{}, domain.ErrNotFound).Once() | ||
M internal/adapters/web/actions.templ +5 -2
| @@ -62,7 +62,7 @@ templ RunDetail(l Layout, p RunPage) { | |||
| 62 | 62 | <div id="run-body"> | |
| 63 | 63 | @RunBody(p) | |
| 64 | 64 | </div> | |
| 65 | - | @RunSummaries(p.Summaries) | |
| 65 | + | @RunSummaries(p.Summaries, p.SummariesMore) | |
| 66 | 66 | } | |
| 67 | 67 | } | |
| 68 | 68 | ||
| @@ -181,7 +181,7 @@ templ JobAnnotations(anns []AnnotationView, more bool) { | |||
| 181 | 181 | // RunSummaries is the job summaries of a run, one block per step that wrote | |
| 182 | 182 | // one. The Markdown is rendered by the README renderer: raw HTML dropped, URLs | |
| 183 | 183 | // filtered, images shown as their alt text. | |
| 184 | - | templ RunSummaries(sums []JobSummaries) { | |
| 184 | + | templ RunSummaries(sums []JobSummaries, more bool) { | |
| 185 | 185 | for _, j := range sums { | |
| 186 | 186 | <section class="summaries" aria-label={ "Summary of " + j.Job }> | |
| 187 | 187 | <h3> | |
| @@ -207,6 +207,9 @@ templ RunSummaries(sums []JobSummaries) { | |||
| 207 | 207 | } | |
| 208 | 208 | </section> | |
| 209 | 209 | } | |
| 210 | + | if more { | |
| 211 | + | <p class="mute">more summaries are not shown: the summaries of the page are over { humanSize(maxSummaryPageBytes) }.</p> | |
| 212 | + | } | |
| 210 | 213 | } | |
| 211 | 214 | ||
| 212 | 215 | templ runRail(p RunPage) { | |
| @@ -62,7 +62,7 @@ templ RunDetail(l Layout, p RunPage) { | |||||
| 62 | <div id="run-body"> | 62 | <div id="run-body"> | ||
| 63 | @RunBody(p) | 63 | @RunBody(p) | ||
| 64 | </div> | 64 | </div> | ||
| 65 | - | @RunSummaries(p.Summaries) | 65 | + | @RunSummaries(p.Summaries, p.SummariesMore) |
| 66 | } | 66 | } | ||
| 67 | } | 67 | } | ||
| 68 | 68 | ||||
| @@ -181,7 +181,7 @@ templ JobAnnotations(anns []AnnotationView, more bool) { | |||||
| 181 | // RunSummaries is the job summaries of a run, one block per step that wrote | 181 | // RunSummaries is the job summaries of a run, one block per step that wrote | ||
| 182 | // one. The Markdown is rendered by the README renderer: raw HTML dropped, URLs | 182 | // one. The Markdown is rendered by the README renderer: raw HTML dropped, URLs | ||
| 183 | // filtered, images shown as their alt text. | 183 | // filtered, images shown as their alt text. | ||
| 184 | - | templ RunSummaries(sums []JobSummaries) { | 184 | + | templ RunSummaries(sums []JobSummaries, more bool) { |
| 185 | for _, j := range sums { | 185 | for _, j := range sums { | ||
| 186 | <section class="summaries" aria-label={ "Summary of " + j.Job }> | 186 | <section class="summaries" aria-label={ "Summary of " + j.Job }> | ||
| 187 | <h3> | 187 | <h3> | ||
| @@ -207,6 +207,9 @@ templ RunSummaries(sums []JobSummaries) { | |||||
| 207 | } | 207 | } | ||
| 208 | </section> | 208 | </section> | ||
| 209 | } | 209 | } | ||
| 210 | + | if more { | |||
| 211 | + | <p class="mute">more summaries are not shown: the summaries of the page are over { humanSize(maxSummaryPageBytes) }.</p> | |||
| 212 | + | } | |||
| 210 | } | 213 | } | ||
| 211 | 214 | ||||
| 212 | templ runRail(p RunPage) { | 215 | templ runRail(p RunPage) { | ||
M internal/adapters/web/actions_pages.go +4 -2
| @@ -179,7 +179,9 @@ type RunPage struct { | |||
| 179 | 179 | AnnotationsMore bool | |
| 180 | 180 | // Summaries are the job summaries, rendered; only the full page has them. | |
| 181 | 181 | Summaries []JobSummaries | |
| 182 | - | Active bool | |
| 182 | + | // SummariesMore says that some summaries are not shown (the page budget). | |
| 183 | + | SummariesMore bool | |
| 184 | + | Active bool | |
| 183 | 185 | // detail is what the page was built from. | |
| 184 | 186 | detail ports.RunDetail | |
| 185 | 187 | // Forms are the owner's actions; nil/empty when the visitor cannot. | |
| @@ -294,7 +296,7 @@ func (s *Server) run(ctx context.Context, r *http.Request) (templ.Component, int | |||
| 294 | 296 | } | |
| 295 | 297 | // The summaries are part of the page, not of the live body: the page | |
| 296 | 298 | // fetches itself again when the run completes (runBody), and they show then. | |
| 297 | - | if p.Summaries, err = s.jobSummaries(ctx, d, p.detail.Run, p.detail.Jobs, p.Attempt == p.Latest); err != nil { | |
| 299 | + | if p.Summaries, p.SummariesMore, err = s.jobSummaries(ctx, d, p.detail.Run, p.detail.Jobs, p.Attempt == p.Latest, maxSummaryPageBytes); err != nil { | |
| 298 | 300 | return nil, 0, err | |
| 299 | 301 | } | |
| 300 | 302 | l := s.repoLayout(ctx, d, "actions") | |
| @@ -179,7 +179,9 @@ type RunPage struct { | |||||
| 179 | AnnotationsMore bool | 179 | AnnotationsMore bool | ||
| 180 | // Summaries are the job summaries, rendered; only the full page has them. | 180 | // Summaries are the job summaries, rendered; only the full page has them. | ||
| 181 | Summaries []JobSummaries | 181 | Summaries []JobSummaries | ||
| 182 | - | Active bool | 182 | + | // SummariesMore says that some summaries are not shown (the page budget). |
| 183 | + | SummariesMore bool | |||
| 184 | + | Active bool | |||
| 183 | // detail is what the page was built from. | 185 | // detail is what the page was built from. | ||
| 184 | detail ports.RunDetail | 186 | detail ports.RunDetail | ||
| 185 | // Forms are the owner's actions; nil/empty when the visitor cannot. | 187 | // Forms are the owner's actions; nil/empty when the visitor cannot. | ||
| @@ -294,7 +296,7 @@ func (s *Server) run(ctx context.Context, r *http.Request) (templ.Component, int | |||||
| 294 | } | 296 | } | ||
| 295 | // The summaries are part of the page, not of the live body: the page | 297 | // The summaries are part of the page, not of the live body: the page | ||
| 296 | // fetches itself again when the run completes (runBody), and they show then. | 298 | // fetches itself again when the run completes (runBody), and they show then. | ||
| 297 | - | if p.Summaries, err = s.jobSummaries(ctx, d, p.detail.Run, p.detail.Jobs, p.Attempt == p.Latest); err != nil { | 299 | + | if p.Summaries, p.SummariesMore, err = s.jobSummaries(ctx, d, p.detail.Run, p.detail.Jobs, p.Attempt == p.Latest, maxSummaryPageBytes); err != nil { |
| 298 | return nil, 0, err | 300 | return nil, 0, err | ||
| 299 | } | 301 | } | ||
| 300 | l := s.repoLayout(ctx, d, "actions") | 302 | l := s.repoLayout(ctx, d, "actions") | ||
M internal/adapters/web/actions_results.go +34 -10
| @@ -21,7 +21,7 @@ import ( | |||
| 21 | 21 | ||
| 22 | 22 | // maxSummaryPageBytes bounds the Markdown rendered in one page, all summaries | |
| 23 | 23 | // together; the ones past it are not shown, with a note. | |
| 24 | - | const maxSummaryPageBytes = 4 << 20 | |
| 24 | + | const maxSummaryPageBytes int64 = 4 << 20 | |
| 25 | 25 | ||
| 26 | 26 | // AnnotationView is an annotation as shown. | |
| 27 | 27 | type AnnotationView struct { | |
| @@ -156,17 +156,21 @@ type JobSummaries struct { | |||
| 156 | 156 | } | |
| 157 | 157 | ||
| 158 | 158 | // jobSummaries reads and renders the summaries of the jobs of a run, in the | |
| 159 | - | // order of the jobs, within maxSummaryPageBytes of Markdown. | |
| 160 | - | func (s *Server) jobSummaries(ctx context.Context, d *repoData, run domain.CIRun, jobs []ports.JobView, linkJobs bool) ([]JobSummaries, error) { | |
| 161 | - | budget := maxSummaryPageBytes | |
| 162 | - | var out []JobSummaries | |
| 159 | + | // order of the jobs, within budget bytes of Markdown. The budget goes down as | |
| 160 | + | // summaries are read and is handed to the use case, which sizes the files | |
| 161 | + | // before it reads them: a page view reads at most budget bytes. Once it is used | |
| 162 | + | // up no further job is asked, and more is true: some summaries are not shown. | |
| 163 | + | func (s *Server) jobSummaries(ctx context.Context, d *repoData, run domain.CIRun, jobs []ports.JobView, linkJobs bool, budget int64) (out []JobSummaries, more bool, err error) { | |
| 163 | 164 | for _, j := range jobs { | |
| 164 | 165 | if j.Phase != domain.CIPhaseRunning && !j.Ended() { | |
| 165 | 166 | continue // no step has run | |
| 166 | 167 | } | |
| 167 | - | res, err := s.cfg.Runs.GetStepSummaries(ctx, principal(ctx), d.repo.Name, j.ID, j.Attempt) | |
| 168 | + | if budget <= 0 { | |
| 169 | + | return out, true, nil | |
| 170 | + | } | |
| 171 | + | res, err := s.cfg.Runs.GetStepSummaries(ctx, principal(ctx), d.repo.Name, j.ID, j.Attempt, budget) | |
| 168 | 172 | if err != nil { | |
| 169 | - | return nil, err | |
| 173 | + | return nil, false, err | |
| 170 | 174 | } | |
| 171 | 175 | if len(res.Summaries) == 0 { | |
| 172 | 176 | continue | |
| @@ -179,12 +183,14 @@ func (s *Server) jobSummaries(ctx context.Context, d *repoData, run domain.CIRun | |||
| 179 | 183 | name = st.name | |
| 180 | 184 | } | |
| 181 | 185 | v := SummaryView{Step: name} | |
| 182 | - | if len(sm.Markdown) > budget { | |
| 186 | + | if sm.Omitted { | |
| 183 | 187 | v.Note = "this summary is not shown: the summaries of the page are over " + humanSize(maxSummaryPageBytes) + "." | |
| 188 | + | more = true | |
| 189 | + | budget = 0 // everything after an omitted summary is omitted too | |
| 184 | 190 | js.Steps = append(js.Steps, v) | |
| 185 | 191 | continue | |
| 186 | 192 | } | |
| 187 | - | budget -= len(sm.Markdown) | |
| 193 | + | budget -= int64(len(sm.Markdown)) | |
| 188 | 194 | prefix := headingIDPrefix + "s" + j.ID + "-" + strconv.Itoa(int(sm.Step)) + "-" | |
| 189 | 195 | h, _, err := s.md.renderWithIDs([]byte(sm.Markdown), d.name(), run.Sha, "", prefix) | |
| 190 | 196 | if err != nil { | |
| @@ -196,7 +202,25 @@ func (s *Server) jobSummaries(ctx context.Context, d *repoData, run domain.CIRun | |||
| 196 | 202 | } | |
| 197 | 203 | out = append(out, js) | |
| 198 | 204 | } | |
| 199 | - | return out, nil | |
| 205 | + | return out, more, nil | |
| 206 | + | } | |
| 207 | + | ||
| 208 | + | // jobRunSha is the commit of the run a job belongs to, for the live fragments of | |
| 209 | + | // its page. A job id that is not one, or a run that cannot be read, is not found. | |
| 210 | + | func (s *Server) jobRunSha(ctx context.Context, repo, jobID string) (string, error) { | |
| 211 | + | name, err := domain.ParseRepoName(repo) | |
| 212 | + | if err != nil { | |
| 213 | + | return "", domain.ErrNotFound | |
| 214 | + | } | |
| 215 | + | runID, _, _, ok := domain.ParseJobID(jobID) | |
| 216 | + | if !ok { | |
| 217 | + | return "", domain.ErrNotFound | |
| 218 | + | } | |
| 219 | + | d, err := s.cfg.Runs.GetRun(ctx, principal(ctx), name, runID, 0) | |
| 220 | + | if err != nil { | |
| 221 | + | return "", err | |
| 222 | + | } | |
| 223 | + | return d.Run.Sha, nil | |
| 200 | 224 | } | |
| 201 | 225 | ||
| 202 | 226 | // runAnnotations reads the annotations of a run attempt and builds their views. | |
| @@ -21,7 +21,7 @@ import ( | |||||
| 21 | 21 | ||||
| 22 | // maxSummaryPageBytes bounds the Markdown rendered in one page, all summaries | 22 | // maxSummaryPageBytes bounds the Markdown rendered in one page, all summaries | ||
| 23 | // together; the ones past it are not shown, with a note. | 23 | // together; the ones past it are not shown, with a note. | ||
| 24 | - | const maxSummaryPageBytes = 4 << 20 | 24 | + | const maxSummaryPageBytes int64 = 4 << 20 |
| 25 | 25 | ||||
| 26 | // AnnotationView is an annotation as shown. | 26 | // AnnotationView is an annotation as shown. | ||
| 27 | type AnnotationView struct { | 27 | type AnnotationView struct { | ||
| @@ -156,17 +156,21 @@ type JobSummaries struct { | |||||
| 156 | } | 156 | } | ||
| 157 | 157 | ||||
| 158 | // jobSummaries reads and renders the summaries of the jobs of a run, in the | 158 | // jobSummaries reads and renders the summaries of the jobs of a run, in the | ||
| 159 | - | // order of the jobs, within maxSummaryPageBytes of Markdown. | 159 | + | // order of the jobs, within budget bytes of Markdown. The budget goes down as |
| 160 | - | func (s *Server) jobSummaries(ctx context.Context, d *repoData, run domain.CIRun, jobs []ports.JobView, linkJobs bool) ([]JobSummaries, error) { | 160 | + | // summaries are read and is handed to the use case, which sizes the files |
| 161 | - | budget := maxSummaryPageBytes | 161 | + | // before it reads them: a page view reads at most budget bytes. Once it is used |
| 162 | - | var out []JobSummaries | 162 | + | // up no further job is asked, and more is true: some summaries are not shown. |
| 163 | + | func (s *Server) jobSummaries(ctx context.Context, d *repoData, run domain.CIRun, jobs []ports.JobView, linkJobs bool, budget int64) (out []JobSummaries, more bool, err error) { | |||
| 163 | for _, j := range jobs { | 164 | for _, j := range jobs { | ||
| 164 | if j.Phase != domain.CIPhaseRunning && !j.Ended() { | 165 | if j.Phase != domain.CIPhaseRunning && !j.Ended() { | ||
| 165 | continue // no step has run | 166 | continue // no step has run | ||
| 166 | } | 167 | } | ||
| 167 | - | res, err := s.cfg.Runs.GetStepSummaries(ctx, principal(ctx), d.repo.Name, j.ID, j.Attempt) | 168 | + | if budget <= 0 { |
| 169 | + | return out, true, nil | |||
| 170 | + | } | |||
| 171 | + | res, err := s.cfg.Runs.GetStepSummaries(ctx, principal(ctx), d.repo.Name, j.ID, j.Attempt, budget) | |||
| 168 | if err != nil { | 172 | if err != nil { | ||
| 169 | - | return nil, err | 173 | + | return nil, false, err |
| 170 | } | 174 | } | ||
| 171 | if len(res.Summaries) == 0 { | 175 | if len(res.Summaries) == 0 { | ||
| 172 | continue | 176 | continue | ||
| @@ -179,12 +183,14 @@ func (s *Server) jobSummaries(ctx context.Context, d *repoData, run domain.CIRun | |||||
| 179 | name = st.name | 183 | name = st.name | ||
| 180 | } | 184 | } | ||
| 181 | v := SummaryView{Step: name} | 185 | v := SummaryView{Step: name} | ||
| 182 | - | if len(sm.Markdown) > budget { | 186 | + | if sm.Omitted { |
| 183 | v.Note = "this summary is not shown: the summaries of the page are over " + humanSize(maxSummaryPageBytes) + "." | 187 | v.Note = "this summary is not shown: the summaries of the page are over " + humanSize(maxSummaryPageBytes) + "." | ||
| 188 | + | more = true | |||
| 189 | + | budget = 0 // everything after an omitted summary is omitted too | |||
| 184 | js.Steps = append(js.Steps, v) | 190 | js.Steps = append(js.Steps, v) | ||
| 185 | continue | 191 | continue | ||
| 186 | } | 192 | } | ||
| 187 | - | budget -= len(sm.Markdown) | 193 | + | budget -= int64(len(sm.Markdown)) |
| 188 | prefix := headingIDPrefix + "s" + j.ID + "-" + strconv.Itoa(int(sm.Step)) + "-" | 194 | prefix := headingIDPrefix + "s" + j.ID + "-" + strconv.Itoa(int(sm.Step)) + "-" | ||
| 189 | h, _, err := s.md.renderWithIDs([]byte(sm.Markdown), d.name(), run.Sha, "", prefix) | 195 | h, _, err := s.md.renderWithIDs([]byte(sm.Markdown), d.name(), run.Sha, "", prefix) | ||
| 190 | if err != nil { | 196 | if err != nil { | ||
| @@ -196,7 +202,25 @@ func (s *Server) jobSummaries(ctx context.Context, d *repoData, run domain.CIRun | |||||
| 196 | } | 202 | } | ||
| 197 | out = append(out, js) | 203 | out = append(out, js) | ||
| 198 | } | 204 | } | ||
| 199 | - | return out, nil | 205 | + | return out, more, nil |
| 206 | + | } | |||
| 207 | + | ||||
| 208 | + | // jobRunSha is the commit of the run a job belongs to, for the live fragments of | |||
| 209 | + | // its page. A job id that is not one, or a run that cannot be read, is not found. | |||
| 210 | + | func (s *Server) jobRunSha(ctx context.Context, repo, jobID string) (string, error) { | |||
| 211 | + | name, err := domain.ParseRepoName(repo) | |||
| 212 | + | if err != nil { | |||
| 213 | + | return "", domain.ErrNotFound | |||
| 214 | + | } | |||
| 215 | + | runID, _, _, ok := domain.ParseJobID(jobID) | |||
| 216 | + | if !ok { | |||
| 217 | + | return "", domain.ErrNotFound | |||
| 218 | + | } | |||
| 219 | + | d, err := s.cfg.Runs.GetRun(ctx, principal(ctx), name, runID, 0) | |||
| 220 | + | if err != nil { | |||
| 221 | + | return "", err | |||
| 222 | + | } | |||
| 223 | + | return d.Run.Sha, nil | |||
| 200 | } | 224 | } | ||
| 201 | 225 | ||||
| 202 | // runAnnotations reads the annotations of a run attempt and builds their views. | 226 | // runAnnotations reads the annotations of a run attempt and builds their views. | ||
M internal/adapters/web/actions_results_test.go +108 -1
| @@ -48,7 +48,7 @@ func TestSummariesAreRenderedSafely(t *testing.T) { | |||
| 48 | 48 | Jobs: []ports.JobView{job}, LatestAttempt: 1, | |
| 49 | 49 | }, nil) | |
| 50 | 50 | runs.EXPECT().ListAnnotations(mock.Anything, mock.Anything, repo, int64(1), int32(1), "").Return(ports.AnnotationList{}, nil) | |
| 51 | - | runs.EXPECT().GetStepSummaries(mock.Anything, mock.Anything, repo, jobID, int32(1)).Return(ports.SummaryList{ | |
| 51 | + | runs.EXPECT().GetStepSummaries(mock.Anything, mock.Anything, repo, jobID, int32(1), maxSummaryPageBytes).Return(ports.SummaryList{ | |
| 52 | 52 | Summaries: []domain.CIStepSummary{{Step: 2, Markdown: md}, {Step: 7, Markdown: "second"}}, Truncated: true, | |
| 53 | 53 | }, nil) | |
| 54 | 54 | browse := mocks.NewBrowseService(t) | |
| @@ -128,3 +128,110 @@ func TestRepoPath(t *testing.T) { | |||
| 128 | 128 | assert.False(t, repoPath(bad), "%q", bad) | |
| 129 | 129 | } | |
| 130 | 130 | } | |
| 131 | + | ||
| 132 | + | func endedJob(t *testing.T, repo domain.RepoName, id string) ports.JobView { | |
| 133 | + | t.Helper() | |
| 134 | + | return ports.JobView{CIJob: domain.CIJob{ | |
| 135 | + | ID: id, RunID: 1, Attempt: 1, RunAttempt: 1, Repo: repo, Key: "k", Name: "job " + id, | |
| 136 | + | Phase: domain.CIPhaseEnded, Conclusion: domain.CISuccess, | |
| 137 | + | }} | |
| 138 | + | } | |
| 139 | + | ||
| 140 | + | func runPageServer(t *testing.T, repo domain.RepoName, jobs []ports.JobView, runs *mocks.RunService) *httptest.ResponseRecorder { | |
| 141 | + | t.Helper() | |
| 142 | + | runs.EXPECT().GetRun(mock.Anything, mock.Anything, repo, int64(1), int32(0)).Return(ports.RunDetail{ | |
| 143 | + | Run: domain.CIRun{Repo: repo, ID: 1, Attempt: 1, Number: 1, WorkflowName: "ci", Sha: strings.Repeat("a", 40), Status: domain.CICompleted, Conclusion: domain.CISuccess}, | |
| 144 | + | Jobs: jobs, LatestAttempt: 1, | |
| 145 | + | }, nil) | |
| 146 | + | runs.EXPECT().ListAnnotations(mock.Anything, mock.Anything, repo, int64(1), int32(1), "").Return(ports.AnnotationList{}, nil) | |
| 147 | + | browse := mocks.NewBrowseService(t) | |
| 148 | + | browse.EXPECT().ListRefs(mock.Anything, mock.Anything, repo, mock.Anything).Return(ports.RefPage{}, nil).Maybe() | |
| 149 | + | srv := newTestServer(t, Config{Repos: reposServing(t, publicRepo(t, repo.String())), Browse: browse, Runs: runs}) | |
| 150 | + | rec := httptest.NewRecorder() | |
| 151 | + | srv.ServeHTTP(rec, httptest.NewRequestWithContext(context.Background(), http.MethodGet, "/proj/actions/runs/1", nil)) | |
| 152 | + | require.Equal(t, http.StatusOK, rec.Code) | |
| 153 | + | return rec | |
| 154 | + | } | |
| 155 | + | ||
| 156 | + | // GO-001: once the render budget is used up no other job is asked for its | |
| 157 | + | // summaries, and the page says that some are not shown. | |
| 158 | + | func TestSummariesStopAtTheBudget(t *testing.T) { | |
| 159 | + | t.Parallel() | |
| 160 | + | repo := repoName(t, "proj") | |
| 161 | + | jobs := []ports.JobView{endedJob(t, repo, "1-0-0"), endedJob(t, repo, "1-1-0"), endedJob(t, repo, "1-2-0")} | |
| 162 | + | runs := mocks.NewRunService(t) | |
| 163 | + | // The first job takes the whole budget; the other two are never asked | |
| 164 | + | // (the mock fails the test on a call it does not expect). | |
| 165 | + | full := strings.Repeat("x", int(maxSummaryPageBytes)) | |
| 166 | + | runs.EXPECT().GetStepSummaries(mock.Anything, mock.Anything, repo, "1-0-0", int32(1), maxSummaryPageBytes).Return(ports.SummaryList{ | |
| 167 | + | Summaries: []domain.CIStepSummary{{Step: 1, Markdown: full}}, | |
| 168 | + | }, nil).Once() | |
| 169 | + | body := runPageServer(t, repo, jobs, runs).Body.String() | |
| 170 | + | assert.Contains(t, body, "more summaries are not shown") | |
| 171 | + | assert.Contains(t, body, `aria-label="Summary of job 1-0-0"`) | |
| 172 | + | assert.NotContains(t, body, `aria-label="Summary of job 1-1-0"`, "no summary of the other jobs") | |
| 173 | + | } | |
| 174 | + | ||
| 175 | + | // The budget handed to the next job is what is left; a summary the store left | |
| 176 | + | // unread is shown as such, and so are the ones after it. | |
| 177 | + | func TestSummariesPassWhatIsLeftOfTheBudget(t *testing.T) { | |
| 178 | + | t.Parallel() | |
| 179 | + | repo := repoName(t, "proj") | |
| 180 | + | jobs := []ports.JobView{endedJob(t, repo, "1-0-0"), endedJob(t, repo, "1-1-0"), endedJob(t, repo, "1-2-0")} | |
| 181 | + | runs := mocks.NewRunService(t) | |
| 182 | + | runs.EXPECT().GetStepSummaries(mock.Anything, mock.Anything, repo, "1-0-0", int32(1), maxSummaryPageBytes).Return(ports.SummaryList{ | |
| 183 | + | Summaries: []domain.CIStepSummary{{Step: 1, Markdown: "hello"}}, | |
| 184 | + | }, nil).Once() | |
| 185 | + | runs.EXPECT().GetStepSummaries(mock.Anything, mock.Anything, repo, "1-1-0", int32(1), maxSummaryPageBytes-5).Return(ports.SummaryList{ | |
| 186 | + | Summaries: []domain.CIStepSummary{{Step: 1, Markdown: "world"}, {Step: 2, Omitted: true}, {Step: 3, Omitted: true}}, | |
| 187 | + | }, nil).Once() | |
| 188 | + | body := runPageServer(t, repo, jobs, runs).Body.String() | |
| 189 | + | assert.Contains(t, body, "hello") | |
| 190 | + | assert.Contains(t, body, "world") | |
| 191 | + | assert.Equal(t, 2, strings.Count(body, "this summary is not shown")) | |
| 192 | + | assert.Contains(t, body, "more summaries are not shown") | |
| 193 | + | assert.NotContains(t, body, `aria-label="Summary of job 1-2-0"`, "the third job is not asked once an omission happened") | |
| 194 | + | } | |
| 195 | + | ||
| 196 | + | func TestNoNoteWhenEverythingFits(t *testing.T) { | |
| 197 | + | t.Parallel() | |
| 198 | + | repo := repoName(t, "proj") | |
| 199 | + | runs := mocks.NewRunService(t) | |
| 200 | + | runs.EXPECT().GetStepSummaries(mock.Anything, mock.Anything, repo, "1-0-0", int32(1), maxSummaryPageBytes).Return(ports.SummaryList{ | |
| 201 | + | Summaries: []domain.CIStepSummary{{Step: 1, Markdown: "small"}}, | |
| 202 | + | }, nil).Once() | |
| 203 | + | body := runPageServer(t, repo, []ports.JobView{endedJob(t, repo, "1-0-0")}, runs).Body.String() | |
| 204 | + | assert.Contains(t, body, "small") | |
| 205 | + | assert.NotContains(t, body, "not shown") | |
| 206 | + | } | |
| 207 | + | ||
| 208 | + | // GO-002: a live job update reads the job and its annotations, never the run; | |
| 209 | + | // the commit comes from the stream, and a stream without it has the page fetch | |
| 210 | + | // itself again. | |
| 211 | + | func TestJobStateDoesNotReadTheRun(t *testing.T) { | |
| 212 | + | t.Parallel() | |
| 213 | + | const jobID = "1-0-0" | |
| 214 | + | repo := repoName(t, "proj") | |
| 215 | + | job := endedJob(t, repo, jobID) | |
| 216 | + | job.Steps = []domain.CIStep{{Number: 1, Name: "s", State: domain.CIStepCompleted, Conclusion: domain.CISuccess, HasLines: true}} | |
| 217 | + | job.Lines = 2 | |
| 218 | + | sha := strings.Repeat("c", 40) | |
| 219 | + | ||
| 220 | + | runs := mocks.NewRunService(t) // GetRun is not expected | |
| 221 | + | runs.EXPECT().GetJob(mock.Anything, mock.Anything, repo, jobID, int32(0)).Return(job, nil) | |
| 222 | + | runs.EXPECT().ListAnnotations(mock.Anything, mock.Anything, repo, int64(1), int32(0), jobID).Return(ports.AnnotationList{ | |
| 223 | + | Annotations: []ports.JobAnnotation{{JobID: jobID, Annotation: domain.CIAnnotation{Level: domain.AnnotationWarning, Message: "m", File: "a.go", StartLine: 2, Step: 1}}}, | |
| 224 | + | }, nil) | |
| 225 | + | browse := mocks.NewBrowseService(t) | |
| 226 | + | browse.EXPECT().ListRefs(mock.Anything, mock.Anything, repo, mock.Anything).Return(ports.RefPage{}, nil).Maybe() | |
| 227 | + | srv := newTestServer(t, Config{Repos: reposServing(t, publicRepo(t, "proj")), Browse: browse, Runs: runs}) | |
| 228 | + | ||
| 229 | + | frags, err := (&liveStream{s: srv, repo: "proj", view: "job", job: jobID, sha: sha}).jobState(context.Background()) | |
| 230 | + | require.NoError(t, err) | |
| 231 | + | require.Len(t, frags, 3) | |
| 232 | + | assert.Contains(t, frags[2].html, `href="/proj/blob/`+sha+`/a.go#L2"`, "the annotation links to the commit the stream was set up with") | |
| 233 | + | ||
| 234 | + | frags, err = (&liveStream{s: srv, repo: "proj", view: "job", job: jobID}).jobState(context.Background()) | |
| 235 | + | require.NoError(t, err) | |
| 236 | + | assert.Equal(t, gap, frags) | |
| 237 | + | } | |
| @@ -48,7 +48,7 @@ func TestSummariesAreRenderedSafely(t *testing.T) { | |||||
| 48 | Jobs: []ports.JobView{job}, LatestAttempt: 1, | 48 | Jobs: []ports.JobView{job}, LatestAttempt: 1, | ||
| 49 | }, nil) | 49 | }, nil) | ||
| 50 | runs.EXPECT().ListAnnotations(mock.Anything, mock.Anything, repo, int64(1), int32(1), "").Return(ports.AnnotationList{}, nil) | 50 | runs.EXPECT().ListAnnotations(mock.Anything, mock.Anything, repo, int64(1), int32(1), "").Return(ports.AnnotationList{}, nil) | ||
| 51 | - | runs.EXPECT().GetStepSummaries(mock.Anything, mock.Anything, repo, jobID, int32(1)).Return(ports.SummaryList{ | 51 | + | runs.EXPECT().GetStepSummaries(mock.Anything, mock.Anything, repo, jobID, int32(1), maxSummaryPageBytes).Return(ports.SummaryList{ |
| 52 | Summaries: []domain.CIStepSummary{{Step: 2, Markdown: md}, {Step: 7, Markdown: "second"}}, Truncated: true, | 52 | Summaries: []domain.CIStepSummary{{Step: 2, Markdown: md}, {Step: 7, Markdown: "second"}}, Truncated: true, | ||
| 53 | }, nil) | 53 | }, nil) | ||
| 54 | browse := mocks.NewBrowseService(t) | 54 | browse := mocks.NewBrowseService(t) | ||
| @@ -128,3 +128,110 @@ func TestRepoPath(t *testing.T) { | |||||
| 128 | assert.False(t, repoPath(bad), "%q", bad) | 128 | assert.False(t, repoPath(bad), "%q", bad) | ||
| 129 | } | 129 | } | ||
| 130 | } | 130 | } | ||
| 131 | + | ||||
| 132 | + | func endedJob(t *testing.T, repo domain.RepoName, id string) ports.JobView { | |||
| 133 | + | t.Helper() | |||
| 134 | + | return ports.JobView{CIJob: domain.CIJob{ | |||
| 135 | + | ID: id, RunID: 1, Attempt: 1, RunAttempt: 1, Repo: repo, Key: "k", Name: "job " + id, | |||
| 136 | + | Phase: domain.CIPhaseEnded, Conclusion: domain.CISuccess, | |||
| 137 | + | }} | |||
| 138 | + | } | |||
| 139 | + | ||||
| 140 | + | func runPageServer(t *testing.T, repo domain.RepoName, jobs []ports.JobView, runs *mocks.RunService) *httptest.ResponseRecorder { | |||
| 141 | + | t.Helper() | |||
| 142 | + | runs.EXPECT().GetRun(mock.Anything, mock.Anything, repo, int64(1), int32(0)).Return(ports.RunDetail{ | |||
| 143 | + | Run: domain.CIRun{Repo: repo, ID: 1, Attempt: 1, Number: 1, WorkflowName: "ci", Sha: strings.Repeat("a", 40), Status: domain.CICompleted, Conclusion: domain.CISuccess}, | |||
| 144 | + | Jobs: jobs, LatestAttempt: 1, | |||
| 145 | + | }, nil) | |||
| 146 | + | runs.EXPECT().ListAnnotations(mock.Anything, mock.Anything, repo, int64(1), int32(1), "").Return(ports.AnnotationList{}, nil) | |||
| 147 | + | browse := mocks.NewBrowseService(t) | |||
| 148 | + | browse.EXPECT().ListRefs(mock.Anything, mock.Anything, repo, mock.Anything).Return(ports.RefPage{}, nil).Maybe() | |||
| 149 | + | srv := newTestServer(t, Config{Repos: reposServing(t, publicRepo(t, repo.String())), Browse: browse, Runs: runs}) | |||
| 150 | + | rec := httptest.NewRecorder() | |||
| 151 | + | srv.ServeHTTP(rec, httptest.NewRequestWithContext(context.Background(), http.MethodGet, "/proj/actions/runs/1", nil)) | |||
| 152 | + | require.Equal(t, http.StatusOK, rec.Code) | |||
| 153 | + | return rec | |||
| 154 | + | } | |||
| 155 | + | ||||
| 156 | + | // GO-001: once the render budget is used up no other job is asked for its | |||
| 157 | + | // summaries, and the page says that some are not shown. | |||
| 158 | + | func TestSummariesStopAtTheBudget(t *testing.T) { | |||
| 159 | + | t.Parallel() | |||
| 160 | + | repo := repoName(t, "proj") | |||
| 161 | + | jobs := []ports.JobView{endedJob(t, repo, "1-0-0"), endedJob(t, repo, "1-1-0"), endedJob(t, repo, "1-2-0")} | |||
| 162 | + | runs := mocks.NewRunService(t) | |||
| 163 | + | // The first job takes the whole budget; the other two are never asked | |||
| 164 | + | // (the mock fails the test on a call it does not expect). | |||
| 165 | + | full := strings.Repeat("x", int(maxSummaryPageBytes)) | |||
| 166 | + | runs.EXPECT().GetStepSummaries(mock.Anything, mock.Anything, repo, "1-0-0", int32(1), maxSummaryPageBytes).Return(ports.SummaryList{ | |||
| 167 | + | Summaries: []domain.CIStepSummary{{Step: 1, Markdown: full}}, | |||
| 168 | + | }, nil).Once() | |||
| 169 | + | body := runPageServer(t, repo, jobs, runs).Body.String() | |||
| 170 | + | assert.Contains(t, body, "more summaries are not shown") | |||
| 171 | + | assert.Contains(t, body, `aria-label="Summary of job 1-0-0"`) | |||
| 172 | + | assert.NotContains(t, body, `aria-label="Summary of job 1-1-0"`, "no summary of the other jobs") | |||
| 173 | + | } | |||
| 174 | + | ||||
| 175 | + | // The budget handed to the next job is what is left; a summary the store left | |||
| 176 | + | // unread is shown as such, and so are the ones after it. | |||
| 177 | + | func TestSummariesPassWhatIsLeftOfTheBudget(t *testing.T) { | |||
| 178 | + | t.Parallel() | |||
| 179 | + | repo := repoName(t, "proj") | |||
| 180 | + | jobs := []ports.JobView{endedJob(t, repo, "1-0-0"), endedJob(t, repo, "1-1-0"), endedJob(t, repo, "1-2-0")} | |||
| 181 | + | runs := mocks.NewRunService(t) | |||
| 182 | + | runs.EXPECT().GetStepSummaries(mock.Anything, mock.Anything, repo, "1-0-0", int32(1), maxSummaryPageBytes).Return(ports.SummaryList{ | |||
| 183 | + | Summaries: []domain.CIStepSummary{{Step: 1, Markdown: "hello"}}, | |||
| 184 | + | }, nil).Once() | |||
| 185 | + | runs.EXPECT().GetStepSummaries(mock.Anything, mock.Anything, repo, "1-1-0", int32(1), maxSummaryPageBytes-5).Return(ports.SummaryList{ | |||
| 186 | + | Summaries: []domain.CIStepSummary{{Step: 1, Markdown: "world"}, {Step: 2, Omitted: true}, {Step: 3, Omitted: true}}, | |||
| 187 | + | }, nil).Once() | |||
| 188 | + | body := runPageServer(t, repo, jobs, runs).Body.String() | |||
| 189 | + | assert.Contains(t, body, "hello") | |||
| 190 | + | assert.Contains(t, body, "world") | |||
| 191 | + | assert.Equal(t, 2, strings.Count(body, "this summary is not shown")) | |||
| 192 | + | assert.Contains(t, body, "more summaries are not shown") | |||
| 193 | + | assert.NotContains(t, body, `aria-label="Summary of job 1-2-0"`, "the third job is not asked once an omission happened") | |||
| 194 | + | } | |||
| 195 | + | ||||
| 196 | + | func TestNoNoteWhenEverythingFits(t *testing.T) { | |||
| 197 | + | t.Parallel() | |||
| 198 | + | repo := repoName(t, "proj") | |||
| 199 | + | runs := mocks.NewRunService(t) | |||
| 200 | + | runs.EXPECT().GetStepSummaries(mock.Anything, mock.Anything, repo, "1-0-0", int32(1), maxSummaryPageBytes).Return(ports.SummaryList{ | |||
| 201 | + | Summaries: []domain.CIStepSummary{{Step: 1, Markdown: "small"}}, | |||
| 202 | + | }, nil).Once() | |||
| 203 | + | body := runPageServer(t, repo, []ports.JobView{endedJob(t, repo, "1-0-0")}, runs).Body.String() | |||
| 204 | + | assert.Contains(t, body, "small") | |||
| 205 | + | assert.NotContains(t, body, "not shown") | |||
| 206 | + | } | |||
| 207 | + | ||||
| 208 | + | // GO-002: a live job update reads the job and its annotations, never the run; | |||
| 209 | + | // the commit comes from the stream, and a stream without it has the page fetch | |||
| 210 | + | // itself again. | |||
| 211 | + | func TestJobStateDoesNotReadTheRun(t *testing.T) { | |||
| 212 | + | t.Parallel() | |||
| 213 | + | const jobID = "1-0-0" | |||
| 214 | + | repo := repoName(t, "proj") | |||
| 215 | + | job := endedJob(t, repo, jobID) | |||
| 216 | + | job.Steps = []domain.CIStep{{Number: 1, Name: "s", State: domain.CIStepCompleted, Conclusion: domain.CISuccess, HasLines: true}} | |||
| 217 | + | job.Lines = 2 | |||
| 218 | + | sha := strings.Repeat("c", 40) | |||
| 219 | + | ||||
| 220 | + | runs := mocks.NewRunService(t) // GetRun is not expected | |||
| 221 | + | runs.EXPECT().GetJob(mock.Anything, mock.Anything, repo, jobID, int32(0)).Return(job, nil) | |||
| 222 | + | runs.EXPECT().ListAnnotations(mock.Anything, mock.Anything, repo, int64(1), int32(0), jobID).Return(ports.AnnotationList{ | |||
| 223 | + | Annotations: []ports.JobAnnotation{{JobID: jobID, Annotation: domain.CIAnnotation{Level: domain.AnnotationWarning, Message: "m", File: "a.go", StartLine: 2, Step: 1}}}, | |||
| 224 | + | }, nil) | |||
| 225 | + | browse := mocks.NewBrowseService(t) | |||
| 226 | + | browse.EXPECT().ListRefs(mock.Anything, mock.Anything, repo, mock.Anything).Return(ports.RefPage{}, nil).Maybe() | |||
| 227 | + | srv := newTestServer(t, Config{Repos: reposServing(t, publicRepo(t, "proj")), Browse: browse, Runs: runs}) | |||
| 228 | + | ||||
| 229 | + | frags, err := (&liveStream{s: srv, repo: "proj", view: "job", job: jobID, sha: sha}).jobState(context.Background()) | |||
| 230 | + | require.NoError(t, err) | |||
| 231 | + | require.Len(t, frags, 3) | |||
| 232 | + | assert.Contains(t, frags[2].html, `href="/proj/blob/`+sha+`/a.go#L2"`, "the annotation links to the commit the stream was set up with") | |||
| 233 | + | ||||
| 234 | + | frags, err = (&liveStream{s: srv, repo: "proj", view: "job", job: jobID}).jobState(context.Background()) | |||
| 235 | + | require.NoError(t, err) | |||
| 236 | + | assert.Equal(t, gap, frags) | |||
| 237 | + | } | |||
M internal/adapters/web/actions_templ.go +355 -336
| @@ -495,7 +495,7 @@ func RunDetail(l Layout, p RunPage) templ.Component { | |||
| 495 | 495 | if templ_7745c5c3_Err != nil { | |
| 496 | 496 | return templ_7745c5c3_Err | |
| 497 | 497 | } | |
| 498 | - | templ_7745c5c3_Err = RunSummaries(p.Summaries).Render(ctx, templ_7745c5c3_Buffer) | |
| 498 | + | templ_7745c5c3_Err = RunSummaries(p.Summaries, p.SummariesMore).Render(ctx, templ_7745c5c3_Buffer) | |
| 499 | 499 | if templ_7745c5c3_Err != nil { | |
| 500 | 500 | return templ_7745c5c3_Err | |
| 501 | 501 | } | |
| @@ -1271,7 +1271,7 @@ func JobAnnotations(anns []AnnotationView, more bool) templ.Component { | |||
| 1271 | 1271 | // RunSummaries is the job summaries of a run, one block per step that wrote | |
| 1272 | 1272 | // one. The Markdown is rendered by the README renderer: raw HTML dropped, URLs | |
| 1273 | 1273 | // filtered, images shown as their alt text. | |
| 1274 | - | func RunSummaries(sums []JobSummaries) templ.Component { | |
| 1274 | + | func RunSummaries(sums []JobSummaries, more bool) templ.Component { | |
| 1275 | 1275 | return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) { | |
| 1276 | 1276 | templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context | |
| 1277 | 1277 | if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil { | |
| @@ -1431,6 +1431,25 @@ func RunSummaries(sums []JobSummaries) templ.Component { | |||
| 1431 | 1431 | return templ_7745c5c3_Err | |
| 1432 | 1432 | } | |
| 1433 | 1433 | } | |
| 1434 | + | if more { | |
| 1435 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 119, "<p class=\"mute\">more summaries are not shown: the summaries of the page are over ") | |
| 1436 | + | if templ_7745c5c3_Err != nil { | |
| 1437 | + | return templ_7745c5c3_Err | |
| 1438 | + | } | |
| 1439 | + | var templ_7745c5c3_Var76 string | |
| 1440 | + | templ_7745c5c3_Var76, templ_7745c5c3_Err = templ.JoinStringErrs(humanSize(maxSummaryPageBytes)) | |
| 1441 | + | if templ_7745c5c3_Err != nil { | |
| 1442 | + | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 211, Col: 115} | |
| 1443 | + | } | |
| 1444 | + | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var76)) | |
| 1445 | + | if templ_7745c5c3_Err != nil { | |
| 1446 | + | return templ_7745c5c3_Err | |
| 1447 | + | } | |
| 1448 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 120, ".</p>") | |
| 1449 | + | if templ_7745c5c3_Err != nil { | |
| 1450 | + | return templ_7745c5c3_Err | |
| 1451 | + | } | |
| 1452 | + | } | |
| 1434 | 1453 | return nil | |
| 1435 | 1454 | }) | |
| 1436 | 1455 | } | |
| @@ -1451,256 +1470,256 @@ func runRail(p RunPage) templ.Component { | |||
| 1451 | 1470 | }() | |
| 1452 | 1471 | } | |
| 1453 | 1472 | ctx = templ.InitializeContext(ctx) | |
| 1454 | - | templ_7745c5c3_Var76 := templ.GetChildren(ctx) | |
| 1455 | - | if templ_7745c5c3_Var76 == nil { | |
| 1456 | - | templ_7745c5c3_Var76 = templ.NopComponent | |
| 1473 | + | templ_7745c5c3_Var77 := templ.GetChildren(ctx) | |
| 1474 | + | if templ_7745c5c3_Var77 == nil { | |
| 1475 | + | templ_7745c5c3_Var77 = templ.NopComponent | |
| 1457 | 1476 | } | |
| 1458 | 1477 | ctx = templ.ClearChildren(ctx) | |
| 1459 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 119, "<section aria-labelledby=\"r-run\"><h2 id=\"r-run\">Run</h2><dl class=\"kv\"><dt>result</dt><dd>") | |
| 1478 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 121, "<section aria-labelledby=\"r-run\"><h2 id=\"r-run\">Run</h2><dl class=\"kv\"><dt>result</dt><dd>") | |
| 1460 | 1479 | if templ_7745c5c3_Err != nil { | |
| 1461 | 1480 | return templ_7745c5c3_Err | |
| 1462 | 1481 | } | |
| 1463 | - | var templ_7745c5c3_Var77 string | |
| 1464 | - | templ_7745c5c3_Var77, templ_7745c5c3_Err = templ.JoinStringErrs(p.State) | |
| 1482 | + | var templ_7745c5c3_Var78 string | |
| 1483 | + | templ_7745c5c3_Var78, templ_7745c5c3_Err = templ.JoinStringErrs(p.State) | |
| 1465 | 1484 | if templ_7745c5c3_Err != nil { | |
| 1466 | - | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 217, Col: 16} | |
| 1467 | - | } | |
| 1468 | - | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var77)) | |
| 1469 | - | if templ_7745c5c3_Err != nil { | |
| 1470 | - | return templ_7745c5c3_Err | |
| 1471 | - | } | |
| 1472 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 120, "</dd><dt>commit</dt><dd><a href=\"") | |
| 1473 | - | if templ_7745c5c3_Err != nil { | |
| 1474 | - | return templ_7745c5c3_Err | |
| 1475 | - | } | |
| 1476 | - | var templ_7745c5c3_Var78 templ.SafeURL | |
| 1477 | - | templ_7745c5c3_Var78, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.CHref)) | |
| 1478 | - | if templ_7745c5c3_Err != nil { | |
| 1479 | - | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 219, Col: 39} | |
| 1485 | + | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 220, Col: 16} | |
| 1480 | 1486 | } | |
| 1481 | 1487 | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var78)) | |
| 1482 | 1488 | if templ_7745c5c3_Err != nil { | |
| 1483 | 1489 | return templ_7745c5c3_Err | |
| 1484 | 1490 | } | |
| 1485 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 121, "\">") | |
| 1491 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 122, "</dd><dt>commit</dt><dd><a href=\"") | |
| 1486 | 1492 | if templ_7745c5c3_Err != nil { | |
| 1487 | 1493 | return templ_7745c5c3_Err | |
| 1488 | 1494 | } | |
| 1489 | - | var templ_7745c5c3_Var79 string | |
| 1490 | - | templ_7745c5c3_Var79, templ_7745c5c3_Err = templ.JoinStringErrs(p.Short) | |
| 1495 | + | var templ_7745c5c3_Var79 templ.SafeURL | |
| 1496 | + | templ_7745c5c3_Var79, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.CHref)) | |
| 1491 | 1497 | if templ_7745c5c3_Err != nil { | |
| 1492 | - | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 219, Col: 51} | |
| 1498 | + | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 222, Col: 39} | |
| 1493 | 1499 | } | |
| 1494 | 1500 | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var79)) | |
| 1495 | 1501 | if templ_7745c5c3_Err != nil { | |
| 1496 | 1502 | return templ_7745c5c3_Err | |
| 1497 | 1503 | } | |
| 1498 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 122, "</a></dd><dt>ref</dt><dd><a href=\"") | |
| 1504 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 123, "\">") | |
| 1499 | 1505 | if templ_7745c5c3_Err != nil { | |
| 1500 | 1506 | return templ_7745c5c3_Err | |
| 1501 | 1507 | } | |
| 1502 | - | var templ_7745c5c3_Var80 templ.SafeURL | |
| 1503 | - | templ_7745c5c3_Var80, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.RefHref)) | |
| 1508 | + | var templ_7745c5c3_Var80 string | |
| 1509 | + | templ_7745c5c3_Var80, templ_7745c5c3_Err = templ.JoinStringErrs(p.Short) | |
| 1504 | 1510 | if templ_7745c5c3_Err != nil { | |
| 1505 | - | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 221, Col: 41} | |
| 1511 | + | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 222, Col: 51} | |
| 1506 | 1512 | } | |
| 1507 | 1513 | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var80)) | |
| 1508 | 1514 | if templ_7745c5c3_Err != nil { | |
| 1509 | 1515 | return templ_7745c5c3_Err | |
| 1510 | 1516 | } | |
| 1511 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 123, "\">") | |
| 1517 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 124, "</a></dd><dt>ref</dt><dd><a href=\"") | |
| 1512 | 1518 | if templ_7745c5c3_Err != nil { | |
| 1513 | 1519 | return templ_7745c5c3_Err | |
| 1514 | 1520 | } | |
| 1515 | - | var templ_7745c5c3_Var81 string | |
| 1516 | - | templ_7745c5c3_Var81, templ_7745c5c3_Err = templ.JoinStringErrs(p.Ref) | |
| 1521 | + | var templ_7745c5c3_Var81 templ.SafeURL | |
| 1522 | + | templ_7745c5c3_Var81, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.RefHref)) | |
| 1517 | 1523 | if templ_7745c5c3_Err != nil { | |
| 1518 | - | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 221, Col: 51} | |
| 1524 | + | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 224, Col: 41} | |
| 1519 | 1525 | } | |
| 1520 | 1526 | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var81)) | |
| 1521 | 1527 | if templ_7745c5c3_Err != nil { | |
| 1522 | 1528 | return templ_7745c5c3_Err | |
| 1523 | 1529 | } | |
| 1524 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 124, "</a></dd><dt>actor</dt><dd>") | |
| 1530 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 125, "\">") | |
| 1525 | 1531 | if templ_7745c5c3_Err != nil { | |
| 1526 | 1532 | return templ_7745c5c3_Err | |
| 1527 | 1533 | } | |
| 1528 | 1534 | var templ_7745c5c3_Var82 string | |
| 1529 | - | templ_7745c5c3_Var82, templ_7745c5c3_Err = templ.JoinStringErrs(p.Actor) | |
| 1535 | + | templ_7745c5c3_Var82, templ_7745c5c3_Err = templ.JoinStringErrs(p.Ref) | |
| 1530 | 1536 | if templ_7745c5c3_Err != nil { | |
| 1531 | - | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 223, Col: 16} | |
| 1537 | + | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 224, Col: 51} | |
| 1532 | 1538 | } | |
| 1533 | 1539 | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var82)) | |
| 1534 | 1540 | if templ_7745c5c3_Err != nil { | |
| 1535 | 1541 | return templ_7745c5c3_Err | |
| 1536 | 1542 | } | |
| 1537 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 125, "</dd><dt>attempt</dt><dd>") | |
| 1543 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 126, "</a></dd><dt>actor</dt><dd>") | |
| 1538 | 1544 | if templ_7745c5c3_Err != nil { | |
| 1539 | 1545 | return templ_7745c5c3_Err | |
| 1540 | 1546 | } | |
| 1541 | 1547 | var templ_7745c5c3_Var83 string | |
| 1542 | - | templ_7745c5c3_Var83, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(int(p.Attempt))) | |
| 1548 | + | templ_7745c5c3_Var83, templ_7745c5c3_Err = templ.JoinStringErrs(p.Actor) | |
| 1543 | 1549 | if templ_7745c5c3_Err != nil { | |
| 1544 | - | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 225, Col: 29} | |
| 1550 | + | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 226, Col: 16} | |
| 1545 | 1551 | } | |
| 1546 | 1552 | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var83)) | |
| 1547 | 1553 | if templ_7745c5c3_Err != nil { | |
| 1548 | 1554 | return templ_7745c5c3_Err | |
| 1549 | 1555 | } | |
| 1550 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 126, " of ") | |
| 1556 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 127, "</dd><dt>attempt</dt><dd>") | |
| 1551 | 1557 | if templ_7745c5c3_Err != nil { | |
| 1552 | 1558 | return templ_7745c5c3_Err | |
| 1553 | 1559 | } | |
| 1554 | 1560 | var templ_7745c5c3_Var84 string | |
| 1555 | - | templ_7745c5c3_Var84, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(int(p.Latest))) | |
| 1561 | + | templ_7745c5c3_Var84, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(int(p.Attempt))) | |
| 1556 | 1562 | if templ_7745c5c3_Err != nil { | |
| 1557 | - | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 225, Col: 56} | |
| 1563 | + | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 228, Col: 29} | |
| 1558 | 1564 | } | |
| 1559 | 1565 | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var84)) | |
| 1560 | 1566 | if templ_7745c5c3_Err != nil { | |
| 1561 | 1567 | return templ_7745c5c3_Err | |
| 1562 | 1568 | } | |
| 1563 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 127, "</dd></dl>") | |
| 1569 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 128, " of ") | |
| 1570 | + | if templ_7745c5c3_Err != nil { | |
| 1571 | + | return templ_7745c5c3_Err | |
| 1572 | + | } | |
| 1573 | + | var templ_7745c5c3_Var85 string | |
| 1574 | + | templ_7745c5c3_Var85, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(int(p.Latest))) | |
| 1575 | + | if templ_7745c5c3_Err != nil { | |
| 1576 | + | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 228, Col: 56} | |
| 1577 | + | } | |
| 1578 | + | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var85)) | |
| 1579 | + | if templ_7745c5c3_Err != nil { | |
| 1580 | + | return templ_7745c5c3_Err | |
| 1581 | + | } | |
| 1582 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 129, "</dd></dl>") | |
| 1564 | 1583 | if templ_7745c5c3_Err != nil { | |
| 1565 | 1584 | return templ_7745c5c3_Err | |
| 1566 | 1585 | } | |
| 1567 | 1586 | if len(p.Attempts) > 0 { | |
| 1568 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 128, "<ul class=\"attempts\">") | |
| 1587 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 130, "<ul class=\"attempts\">") | |
| 1569 | 1588 | if templ_7745c5c3_Err != nil { | |
| 1570 | 1589 | return templ_7745c5c3_Err | |
| 1571 | 1590 | } | |
| 1572 | 1591 | for _, a := range p.Attempts { | |
| 1573 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 129, "<li>") | |
| 1592 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 131, "<li>") | |
| 1574 | 1593 | if templ_7745c5c3_Err != nil { | |
| 1575 | 1594 | return templ_7745c5c3_Err | |
| 1576 | 1595 | } | |
| 1577 | 1596 | if a.Current { | |
| 1578 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 130, "<span aria-current=\"page\">") | |
| 1597 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 132, "<span aria-current=\"page\">") | |
| 1579 | 1598 | if templ_7745c5c3_Err != nil { | |
| 1580 | 1599 | return templ_7745c5c3_Err | |
| 1581 | 1600 | } | |
| 1582 | - | var templ_7745c5c3_Var85 string | |
| 1583 | - | templ_7745c5c3_Var85, templ_7745c5c3_Err = templ.JoinStringErrs(a.Label) | |
| 1601 | + | var templ_7745c5c3_Var86 string | |
| 1602 | + | templ_7745c5c3_Var86, templ_7745c5c3_Err = templ.JoinStringErrs(a.Label) | |
| 1584 | 1603 | if templ_7745c5c3_Err != nil { | |
| 1585 | - | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 232, Col: 42} | |
| 1604 | + | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 235, Col: 42} | |
| 1586 | 1605 | } | |
| 1587 | - | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var85)) | |
| 1606 | + | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var86)) | |
| 1588 | 1607 | if templ_7745c5c3_Err != nil { | |
| 1589 | 1608 | return templ_7745c5c3_Err | |
| 1590 | 1609 | } | |
| 1591 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 131, "</span>") | |
| 1610 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 133, "</span>") | |
| 1592 | 1611 | if templ_7745c5c3_Err != nil { | |
| 1593 | 1612 | return templ_7745c5c3_Err | |
| 1594 | 1613 | } | |
| 1595 | 1614 | } else { | |
| 1596 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 132, "<a href=\"") | |
| 1615 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 134, "<a href=\"") | |
| 1597 | 1616 | if templ_7745c5c3_Err != nil { | |
| 1598 | 1617 | return templ_7745c5c3_Err | |
| 1599 | 1618 | } | |
| 1600 | - | var templ_7745c5c3_Var86 templ.SafeURL | |
| 1601 | - | templ_7745c5c3_Var86, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(a.Href)) | |
| 1619 | + | var templ_7745c5c3_Var87 templ.SafeURL | |
| 1620 | + | templ_7745c5c3_Var87, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(a.Href)) | |
| 1602 | 1621 | if templ_7745c5c3_Err != nil { | |
| 1603 | - | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 234, Col: 38} | |
| 1622 | + | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 237, Col: 38} | |
| 1604 | 1623 | } | |
| 1605 | - | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var86)) | |
| 1624 | + | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var87)) | |
| 1606 | 1625 | if templ_7745c5c3_Err != nil { | |
| 1607 | 1626 | return templ_7745c5c3_Err | |
| 1608 | 1627 | } | |
| 1609 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 133, "\">") | |
| 1628 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 135, "\">") | |
| 1610 | 1629 | if templ_7745c5c3_Err != nil { | |
| 1611 | 1630 | return templ_7745c5c3_Err | |
| 1612 | 1631 | } | |
| 1613 | - | var templ_7745c5c3_Var87 string | |
| 1614 | - | templ_7745c5c3_Var87, templ_7745c5c3_Err = templ.JoinStringErrs(a.Label) | |
| 1632 | + | var templ_7745c5c3_Var88 string | |
| 1633 | + | templ_7745c5c3_Var88, templ_7745c5c3_Err = templ.JoinStringErrs(a.Label) | |
| 1615 | 1634 | if templ_7745c5c3_Err != nil { | |
| 1616 | - | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 234, Col: 50} | |
| 1635 | + | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 237, Col: 50} | |
| 1617 | 1636 | } | |
| 1618 | - | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var87)) | |
| 1637 | + | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var88)) | |
| 1619 | 1638 | if templ_7745c5c3_Err != nil { | |
| 1620 | 1639 | return templ_7745c5c3_Err | |
| 1621 | 1640 | } | |
| 1622 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 134, "</a>") | |
| 1641 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 136, "</a>") | |
| 1623 | 1642 | if templ_7745c5c3_Err != nil { | |
| 1624 | 1643 | return templ_7745c5c3_Err | |
| 1625 | 1644 | } | |
| 1626 | 1645 | } | |
| 1627 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 135, "</li>") | |
| 1646 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 137, "</li>") | |
| 1628 | 1647 | if templ_7745c5c3_Err != nil { | |
| 1629 | 1648 | return templ_7745c5c3_Err | |
| 1630 | 1649 | } | |
| 1631 | 1650 | } | |
| 1632 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 136, "</ul>") | |
| 1651 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 138, "</ul>") | |
| 1633 | 1652 | if templ_7745c5c3_Err != nil { | |
| 1634 | 1653 | return templ_7745c5c3_Err | |
| 1635 | 1654 | } | |
| 1636 | 1655 | } | |
| 1637 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 137, "</section>") | |
| 1656 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 139, "</section>") | |
| 1638 | 1657 | if templ_7745c5c3_Err != nil { | |
| 1639 | 1658 | return templ_7745c5c3_Err | |
| 1640 | 1659 | } | |
| 1641 | 1660 | if p.CancelAction != "" || p.RerunAction != "" { | |
| 1642 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 138, "<section aria-labelledby=\"r-act\" class=\"decide\"><h2 id=\"r-act\">Actions</h2><div class=\"d-btns\">") | |
| 1661 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 140, "<section aria-labelledby=\"r-act\" class=\"decide\"><h2 id=\"r-act\">Actions</h2><div class=\"d-btns\">") | |
| 1643 | 1662 | if templ_7745c5c3_Err != nil { | |
| 1644 | 1663 | return templ_7745c5c3_Err | |
| 1645 | 1664 | } | |
| 1646 | 1665 | if p.CancelAction != "" { | |
| 1647 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 139, "<form method=\"post\" action=\"") | |
| 1666 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 141, "<form method=\"post\" action=\"") | |
| 1648 | 1667 | if templ_7745c5c3_Err != nil { | |
| 1649 | 1668 | return templ_7745c5c3_Err | |
| 1650 | 1669 | } | |
| 1651 | - | var templ_7745c5c3_Var88 templ.SafeURL | |
| 1652 | - | templ_7745c5c3_Var88, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.CancelAction)) | |
| 1670 | + | var templ_7745c5c3_Var89 templ.SafeURL | |
| 1671 | + | templ_7745c5c3_Var89, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.CancelAction)) | |
| 1653 | 1672 | if templ_7745c5c3_Err != nil { | |
| 1654 | - | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 246, Col: 63} | |
| 1673 | + | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 249, Col: 63} | |
| 1655 | 1674 | } | |
| 1656 | - | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var88)) | |
| 1675 | + | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var89)) | |
| 1657 | 1676 | if templ_7745c5c3_Err != nil { | |
| 1658 | 1677 | return templ_7745c5c3_Err | |
| 1659 | 1678 | } | |
| 1660 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 140, "\"><button type=\"submit\" class=\"btn\">Cancel run</button></form>") | |
| 1679 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 142, "\"><button type=\"submit\" class=\"btn\">Cancel run</button></form>") | |
| 1661 | 1680 | if templ_7745c5c3_Err != nil { | |
| 1662 | 1681 | return templ_7745c5c3_Err | |
| 1663 | 1682 | } | |
| 1664 | 1683 | } | |
| 1665 | 1684 | if p.RerunAction != "" { | |
| 1666 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 141, "<form method=\"post\" action=\"") | |
| 1685 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 143, "<form method=\"post\" action=\"") | |
| 1667 | 1686 | if templ_7745c5c3_Err != nil { | |
| 1668 | 1687 | return templ_7745c5c3_Err | |
| 1669 | 1688 | } | |
| 1670 | - | var templ_7745c5c3_Var89 templ.SafeURL | |
| 1671 | - | templ_7745c5c3_Var89, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.RerunAction)) | |
| 1689 | + | var templ_7745c5c3_Var90 templ.SafeURL | |
| 1690 | + | templ_7745c5c3_Var90, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.RerunAction)) | |
| 1672 | 1691 | if templ_7745c5c3_Err != nil { | |
| 1673 | - | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 249, Col: 62} | |
| 1692 | + | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 252, Col: 62} | |
| 1674 | 1693 | } | |
| 1675 | - | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var89)) | |
| 1694 | + | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var90)) | |
| 1676 | 1695 | if templ_7745c5c3_Err != nil { | |
| 1677 | 1696 | return templ_7745c5c3_Err | |
| 1678 | 1697 | } | |
| 1679 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 142, "\"><button type=\"submit\" class=\"btn primary\">Re-run all jobs</button></form>") | |
| 1698 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 144, "\"><button type=\"submit\" class=\"btn primary\">Re-run all jobs</button></form>") | |
| 1680 | 1699 | if templ_7745c5c3_Err != nil { | |
| 1681 | 1700 | return templ_7745c5c3_Err | |
| 1682 | 1701 | } | |
| 1683 | 1702 | } | |
| 1684 | 1703 | if p.CanRerunFailed { | |
| 1685 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 143, "<form method=\"post\" action=\"") | |
| 1704 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 145, "<form method=\"post\" action=\"") | |
| 1686 | 1705 | if templ_7745c5c3_Err != nil { | |
| 1687 | 1706 | return templ_7745c5c3_Err | |
| 1688 | 1707 | } | |
| 1689 | - | var templ_7745c5c3_Var90 templ.SafeURL | |
| 1690 | - | templ_7745c5c3_Var90, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.RerunFailedAction)) | |
| 1708 | + | var templ_7745c5c3_Var91 templ.SafeURL | |
| 1709 | + | templ_7745c5c3_Var91, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.RerunFailedAction)) | |
| 1691 | 1710 | if templ_7745c5c3_Err != nil { | |
| 1692 | - | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 252, Col: 68} | |
| 1711 | + | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 255, Col: 68} | |
| 1693 | 1712 | } | |
| 1694 | - | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var90)) | |
| 1713 | + | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var91)) | |
| 1695 | 1714 | if templ_7745c5c3_Err != nil { | |
| 1696 | 1715 | return templ_7745c5c3_Err | |
| 1697 | 1716 | } | |
| 1698 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 144, "\"><button type=\"submit\" class=\"btn\">Re-run failed jobs</button></form>") | |
| 1717 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 146, "\"><button type=\"submit\" class=\"btn\">Re-run failed jobs</button></form>") | |
| 1699 | 1718 | if templ_7745c5c3_Err != nil { | |
| 1700 | 1719 | return templ_7745c5c3_Err | |
| 1701 | 1720 | } | |
| 1702 | 1721 | } | |
| 1703 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 145, "</div></section>") | |
| 1722 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 147, "</div></section>") | |
| 1704 | 1723 | if templ_7745c5c3_Err != nil { | |
| 1705 | 1724 | return templ_7745c5c3_Err | |
| 1706 | 1725 | } | |
| @@ -1727,25 +1746,25 @@ func JobHead(j JobRow, total int64) templ.Component { | |||
| 1727 | 1746 | }() | |
| 1728 | 1747 | } | |
| 1729 | 1748 | ctx = templ.InitializeContext(ctx) | |
| 1730 | - | templ_7745c5c3_Var91 := templ.GetChildren(ctx) | |
| 1731 | - | if templ_7745c5c3_Var91 == nil { | |
| 1732 | - | templ_7745c5c3_Var91 = templ.NopComponent | |
| 1749 | + | templ_7745c5c3_Var92 := templ.GetChildren(ctx) | |
| 1750 | + | if templ_7745c5c3_Var92 == nil { | |
| 1751 | + | templ_7745c5c3_Var92 = templ.NopComponent | |
| 1733 | 1752 | } | |
| 1734 | 1753 | ctx = templ.ClearChildren(ctx) | |
| 1735 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 146, "<div id=\"job-head\" data-total=\"") | |
| 1754 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 148, "<div id=\"job-head\" data-total=\"") | |
| 1736 | 1755 | if templ_7745c5c3_Err != nil { | |
| 1737 | 1756 | return templ_7745c5c3_Err | |
| 1738 | 1757 | } | |
| 1739 | - | var templ_7745c5c3_Var92 string | |
| 1740 | - | templ_7745c5c3_Var92, templ_7745c5c3_Err = templ.ResolveAttributeValue(itoa64(total)) | |
| 1758 | + | var templ_7745c5c3_Var93 string | |
| 1759 | + | templ_7745c5c3_Var93, templ_7745c5c3_Err = templ.ResolveAttributeValue(itoa64(total)) | |
| 1741 | 1760 | if templ_7745c5c3_Err != nil { | |
| 1742 | - | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 262, Col: 46} | |
| 1761 | + | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 265, Col: 46} | |
| 1743 | 1762 | } | |
| 1744 | - | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var92) | |
| 1763 | + | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var93) | |
| 1745 | 1764 | if templ_7745c5c3_Err != nil { | |
| 1746 | 1765 | return templ_7745c5c3_Err | |
| 1747 | 1766 | } | |
| 1748 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 147, "\"><h2 class=\"run-h\">") | |
| 1767 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 149, "\"><h2 class=\"run-h\">") | |
| 1749 | 1768 | if templ_7745c5c3_Err != nil { | |
| 1750 | 1769 | return templ_7745c5c3_Err | |
| 1751 | 1770 | } | |
| @@ -1753,74 +1772,74 @@ func JobHead(j JobRow, total int64) templ.Component { | |||
| 1753 | 1772 | if templ_7745c5c3_Err != nil { | |
| 1754 | 1773 | return templ_7745c5c3_Err | |
| 1755 | 1774 | } | |
| 1756 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 148, "<span>") | |
| 1775 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 150, "<span>") | |
| 1757 | 1776 | if templ_7745c5c3_Err != nil { | |
| 1758 | 1777 | return templ_7745c5c3_Err | |
| 1759 | 1778 | } | |
| 1760 | - | var templ_7745c5c3_Var93 string | |
| 1761 | - | templ_7745c5c3_Var93, templ_7745c5c3_Err = templ.JoinStringErrs(j.Name) | |
| 1779 | + | var templ_7745c5c3_Var94 string | |
| 1780 | + | templ_7745c5c3_Var94, templ_7745c5c3_Err = templ.JoinStringErrs(j.Name) | |
| 1762 | 1781 | if templ_7745c5c3_Err != nil { | |
| 1763 | - | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 263, Col: 61} | |
| 1782 | + | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 266, Col: 61} | |
| 1764 | 1783 | } | |
| 1765 | - | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var93)) | |
| 1784 | + | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var94)) | |
| 1766 | 1785 | if templ_7745c5c3_Err != nil { | |
| 1767 | 1786 | return templ_7745c5c3_Err | |
| 1768 | 1787 | } | |
| 1769 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 149, "</span> <span class=\"dim\">") | |
| 1788 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 151, "</span> <span class=\"dim\">") | |
| 1770 | 1789 | if templ_7745c5c3_Err != nil { | |
| 1771 | 1790 | return templ_7745c5c3_Err | |
| 1772 | 1791 | } | |
| 1773 | - | var templ_7745c5c3_Var94 string | |
| 1774 | - | templ_7745c5c3_Var94, templ_7745c5c3_Err = templ.JoinStringErrs(j.State) | |
| 1792 | + | var templ_7745c5c3_Var95 string | |
| 1793 | + | templ_7745c5c3_Var95, templ_7745c5c3_Err = templ.JoinStringErrs(j.State) | |
| 1775 | 1794 | if templ_7745c5c3_Err != nil { | |
| 1776 | - | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 263, Col: 98} | |
| 1795 | + | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 266, Col: 98} | |
| 1777 | 1796 | } | |
| 1778 | - | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var94)) | |
| 1797 | + | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var95)) | |
| 1779 | 1798 | if templ_7745c5c3_Err != nil { | |
| 1780 | 1799 | return templ_7745c5c3_Err | |
| 1781 | 1800 | } | |
| 1782 | - | var templ_7745c5c3_Var95 string | |
| 1783 | - | templ_7745c5c3_Var95, templ_7745c5c3_Err = templ.JoinStringErrs(" ") | |
| 1801 | + | var templ_7745c5c3_Var96 string | |
| 1802 | + | templ_7745c5c3_Var96, templ_7745c5c3_Err = templ.JoinStringErrs(" ") | |
| 1784 | 1803 | if templ_7745c5c3_Err != nil { | |
| 1785 | - | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 263, Col: 105} | |
| 1804 | + | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 266, Col: 105} | |
| 1786 | 1805 | } | |
| 1787 | - | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var95)) | |
| 1806 | + | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var96)) | |
| 1788 | 1807 | if templ_7745c5c3_Err != nil { | |
| 1789 | 1808 | return templ_7745c5c3_Err | |
| 1790 | 1809 | } | |
| 1791 | - | var templ_7745c5c3_Var96 string | |
| 1792 | - | templ_7745c5c3_Var96, templ_7745c5c3_Err = templ.JoinStringErrs(j.Duration) | |
| 1810 | + | var templ_7745c5c3_Var97 string | |
| 1811 | + | templ_7745c5c3_Var97, templ_7745c5c3_Err = templ.JoinStringErrs(j.Duration) | |
| 1793 | 1812 | if templ_7745c5c3_Err != nil { | |
| 1794 | - | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 263, Col: 119} | |
| 1813 | + | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 266, Col: 119} | |
| 1795 | 1814 | } | |
| 1796 | - | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var96)) | |
| 1815 | + | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var97)) | |
| 1797 | 1816 | if templ_7745c5c3_Err != nil { | |
| 1798 | 1817 | return templ_7745c5c3_Err | |
| 1799 | 1818 | } | |
| 1800 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 150, "</span></h2>") | |
| 1819 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 152, "</span></h2>") | |
| 1801 | 1820 | if templ_7745c5c3_Err != nil { | |
| 1802 | 1821 | return templ_7745c5c3_Err | |
| 1803 | 1822 | } | |
| 1804 | 1823 | if j.Error != "" { | |
| 1805 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 151, "<p class=\"job-err\">") | |
| 1824 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 153, "<p class=\"job-err\">") | |
| 1806 | 1825 | if templ_7745c5c3_Err != nil { | |
| 1807 | 1826 | return templ_7745c5c3_Err | |
| 1808 | 1827 | } | |
| 1809 | - | var templ_7745c5c3_Var97 string | |
| 1810 | - | templ_7745c5c3_Var97, templ_7745c5c3_Err = templ.JoinStringErrs(j.Error) | |
| 1828 | + | var templ_7745c5c3_Var98 string | |
| 1829 | + | templ_7745c5c3_Var98, templ_7745c5c3_Err = templ.JoinStringErrs(j.Error) | |
| 1811 | 1830 | if templ_7745c5c3_Err != nil { | |
| 1812 | - | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 265, Col: 31} | |
| 1831 | + | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 268, Col: 31} | |
| 1813 | 1832 | } | |
| 1814 | - | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var97)) | |
| 1833 | + | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var98)) | |
| 1815 | 1834 | if templ_7745c5c3_Err != nil { | |
| 1816 | 1835 | return templ_7745c5c3_Err | |
| 1817 | 1836 | } | |
| 1818 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 152, "</p>") | |
| 1837 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 154, "</p>") | |
| 1819 | 1838 | if templ_7745c5c3_Err != nil { | |
| 1820 | 1839 | return templ_7745c5c3_Err | |
| 1821 | 1840 | } | |
| 1822 | 1841 | } | |
| 1823 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 153, "</div>") | |
| 1842 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 155, "</div>") | |
| 1824 | 1843 | if templ_7745c5c3_Err != nil { | |
| 1825 | 1844 | return templ_7745c5c3_Err | |
| 1826 | 1845 | } | |
| @@ -1845,17 +1864,17 @@ func JobSteps(steps []StepView) templ.Component { | |||
| 1845 | 1864 | }() | |
| 1846 | 1865 | } | |
| 1847 | 1866 | ctx = templ.InitializeContext(ctx) | |
| 1848 | - | templ_7745c5c3_Var98 := templ.GetChildren(ctx) | |
| 1849 | - | if templ_7745c5c3_Var98 == nil { | |
| 1850 | - | templ_7745c5c3_Var98 = templ.NopComponent | |
| 1867 | + | templ_7745c5c3_Var99 := templ.GetChildren(ctx) | |
| 1868 | + | if templ_7745c5c3_Var99 == nil { | |
| 1869 | + | templ_7745c5c3_Var99 = templ.NopComponent | |
| 1851 | 1870 | } | |
| 1852 | 1871 | ctx = templ.ClearChildren(ctx) | |
| 1853 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 154, "<ol class=\"steps\" id=\"job-steps\">") | |
| 1872 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 156, "<ol class=\"steps\" id=\"job-steps\">") | |
| 1854 | 1873 | if templ_7745c5c3_Err != nil { | |
| 1855 | 1874 | return templ_7745c5c3_Err | |
| 1856 | 1875 | } | |
| 1857 | 1876 | for _, s := range steps { | |
| 1858 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 155, "<li>") | |
| 1877 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 157, "<li>") | |
| 1859 | 1878 | if templ_7745c5c3_Err != nil { | |
| 1860 | 1879 | return templ_7745c5c3_Err | |
| 1861 | 1880 | } | |
| @@ -1864,74 +1883,74 @@ func JobSteps(steps []StepView) templ.Component { | |||
| 1864 | 1883 | return templ_7745c5c3_Err | |
| 1865 | 1884 | } | |
| 1866 | 1885 | if s.LogEnd > s.LogStart { | |
| 1867 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 156, "<a href=\"") | |
| 1886 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 158, "<a href=\"") | |
| 1868 | 1887 | if templ_7745c5c3_Err != nil { | |
| 1869 | 1888 | return templ_7745c5c3_Err | |
| 1870 | 1889 | } | |
| 1871 | - | var templ_7745c5c3_Var99 templ.SafeURL | |
| 1872 | - | templ_7745c5c3_Var99, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL("#L" + itoa64(s.LogStart))) | |
| 1890 | + | var templ_7745c5c3_Var100 templ.SafeURL | |
| 1891 | + | templ_7745c5c3_Var100, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL("#L" + itoa64(s.LogStart))) | |
| 1873 | 1892 | if templ_7745c5c3_Err != nil { | |
| 1874 | - | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 277, Col: 55} | |
| 1893 | + | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 280, Col: 55} | |
| 1875 | 1894 | } | |
| 1876 | - | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var99)) | |
| 1895 | + | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var100)) | |
| 1877 | 1896 | if templ_7745c5c3_Err != nil { | |
| 1878 | 1897 | return templ_7745c5c3_Err | |
| 1879 | 1898 | } | |
| 1880 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 157, "\">") | |
| 1899 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 159, "\">") | |
| 1881 | 1900 | if templ_7745c5c3_Err != nil { | |
| 1882 | 1901 | return templ_7745c5c3_Err | |
| 1883 | 1902 | } | |
| 1884 | - | var templ_7745c5c3_Var100 string | |
| 1885 | - | templ_7745c5c3_Var100, templ_7745c5c3_Err = templ.JoinStringErrs(s.Name) | |
| 1903 | + | var templ_7745c5c3_Var101 string | |
| 1904 | + | templ_7745c5c3_Var101, templ_7745c5c3_Err = templ.JoinStringErrs(s.Name) | |
| 1886 | 1905 | if templ_7745c5c3_Err != nil { | |
| 1887 | - | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 277, Col: 66} | |
| 1906 | + | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 280, Col: 66} | |
| 1888 | 1907 | } | |
| 1889 | - | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var100)) | |
| 1908 | + | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var101)) | |
| 1890 | 1909 | if templ_7745c5c3_Err != nil { | |
| 1891 | 1910 | return templ_7745c5c3_Err | |
| 1892 | 1911 | } | |
| 1893 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 158, "</a> ") | |
| 1912 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 160, "</a> ") | |
| 1894 | 1913 | if templ_7745c5c3_Err != nil { | |
| 1895 | 1914 | return templ_7745c5c3_Err | |
| 1896 | 1915 | } | |
| 1897 | 1916 | } else { | |
| 1898 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 159, "<span>") | |
| 1917 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 161, "<span>") | |
| 1899 | 1918 | if templ_7745c5c3_Err != nil { | |
| 1900 | 1919 | return templ_7745c5c3_Err | |
| 1901 | 1920 | } | |
| 1902 | - | var templ_7745c5c3_Var101 string | |
| 1903 | - | templ_7745c5c3_Var101, templ_7745c5c3_Err = templ.JoinStringErrs(s.Name) | |
| 1921 | + | var templ_7745c5c3_Var102 string | |
| 1922 | + | templ_7745c5c3_Var102, templ_7745c5c3_Err = templ.JoinStringErrs(s.Name) | |
| 1904 | 1923 | if templ_7745c5c3_Err != nil { | |
| 1905 | - | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 279, Col: 19} | |
| 1924 | + | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 282, Col: 19} | |
| 1906 | 1925 | } | |
| 1907 | - | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var101)) | |
| 1926 | + | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var102)) | |
| 1908 | 1927 | if templ_7745c5c3_Err != nil { | |
| 1909 | 1928 | return templ_7745c5c3_Err | |
| 1910 | 1929 | } | |
| 1911 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 160, "</span> ") | |
| 1930 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 162, "</span> ") | |
| 1912 | 1931 | if templ_7745c5c3_Err != nil { | |
| 1913 | 1932 | return templ_7745c5c3_Err | |
| 1914 | 1933 | } | |
| 1915 | 1934 | } | |
| 1916 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 161, "<span class=\"dim\">") | |
| 1935 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 163, "<span class=\"dim\">") | |
| 1917 | 1936 | if templ_7745c5c3_Err != nil { | |
| 1918 | 1937 | return templ_7745c5c3_Err | |
| 1919 | 1938 | } | |
| 1920 | - | var templ_7745c5c3_Var102 string | |
| 1921 | - | templ_7745c5c3_Var102, templ_7745c5c3_Err = templ.JoinStringErrs(s.Duration) | |
| 1939 | + | var templ_7745c5c3_Var103 string | |
| 1940 | + | templ_7745c5c3_Var103, templ_7745c5c3_Err = templ.JoinStringErrs(s.Duration) | |
| 1922 | 1941 | if templ_7745c5c3_Err != nil { | |
| 1923 | - | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 281, Col: 34} | |
| 1942 | + | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 284, Col: 34} | |
| 1924 | 1943 | } | |
| 1925 | - | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var102)) | |
| 1944 | + | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var103)) | |
| 1926 | 1945 | if templ_7745c5c3_Err != nil { | |
| 1927 | 1946 | return templ_7745c5c3_Err | |
| 1928 | 1947 | } | |
| 1929 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 162, "</span></li>") | |
| 1948 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 164, "</span></li>") | |
| 1930 | 1949 | if templ_7745c5c3_Err != nil { | |
| 1931 | 1950 | return templ_7745c5c3_Err | |
| 1932 | 1951 | } | |
| 1933 | 1952 | } | |
| 1934 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 163, "</ol>") | |
| 1953 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 165, "</ol>") | |
| 1935 | 1954 | if templ_7745c5c3_Err != nil { | |
| 1936 | 1955 | return templ_7745c5c3_Err | |
| 1937 | 1956 | } | |
| @@ -1955,12 +1974,12 @@ func Job(l Layout, p JobPage) templ.Component { | |||
| 1955 | 1974 | }() | |
| 1956 | 1975 | } | |
| 1957 | 1976 | ctx = templ.InitializeContext(ctx) | |
| 1958 | - | templ_7745c5c3_Var103 := templ.GetChildren(ctx) | |
| 1959 | - | if templ_7745c5c3_Var103 == nil { | |
| 1960 | - | templ_7745c5c3_Var103 = templ.NopComponent | |
| 1977 | + | templ_7745c5c3_Var104 := templ.GetChildren(ctx) | |
| 1978 | + | if templ_7745c5c3_Var104 == nil { | |
| 1979 | + | templ_7745c5c3_Var104 = templ.NopComponent | |
| 1961 | 1980 | } | |
| 1962 | 1981 | ctx = templ.ClearChildren(ctx) | |
| 1963 | - | templ_7745c5c3_Var104 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) { | |
| 1982 | + | templ_7745c5c3_Var105 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) { | |
| 1964 | 1983 | templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context | |
| 1965 | 1984 | templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W) | |
| 1966 | 1985 | if !templ_7745c5c3_IsBuffer { | |
| @@ -1976,7 +1995,7 @@ func Job(l Layout, p JobPage) templ.Component { | |||
| 1976 | 1995 | if templ_7745c5c3_Err != nil { | |
| 1977 | 1996 | return templ_7745c5c3_Err | |
| 1978 | 1997 | } | |
| 1979 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 164, " ") | |
| 1998 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 166, " ") | |
| 1980 | 1999 | if templ_7745c5c3_Err != nil { | |
| 1981 | 2000 | return templ_7745c5c3_Err | |
| 1982 | 2001 | } | |
| @@ -1984,7 +2003,7 @@ func Job(l Layout, p JobPage) templ.Component { | |||
| 1984 | 2003 | if templ_7745c5c3_Err != nil { | |
| 1985 | 2004 | return templ_7745c5c3_Err | |
| 1986 | 2005 | } | |
| 1987 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 165, " ") | |
| 2006 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 167, " ") | |
| 1988 | 2007 | if templ_7745c5c3_Err != nil { | |
| 1989 | 2008 | return templ_7745c5c3_Err | |
| 1990 | 2009 | } | |
| @@ -1992,111 +2011,111 @@ func Job(l Layout, p JobPage) templ.Component { | |||
| 1992 | 2011 | if templ_7745c5c3_Err != nil { | |
| 1993 | 2012 | return templ_7745c5c3_Err | |
| 1994 | 2013 | } | |
| 1995 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 166, " <div id=\"job-log\" class=\"joblog\" data-total=\"") | |
| 2014 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 168, " <div id=\"job-log\" class=\"joblog\" data-total=\"") | |
| 1996 | 2015 | if templ_7745c5c3_Err != nil { | |
| 1997 | 2016 | return templ_7745c5c3_Err | |
| 1998 | 2017 | } | |
| 1999 | - | var templ_7745c5c3_Var105 string | |
| 2000 | - | templ_7745c5c3_Var105, templ_7745c5c3_Err = templ.ResolveAttributeValue(itoa64(p.Total)) | |
| 2018 | + | var templ_7745c5c3_Var106 string | |
| 2019 | + | templ_7745c5c3_Var106, templ_7745c5c3_Err = templ.ResolveAttributeValue(itoa64(p.Total)) | |
| 2001 | 2020 | if templ_7745c5c3_Err != nil { | |
| 2002 | - | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 292, Col: 63} | |
| 2021 | + | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 295, Col: 63} | |
| 2003 | 2022 | } | |
| 2004 | - | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var105) | |
| 2023 | + | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var106) | |
| 2005 | 2024 | if templ_7745c5c3_Err != nil { | |
| 2006 | 2025 | return templ_7745c5c3_Err | |
| 2007 | 2026 | } | |
| 2008 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 167, "\"") | |
| 2027 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 169, "\"") | |
| 2009 | 2028 | if templ_7745c5c3_Err != nil { | |
| 2010 | 2029 | return templ_7745c5c3_Err | |
| 2011 | 2030 | } | |
| 2012 | 2031 | if p.Follow { | |
| 2013 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 168, " data-follow") | |
| 2032 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 170, " data-follow") | |
| 2014 | 2033 | if templ_7745c5c3_Err != nil { | |
| 2015 | 2034 | return templ_7745c5c3_Err | |
| 2016 | 2035 | } | |
| 2017 | 2036 | } | |
| 2018 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 169, " data-stream=\"") | |
| 2037 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 171, " data-stream=\"") | |
| 2019 | 2038 | if templ_7745c5c3_Err != nil { | |
| 2020 | 2039 | return templ_7745c5c3_Err | |
| 2021 | 2040 | } | |
| 2022 | - | var templ_7745c5c3_Var106 string | |
| 2023 | - | templ_7745c5c3_Var106, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.StreamHref) | |
| 2041 | + | var templ_7745c5c3_Var107 string | |
| 2042 | + | templ_7745c5c3_Var107, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.StreamHref) | |
| 2024 | 2043 | if templ_7745c5c3_Err != nil { | |
| 2025 | - | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 292, Col: 118} | |
| 2044 | + | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 295, Col: 118} | |
| 2026 | 2045 | } | |
| 2027 | - | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var106) | |
| 2046 | + | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var107) | |
| 2028 | 2047 | if templ_7745c5c3_Err != nil { | |
| 2029 | 2048 | return templ_7745c5c3_Err | |
| 2030 | 2049 | } | |
| 2031 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 170, "\" data-next=\"") | |
| 2050 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 172, "\" data-next=\"") | |
| 2032 | 2051 | if templ_7745c5c3_Err != nil { | |
| 2033 | 2052 | return templ_7745c5c3_Err | |
| 2034 | 2053 | } | |
| 2035 | - | var templ_7745c5c3_Var107 string | |
| 2036 | - | templ_7745c5c3_Var107, templ_7745c5c3_Err = templ.ResolveAttributeValue(itoa64(p.From + int64(len(p.Lines)))) | |
| 2054 | + | var templ_7745c5c3_Var108 string | |
| 2055 | + | templ_7745c5c3_Var108, templ_7745c5c3_Err = templ.ResolveAttributeValue(itoa64(p.From + int64(len(p.Lines)))) | |
| 2037 | 2056 | if templ_7745c5c3_Err != nil { | |
| 2038 | - | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 292, Col: 169} | |
| 2057 | + | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 295, Col: 169} | |
| 2039 | 2058 | } | |
| 2040 | - | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var107) | |
| 2059 | + | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var108) | |
| 2041 | 2060 | if templ_7745c5c3_Err != nil { | |
| 2042 | 2061 | return templ_7745c5c3_Err | |
| 2043 | 2062 | } | |
| 2044 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 171, "\">") | |
| 2063 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 173, "\">") | |
| 2045 | 2064 | if templ_7745c5c3_Err != nil { | |
| 2046 | 2065 | return templ_7745c5c3_Err | |
| 2047 | 2066 | } | |
| 2048 | 2067 | if p.Note != "" { | |
| 2049 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 172, "<p class=\"dim\">") | |
| 2068 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 174, "<p class=\"dim\">") | |
| 2050 | 2069 | if templ_7745c5c3_Err != nil { | |
| 2051 | 2070 | return templ_7745c5c3_Err | |
| 2052 | 2071 | } | |
| 2053 | - | var templ_7745c5c3_Var108 string | |
| 2054 | - | templ_7745c5c3_Var108, templ_7745c5c3_Err = templ.JoinStringErrs(p.Note) | |
| 2072 | + | var templ_7745c5c3_Var109 string | |
| 2073 | + | templ_7745c5c3_Var109, templ_7745c5c3_Err = templ.JoinStringErrs(p.Note) | |
| 2055 | 2074 | if templ_7745c5c3_Err != nil { | |
| 2056 | - | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 294, Col: 27} | |
| 2075 | + | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 297, Col: 27} | |
| 2057 | 2076 | } | |
| 2058 | - | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var108)) | |
| 2077 | + | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var109)) | |
| 2059 | 2078 | if templ_7745c5c3_Err != nil { | |
| 2060 | 2079 | return templ_7745c5c3_Err | |
| 2061 | 2080 | } | |
| 2062 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 173, "</p>") | |
| 2081 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 175, "</p>") | |
| 2063 | 2082 | if templ_7745c5c3_Err != nil { | |
| 2064 | 2083 | return templ_7745c5c3_Err | |
| 2065 | 2084 | } | |
| 2066 | 2085 | } | |
| 2067 | 2086 | if p.Prev != "" { | |
| 2068 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 174, "<p class=\"more\"><a href=\"") | |
| 2087 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 176, "<p class=\"more\"><a href=\"") | |
| 2069 | 2088 | if templ_7745c5c3_Err != nil { | |
| 2070 | 2089 | return templ_7745c5c3_Err | |
| 2071 | 2090 | } | |
| 2072 | - | var templ_7745c5c3_Var109 templ.SafeURL | |
| 2073 | - | templ_7745c5c3_Var109, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.Prev)) | |
| 2091 | + | var templ_7745c5c3_Var110 templ.SafeURL | |
| 2092 | + | templ_7745c5c3_Var110, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.Prev)) | |
| 2074 | 2093 | if templ_7745c5c3_Err != nil { | |
| 2075 | - | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 297, Col: 51} | |
| 2094 | + | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 300, Col: 51} | |
| 2076 | 2095 | } | |
| 2077 | - | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var109)) | |
| 2096 | + | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var110)) | |
| 2078 | 2097 | if templ_7745c5c3_Err != nil { | |
| 2079 | 2098 | return templ_7745c5c3_Err | |
| 2080 | 2099 | } | |
| 2081 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 175, "\" rel=\"prev\">earlier lines</a></p>") | |
| 2100 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 177, "\" rel=\"prev\">earlier lines</a></p>") | |
| 2082 | 2101 | if templ_7745c5c3_Err != nil { | |
| 2083 | 2102 | return templ_7745c5c3_Err | |
| 2084 | 2103 | } | |
| 2085 | 2104 | } | |
| 2086 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 176, "<ol class=\"log\" start=\"") | |
| 2105 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 178, "<ol class=\"log\" start=\"") | |
| 2087 | 2106 | if templ_7745c5c3_Err != nil { | |
| 2088 | 2107 | return templ_7745c5c3_Err | |
| 2089 | 2108 | } | |
| 2090 | - | var templ_7745c5c3_Var110 string | |
| 2091 | - | templ_7745c5c3_Var110, templ_7745c5c3_Err = templ.ResolveAttributeValue(itoa64(p.From + 1)) | |
| 2109 | + | var templ_7745c5c3_Var111 string | |
| 2110 | + | templ_7745c5c3_Var111, templ_7745c5c3_Err = templ.ResolveAttributeValue(itoa64(p.From + 1)) | |
| 2092 | 2111 | if templ_7745c5c3_Err != nil { | |
| 2093 | - | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 299, Col: 45} | |
| 2112 | + | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 302, Col: 45} | |
| 2094 | 2113 | } | |
| 2095 | - | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var110) | |
| 2114 | + | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var111) | |
| 2096 | 2115 | if templ_7745c5c3_Err != nil { | |
| 2097 | 2116 | return templ_7745c5c3_Err | |
| 2098 | 2117 | } | |
| 2099 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 177, "\">") | |
| 2118 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 179, "\">") | |
| 2100 | 2119 | if templ_7745c5c3_Err != nil { | |
| 2101 | 2120 | return templ_7745c5c3_Err | |
| 2102 | 2121 | } | |
| @@ -2106,36 +2125,36 @@ func Job(l Layout, p JobPage) templ.Component { | |||
| 2106 | 2125 | return templ_7745c5c3_Err | |
| 2107 | 2126 | } | |
| 2108 | 2127 | } | |
| 2109 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 178, "</ol>") | |
| 2128 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 180, "</ol>") | |
| 2110 | 2129 | if templ_7745c5c3_Err != nil { | |
| 2111 | 2130 | return templ_7745c5c3_Err | |
| 2112 | 2131 | } | |
| 2113 | 2132 | if p.Next != "" { | |
| 2114 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 179, "<p class=\"more\"><a href=\"") | |
| 2133 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 181, "<p class=\"more\"><a href=\"") | |
| 2115 | 2134 | if templ_7745c5c3_Err != nil { | |
| 2116 | 2135 | return templ_7745c5c3_Err | |
| 2117 | 2136 | } | |
| 2118 | - | var templ_7745c5c3_Var111 templ.SafeURL | |
| 2119 | - | templ_7745c5c3_Var111, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.Next)) | |
| 2137 | + | var templ_7745c5c3_Var112 templ.SafeURL | |
| 2138 | + | templ_7745c5c3_Var112, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.Next)) | |
| 2120 | 2139 | if templ_7745c5c3_Err != nil { | |
| 2121 | - | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 305, Col: 51} | |
| 2140 | + | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 308, Col: 51} | |
| 2122 | 2141 | } | |
| 2123 | - | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var111)) | |
| 2142 | + | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var112)) | |
| 2124 | 2143 | if templ_7745c5c3_Err != nil { | |
| 2125 | 2144 | return templ_7745c5c3_Err | |
| 2126 | 2145 | } | |
| 2127 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 180, "\" rel=\"next\">more lines</a></p>") | |
| 2146 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 182, "\" rel=\"next\">more lines</a></p>") | |
| 2128 | 2147 | if templ_7745c5c3_Err != nil { | |
| 2129 | 2148 | return templ_7745c5c3_Err | |
| 2130 | 2149 | } | |
| 2131 | 2150 | } | |
| 2132 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 181, "</div>") | |
| 2151 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 183, "</div>") | |
| 2133 | 2152 | if templ_7745c5c3_Err != nil { | |
| 2134 | 2153 | return templ_7745c5c3_Err | |
| 2135 | 2154 | } | |
| 2136 | 2155 | return nil | |
| 2137 | 2156 | }) | |
| 2138 | - | templ_7745c5c3_Err = Shell(l, jobRail(p)).Render(templ.WithChildren(ctx, templ_7745c5c3_Var104), templ_7745c5c3_Buffer) | |
| 2157 | + | templ_7745c5c3_Err = Shell(l, jobRail(p)).Render(templ.WithChildren(ctx, templ_7745c5c3_Var105), templ_7745c5c3_Buffer) | |
| 2139 | 2158 | if templ_7745c5c3_Err != nil { | |
| 2140 | 2159 | return templ_7745c5c3_Err | |
| 2141 | 2160 | } | |
| @@ -2161,92 +2180,92 @@ func LogLine(ln LogLineView) templ.Component { | |||
| 2161 | 2180 | }() | |
| 2162 | 2181 | } | |
| 2163 | 2182 | ctx = templ.InitializeContext(ctx) | |
| 2164 | - | templ_7745c5c3_Var112 := templ.GetChildren(ctx) | |
| 2165 | - | if templ_7745c5c3_Var112 == nil { | |
| 2166 | - | templ_7745c5c3_Var112 = templ.NopComponent | |
| 2183 | + | templ_7745c5c3_Var113 := templ.GetChildren(ctx) | |
| 2184 | + | if templ_7745c5c3_Var113 == nil { | |
| 2185 | + | templ_7745c5c3_Var113 = templ.NopComponent | |
| 2167 | 2186 | } | |
| 2168 | 2187 | ctx = templ.ClearChildren(ctx) | |
| 2169 | - | var templ_7745c5c3_Var113 = []any{logClass(ln)} | |
| 2170 | - | templ_7745c5c3_Err = templ.RenderCSSItems(ctx, templ_7745c5c3_Buffer, templ_7745c5c3_Var113...) | |
| 2188 | + | var templ_7745c5c3_Var114 = []any{logClass(ln)} | |
| 2189 | + | templ_7745c5c3_Err = templ.RenderCSSItems(ctx, templ_7745c5c3_Buffer, templ_7745c5c3_Var114...) | |
| 2171 | 2190 | if templ_7745c5c3_Err != nil { | |
| 2172 | 2191 | return templ_7745c5c3_Err | |
| 2173 | 2192 | } | |
| 2174 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 182, "<li id=\"") | |
| 2193 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 184, "<li id=\"") | |
| 2175 | 2194 | if templ_7745c5c3_Err != nil { | |
| 2176 | 2195 | return templ_7745c5c3_Err | |
| 2177 | 2196 | } | |
| 2178 | - | var templ_7745c5c3_Var114 string | |
| 2179 | - | templ_7745c5c3_Var114, templ_7745c5c3_Err = templ.ResolveAttributeValue("L" + itoa64(ln.N)) | |
| 2197 | + | var templ_7745c5c3_Var115 string | |
| 2198 | + | templ_7745c5c3_Var115, templ_7745c5c3_Err = templ.ResolveAttributeValue("L" + itoa64(ln.N)) | |
| 2180 | 2199 | if templ_7745c5c3_Err != nil { | |
| 2181 | - | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 314, Col: 28} | |
| 2200 | + | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 317, Col: 28} | |
| 2182 | 2201 | } | |
| 2183 | - | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var114) | |
| 2202 | + | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var115) | |
| 2184 | 2203 | if templ_7745c5c3_Err != nil { | |
| 2185 | 2204 | return templ_7745c5c3_Err | |
| 2186 | 2205 | } | |
| 2187 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 183, "\" class=\"") | |
| 2206 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 185, "\" class=\"") | |
| 2188 | 2207 | if templ_7745c5c3_Err != nil { | |
| 2189 | 2208 | return templ_7745c5c3_Err | |
| 2190 | 2209 | } | |
| 2191 | - | var templ_7745c5c3_Var115 string | |
| 2192 | - | templ_7745c5c3_Var115, templ_7745c5c3_Err = templ.ResolveAttributeValue(templ.CSSClasses(templ_7745c5c3_Var113).String()) | |
| 2210 | + | var templ_7745c5c3_Var116 string | |
| 2211 | + | templ_7745c5c3_Var116, templ_7745c5c3_Err = templ.ResolveAttributeValue(templ.CSSClasses(templ_7745c5c3_Var114).String()) | |
| 2193 | 2212 | if templ_7745c5c3_Err != nil { | |
| 2194 | 2213 | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 1, Col: 0} | |
| 2195 | 2214 | } | |
| 2196 | - | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var115) | |
| 2215 | + | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var116) | |
| 2197 | 2216 | if templ_7745c5c3_Err != nil { | |
| 2198 | 2217 | return templ_7745c5c3_Err | |
| 2199 | 2218 | } | |
| 2200 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 184, "\" data-step=\"") | |
| 2219 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 186, "\" data-step=\"") | |
| 2201 | 2220 | if templ_7745c5c3_Err != nil { | |
| 2202 | 2221 | return templ_7745c5c3_Err | |
| 2203 | 2222 | } | |
| 2204 | - | var templ_7745c5c3_Var116 string | |
| 2205 | - | templ_7745c5c3_Var116, templ_7745c5c3_Err = templ.ResolveAttributeValue(itoa(int(ln.Step))) | |
| 2223 | + | var templ_7745c5c3_Var117 string | |
| 2224 | + | templ_7745c5c3_Var117, templ_7745c5c3_Err = templ.ResolveAttributeValue(itoa(int(ln.Step))) | |
| 2206 | 2225 | if templ_7745c5c3_Err != nil { | |
| 2207 | - | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 314, Col: 84} | |
| 2226 | + | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 317, Col: 84} | |
| 2208 | 2227 | } | |
| 2209 | - | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var116) | |
| 2228 | + | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var117) | |
| 2210 | 2229 | if templ_7745c5c3_Err != nil { | |
| 2211 | 2230 | return templ_7745c5c3_Err | |
| 2212 | 2231 | } | |
| 2213 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 185, "\"") | |
| 2232 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 187, "\"") | |
| 2214 | 2233 | if templ_7745c5c3_Err != nil { | |
| 2215 | 2234 | return templ_7745c5c3_Err | |
| 2216 | 2235 | } | |
| 2217 | 2236 | if ln.Continued { | |
| 2218 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 186, " data-cont") | |
| 2237 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 188, " data-cont") | |
| 2219 | 2238 | if templ_7745c5c3_Err != nil { | |
| 2220 | 2239 | return templ_7745c5c3_Err | |
| 2221 | 2240 | } | |
| 2222 | 2241 | } | |
| 2223 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 187, "><time>") | |
| 2242 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 189, "><time>") | |
| 2224 | 2243 | if templ_7745c5c3_Err != nil { | |
| 2225 | 2244 | return templ_7745c5c3_Err | |
| 2226 | 2245 | } | |
| 2227 | - | var templ_7745c5c3_Var117 string | |
| 2228 | - | templ_7745c5c3_Var117, templ_7745c5c3_Err = templ.JoinStringErrs(ln.Time) | |
| 2246 | + | var templ_7745c5c3_Var118 string | |
| 2247 | + | templ_7745c5c3_Var118, templ_7745c5c3_Err = templ.JoinStringErrs(ln.Time) | |
| 2229 | 2248 | if templ_7745c5c3_Err != nil { | |
| 2230 | - | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 314, Col: 130} | |
| 2249 | + | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 317, Col: 130} | |
| 2231 | 2250 | } | |
| 2232 | - | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var117)) | |
| 2251 | + | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var118)) | |
| 2233 | 2252 | if templ_7745c5c3_Err != nil { | |
| 2234 | 2253 | return templ_7745c5c3_Err | |
| 2235 | 2254 | } | |
| 2236 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 188, "</time><span class=\"t\">") | |
| 2255 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 190, "</time><span class=\"t\">") | |
| 2237 | 2256 | if templ_7745c5c3_Err != nil { | |
| 2238 | 2257 | return templ_7745c5c3_Err | |
| 2239 | 2258 | } | |
| 2240 | - | var templ_7745c5c3_Var118 string | |
| 2241 | - | templ_7745c5c3_Var118, templ_7745c5c3_Err = templ.JoinStringErrs(ln.Text) | |
| 2259 | + | var templ_7745c5c3_Var119 string | |
| 2260 | + | templ_7745c5c3_Var119, templ_7745c5c3_Err = templ.JoinStringErrs(ln.Text) | |
| 2242 | 2261 | if templ_7745c5c3_Err != nil { | |
| 2243 | - | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 314, Col: 164} | |
| 2262 | + | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 317, Col: 164} | |
| 2244 | 2263 | } | |
| 2245 | - | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var118)) | |
| 2264 | + | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var119)) | |
| 2246 | 2265 | if templ_7745c5c3_Err != nil { | |
| 2247 | 2266 | return templ_7745c5c3_Err | |
| 2248 | 2267 | } | |
| 2249 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 189, "</span></li>") | |
| 2268 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 191, "</span></li>") | |
| 2250 | 2269 | if templ_7745c5c3_Err != nil { | |
| 2251 | 2270 | return templ_7745c5c3_Err | |
| 2252 | 2271 | } | |
| @@ -2270,12 +2289,12 @@ func jobRail(p JobPage) templ.Component { | |||
| 2270 | 2289 | }() | |
| 2271 | 2290 | } | |
| 2272 | 2291 | ctx = templ.InitializeContext(ctx) | |
| 2273 | - | templ_7745c5c3_Var119 := templ.GetChildren(ctx) | |
| 2274 | - | if templ_7745c5c3_Var119 == nil { | |
| 2275 | - | templ_7745c5c3_Var119 = templ.NopComponent | |
| 2292 | + | templ_7745c5c3_Var120 := templ.GetChildren(ctx) | |
| 2293 | + | if templ_7745c5c3_Var120 == nil { | |
| 2294 | + | templ_7745c5c3_Var120 = templ.NopComponent | |
| 2276 | 2295 | } | |
| 2277 | 2296 | ctx = templ.ClearChildren(ctx) | |
| 2278 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 190, "<section aria-labelledby=\"r-job\"><h2 id=\"r-job\">Steps</h2>") | |
| 2297 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 192, "<section aria-labelledby=\"r-job\"><h2 id=\"r-job\">Steps</h2>") | |
| 2279 | 2298 | if templ_7745c5c3_Err != nil { | |
| 2280 | 2299 | return templ_7745c5c3_Err | |
| 2281 | 2300 | } | |
| @@ -2283,101 +2302,101 @@ func jobRail(p JobPage) templ.Component { | |||
| 2283 | 2302 | if templ_7745c5c3_Err != nil { | |
| 2284 | 2303 | return templ_7745c5c3_Err | |
| 2285 | 2304 | } | |
| 2286 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 191, "</section><section aria-labelledby=\"r-jobf\"><h2 id=\"r-jobf\">Job</h2><dl class=\"kv\"><dt>run</dt><dd><a href=\"") | |
| 2305 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 193, "</section><section aria-labelledby=\"r-jobf\"><h2 id=\"r-jobf\">Job</h2><dl class=\"kv\"><dt>run</dt><dd><a href=\"") | |
| 2287 | 2306 | if templ_7745c5c3_Err != nil { | |
| 2288 | 2307 | return templ_7745c5c3_Err | |
| 2289 | 2308 | } | |
| 2290 | - | var templ_7745c5c3_Var120 templ.SafeURL | |
| 2291 | - | templ_7745c5c3_Var120, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.RunHref)) | |
| 2309 | + | var templ_7745c5c3_Var121 templ.SafeURL | |
| 2310 | + | templ_7745c5c3_Var121, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.RunHref)) | |
| 2292 | 2311 | if templ_7745c5c3_Err != nil { | |
| 2293 | - | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 326, Col: 41} | |
| 2312 | + | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 329, Col: 41} | |
| 2294 | 2313 | } | |
| 2295 | - | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var120)) | |
| 2314 | + | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var121)) | |
| 2296 | 2315 | if templ_7745c5c3_Err != nil { | |
| 2297 | 2316 | return templ_7745c5c3_Err | |
| 2298 | 2317 | } | |
| 2299 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 192, "\">") | |
| 2318 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 194, "\">") | |
| 2300 | 2319 | if templ_7745c5c3_Err != nil { | |
| 2301 | 2320 | return templ_7745c5c3_Err | |
| 2302 | 2321 | } | |
| 2303 | - | var templ_7745c5c3_Var121 string | |
| 2304 | - | templ_7745c5c3_Var121, templ_7745c5c3_Err = templ.JoinStringErrs(p.RunName) | |
| 2322 | + | var templ_7745c5c3_Var122 string | |
| 2323 | + | templ_7745c5c3_Var122, templ_7745c5c3_Err = templ.JoinStringErrs(p.RunName) | |
| 2305 | 2324 | if templ_7745c5c3_Err != nil { | |
| 2306 | - | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 326, Col: 55} | |
| 2325 | + | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 329, Col: 55} | |
| 2307 | 2326 | } | |
| 2308 | - | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var121)) | |
| 2327 | + | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var122)) | |
| 2309 | 2328 | if templ_7745c5c3_Err != nil { | |
| 2310 | 2329 | return templ_7745c5c3_Err | |
| 2311 | 2330 | } | |
| 2312 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 193, "</a></dd>") | |
| 2331 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 195, "</a></dd>") | |
| 2313 | 2332 | if templ_7745c5c3_Err != nil { | |
| 2314 | 2333 | return templ_7745c5c3_Err | |
| 2315 | 2334 | } | |
| 2316 | 2335 | if p.Runner != "" { | |
| 2317 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 194, "<dt>runner</dt><dd>") | |
| 2336 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 196, "<dt>runner</dt><dd>") | |
| 2318 | 2337 | if templ_7745c5c3_Err != nil { | |
| 2319 | 2338 | return templ_7745c5c3_Err | |
| 2320 | 2339 | } | |
| 2321 | - | var templ_7745c5c3_Var122 string | |
| 2322 | - | templ_7745c5c3_Var122, templ_7745c5c3_Err = templ.JoinStringErrs(p.Runner) | |
| 2340 | + | var templ_7745c5c3_Var123 string | |
| 2341 | + | templ_7745c5c3_Var123, templ_7745c5c3_Err = templ.JoinStringErrs(p.Runner) | |
| 2323 | 2342 | if templ_7745c5c3_Err != nil { | |
| 2324 | - | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 329, Col: 18} | |
| 2343 | + | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 332, Col: 18} | |
| 2325 | 2344 | } | |
| 2326 | - | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var122)) | |
| 2345 | + | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var123)) | |
| 2327 | 2346 | if templ_7745c5c3_Err != nil { | |
| 2328 | 2347 | return templ_7745c5c3_Err | |
| 2329 | 2348 | } | |
| 2330 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 195, "</dd>") | |
| 2349 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 197, "</dd>") | |
| 2331 | 2350 | if templ_7745c5c3_Err != nil { | |
| 2332 | 2351 | return templ_7745c5c3_Err | |
| 2333 | 2352 | } | |
| 2334 | 2353 | } | |
| 2335 | 2354 | if p.Isolation != "" { | |
| 2336 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 196, "<dt>isolation</dt><dd>") | |
| 2355 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 198, "<dt>isolation</dt><dd>") | |
| 2337 | 2356 | if templ_7745c5c3_Err != nil { | |
| 2338 | 2357 | return templ_7745c5c3_Err | |
| 2339 | 2358 | } | |
| 2340 | - | var templ_7745c5c3_Var123 string | |
| 2341 | - | templ_7745c5c3_Var123, templ_7745c5c3_Err = templ.JoinStringErrs(p.Isolation) | |
| 2359 | + | var templ_7745c5c3_Var124 string | |
| 2360 | + | templ_7745c5c3_Var124, templ_7745c5c3_Err = templ.JoinStringErrs(p.Isolation) | |
| 2342 | 2361 | if templ_7745c5c3_Err != nil { | |
| 2343 | - | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 333, Col: 21} | |
| 2362 | + | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 336, Col: 21} | |
| 2344 | 2363 | } | |
| 2345 | - | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var123)) | |
| 2364 | + | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var124)) | |
| 2346 | 2365 | if templ_7745c5c3_Err != nil { | |
| 2347 | 2366 | return templ_7745c5c3_Err | |
| 2348 | 2367 | } | |
| 2349 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 197, "</dd>") | |
| 2368 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 199, "</dd>") | |
| 2350 | 2369 | if templ_7745c5c3_Err != nil { | |
| 2351 | 2370 | return templ_7745c5c3_Err | |
| 2352 | 2371 | } | |
| 2353 | 2372 | } | |
| 2354 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 198, "<dt>lines</dt><dd>") | |
| 2373 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 200, "<dt>lines</dt><dd>") | |
| 2355 | 2374 | if templ_7745c5c3_Err != nil { | |
| 2356 | 2375 | return templ_7745c5c3_Err | |
| 2357 | 2376 | } | |
| 2358 | - | var templ_7745c5c3_Var124 string | |
| 2359 | - | templ_7745c5c3_Var124, templ_7745c5c3_Err = templ.JoinStringErrs(itoa64(p.Total)) | |
| 2377 | + | var templ_7745c5c3_Var125 string | |
| 2378 | + | templ_7745c5c3_Var125, templ_7745c5c3_Err = templ.JoinStringErrs(itoa64(p.Total)) | |
| 2360 | 2379 | if templ_7745c5c3_Err != nil { | |
| 2361 | - | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 336, Col: 24} | |
| 2380 | + | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 339, Col: 24} | |
| 2362 | 2381 | } | |
| 2363 | - | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var124)) | |
| 2382 | + | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var125)) | |
| 2364 | 2383 | if templ_7745c5c3_Err != nil { | |
| 2365 | 2384 | return templ_7745c5c3_Err | |
| 2366 | 2385 | } | |
| 2367 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 199, "</dd></dl><p><a href=\"") | |
| 2386 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 201, "</dd></dl><p><a href=\"") | |
| 2368 | 2387 | if templ_7745c5c3_Err != nil { | |
| 2369 | 2388 | return templ_7745c5c3_Err | |
| 2370 | 2389 | } | |
| 2371 | - | var templ_7745c5c3_Var125 templ.SafeURL | |
| 2372 | - | templ_7745c5c3_Var125, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.RawHref)) | |
| 2390 | + | var templ_7745c5c3_Var126 templ.SafeURL | |
| 2391 | + | templ_7745c5c3_Var126, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.RawHref)) | |
| 2373 | 2392 | if templ_7745c5c3_Err != nil { | |
| 2374 | - | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 338, Col: 39} | |
| 2393 | + | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 341, Col: 39} | |
| 2375 | 2394 | } | |
| 2376 | - | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var125)) | |
| 2395 | + | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var126)) | |
| 2377 | 2396 | if templ_7745c5c3_Err != nil { | |
| 2378 | 2397 | return templ_7745c5c3_Err | |
| 2379 | 2398 | } | |
| 2380 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 200, "\">raw log</a></p></section>") | |
| 2399 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 202, "\">raw log</a></p></section>") | |
| 2381 | 2400 | if templ_7745c5c3_Err != nil { | |
| 2382 | 2401 | return templ_7745c5c3_Err | |
| 2383 | 2402 | } | |
| @@ -2403,39 +2422,39 @@ func CommitChecks(c ChecksSummary) templ.Component { | |||
| 2403 | 2422 | }() | |
| 2404 | 2423 | } | |
| 2405 | 2424 | ctx = templ.InitializeContext(ctx) | |
| 2406 | - | templ_7745c5c3_Var126 := templ.GetChildren(ctx) | |
| 2407 | - | if templ_7745c5c3_Var126 == nil { | |
| 2408 | - | templ_7745c5c3_Var126 = templ.NopComponent | |
| 2425 | + | templ_7745c5c3_Var127 := templ.GetChildren(ctx) | |
| 2426 | + | if templ_7745c5c3_Var127 == nil { | |
| 2427 | + | templ_7745c5c3_Var127 = templ.NopComponent | |
| 2409 | 2428 | } | |
| 2410 | 2429 | ctx = templ.ClearChildren(ctx) | |
| 2411 | 2430 | if c.Total > 0 { | |
| 2412 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 201, "<a class=\"ck-sum\" href=\"") | |
| 2431 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 203, "<a class=\"ck-sum\" href=\"") | |
| 2413 | 2432 | if templ_7745c5c3_Err != nil { | |
| 2414 | 2433 | return templ_7745c5c3_Err | |
| 2415 | 2434 | } | |
| 2416 | - | var templ_7745c5c3_Var127 templ.SafeURL | |
| 2417 | - | templ_7745c5c3_Var127, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(c.Href)) | |
| 2435 | + | var templ_7745c5c3_Var128 templ.SafeURL | |
| 2436 | + | templ_7745c5c3_Var128, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(c.Href)) | |
| 2418 | 2437 | if templ_7745c5c3_Err != nil { | |
| 2419 | - | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 346, Col: 48} | |
| 2438 | + | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 349, Col: 48} | |
| 2420 | 2439 | } | |
| 2421 | - | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var127)) | |
| 2440 | + | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var128)) | |
| 2422 | 2441 | if templ_7745c5c3_Err != nil { | |
| 2423 | 2442 | return templ_7745c5c3_Err | |
| 2424 | 2443 | } | |
| 2425 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 202, "\" title=\"") | |
| 2444 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 204, "\" title=\"") | |
| 2426 | 2445 | if templ_7745c5c3_Err != nil { | |
| 2427 | 2446 | return templ_7745c5c3_Err | |
| 2428 | 2447 | } | |
| 2429 | - | var templ_7745c5c3_Var128 string | |
| 2430 | - | templ_7745c5c3_Var128, templ_7745c5c3_Err = templ.ResolveAttributeValue(c.Title) | |
| 2448 | + | var templ_7745c5c3_Var129 string | |
| 2449 | + | templ_7745c5c3_Var129, templ_7745c5c3_Err = templ.ResolveAttributeValue(c.Title) | |
| 2431 | 2450 | if templ_7745c5c3_Err != nil { | |
| 2432 | - | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 346, Col: 66} | |
| 2451 | + | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 349, Col: 66} | |
| 2433 | 2452 | } | |
| 2434 | - | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var128) | |
| 2453 | + | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var129) | |
| 2435 | 2454 | if templ_7745c5c3_Err != nil { | |
| 2436 | 2455 | return templ_7745c5c3_Err | |
| 2437 | 2456 | } | |
| 2438 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 203, "\">") | |
| 2457 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 205, "\">") | |
| 2439 | 2458 | if templ_7745c5c3_Err != nil { | |
| 2440 | 2459 | return templ_7745c5c3_Err | |
| 2441 | 2460 | } | |
| @@ -2443,20 +2462,20 @@ func CommitChecks(c ChecksSummary) templ.Component { | |||
| 2443 | 2462 | if templ_7745c5c3_Err != nil { | |
| 2444 | 2463 | return templ_7745c5c3_Err | |
| 2445 | 2464 | } | |
| 2446 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 204, "<span class=\"mute\">") | |
| 2465 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 206, "<span class=\"mute\">") | |
| 2447 | 2466 | if templ_7745c5c3_Err != nil { | |
| 2448 | 2467 | return templ_7745c5c3_Err | |
| 2449 | 2468 | } | |
| 2450 | - | var templ_7745c5c3_Var129 string | |
| 2451 | - | templ_7745c5c3_Var129, templ_7745c5c3_Err = templ.JoinStringErrs(c.Label) | |
| 2469 | + | var templ_7745c5c3_Var130 string | |
| 2470 | + | templ_7745c5c3_Var130, templ_7745c5c3_Err = templ.JoinStringErrs(c.Label) | |
| 2452 | 2471 | if templ_7745c5c3_Err != nil { | |
| 2453 | - | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 348, Col: 31} | |
| 2472 | + | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 351, Col: 31} | |
| 2454 | 2473 | } | |
| 2455 | - | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var129)) | |
| 2474 | + | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var130)) | |
| 2456 | 2475 | if templ_7745c5c3_Err != nil { | |
| 2457 | 2476 | return templ_7745c5c3_Err | |
| 2458 | 2477 | } | |
| 2459 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 205, "</span></a>") | |
| 2478 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 207, "</span></a>") | |
| 2460 | 2479 | if templ_7745c5c3_Err != nil { | |
| 2461 | 2480 | return templ_7745c5c3_Err | |
| 2462 | 2481 | } | |
| @@ -2482,40 +2501,40 @@ func MRChecks(c ChecksSection) templ.Component { | |||
| 2482 | 2501 | }() | |
| 2483 | 2502 | } | |
| 2484 | 2503 | ctx = templ.InitializeContext(ctx) | |
| 2485 | - | templ_7745c5c3_Var130 := templ.GetChildren(ctx) | |
| 2486 | - | if templ_7745c5c3_Var130 == nil { | |
| 2487 | - | templ_7745c5c3_Var130 = templ.NopComponent | |
| 2504 | + | templ_7745c5c3_Var131 := templ.GetChildren(ctx) | |
| 2505 | + | if templ_7745c5c3_Var131 == nil { | |
| 2506 | + | templ_7745c5c3_Var131 = templ.NopComponent | |
| 2488 | 2507 | } | |
| 2489 | 2508 | ctx = templ.ClearChildren(ctx) | |
| 2490 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 206, "<section aria-labelledby=\"r-checks\" id=\"mr-checks\"><h2 id=\"r-checks\">Checks <span class=\"count\">") | |
| 2509 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 208, "<section aria-labelledby=\"r-checks\" id=\"mr-checks\"><h2 id=\"r-checks\">Checks <span class=\"count\">") | |
| 2491 | 2510 | if templ_7745c5c3_Err != nil { | |
| 2492 | 2511 | return templ_7745c5c3_Err | |
| 2493 | 2512 | } | |
| 2494 | - | var templ_7745c5c3_Var131 string | |
| 2495 | - | templ_7745c5c3_Var131, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(len(c.Rows))) | |
| 2513 | + | var templ_7745c5c3_Var132 string | |
| 2514 | + | templ_7745c5c3_Var132, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(len(c.Rows))) | |
| 2496 | 2515 | if templ_7745c5c3_Err != nil { | |
| 2497 | - | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 356, Col: 66} | |
| 2516 | + | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 359, Col: 66} | |
| 2498 | 2517 | } | |
| 2499 | - | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var131)) | |
| 2518 | + | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var132)) | |
| 2500 | 2519 | if templ_7745c5c3_Err != nil { | |
| 2501 | 2520 | return templ_7745c5c3_Err | |
| 2502 | 2521 | } | |
| 2503 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 207, "</span></h2>") | |
| 2522 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 209, "</span></h2>") | |
| 2504 | 2523 | if templ_7745c5c3_Err != nil { | |
| 2505 | 2524 | return templ_7745c5c3_Err | |
| 2506 | 2525 | } | |
| 2507 | 2526 | if len(c.Rows) == 0 { | |
| 2508 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 208, "<p class=\"dim\">no checks</p>") | |
| 2527 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 210, "<p class=\"dim\">no checks</p>") | |
| 2509 | 2528 | if templ_7745c5c3_Err != nil { | |
| 2510 | 2529 | return templ_7745c5c3_Err | |
| 2511 | 2530 | } | |
| 2512 | 2531 | } else { | |
| 2513 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 209, "<ul class=\"checks\">") | |
| 2532 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 211, "<ul class=\"checks\">") | |
| 2514 | 2533 | if templ_7745c5c3_Err != nil { | |
| 2515 | 2534 | return templ_7745c5c3_Err | |
| 2516 | 2535 | } | |
| 2517 | 2536 | for _, r := range c.Rows { | |
| 2518 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 210, "<li>") | |
| 2537 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 212, "<li>") | |
| 2519 | 2538 | if templ_7745c5c3_Err != nil { | |
| 2520 | 2539 | return templ_7745c5c3_Err | |
| 2521 | 2540 | } | |
| @@ -2524,108 +2543,108 @@ func MRChecks(c ChecksSection) templ.Component { | |||
| 2524 | 2543 | return templ_7745c5c3_Err | |
| 2525 | 2544 | } | |
| 2526 | 2545 | if r.Href != "" { | |
| 2527 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 211, "<a href=\"") | |
| 2546 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 213, "<a href=\"") | |
| 2528 | 2547 | if templ_7745c5c3_Err != nil { | |
| 2529 | 2548 | return templ_7745c5c3_Err | |
| 2530 | 2549 | } | |
| 2531 | - | var templ_7745c5c3_Var132 templ.SafeURL | |
| 2532 | - | templ_7745c5c3_Var132, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(r.Href)) | |
| 2550 | + | var templ_7745c5c3_Var133 templ.SafeURL | |
| 2551 | + | templ_7745c5c3_Var133, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(r.Href)) | |
| 2533 | 2552 | if templ_7745c5c3_Err != nil { | |
| 2534 | - | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 365, Col: 38} | |
| 2553 | + | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 368, Col: 38} | |
| 2535 | 2554 | } | |
| 2536 | - | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var132)) | |
| 2555 | + | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var133)) | |
| 2537 | 2556 | if templ_7745c5c3_Err != nil { | |
| 2538 | 2557 | return templ_7745c5c3_Err | |
| 2539 | 2558 | } | |
| 2540 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 212, "\">") | |
| 2559 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 214, "\">") | |
| 2541 | 2560 | if templ_7745c5c3_Err != nil { | |
| 2542 | 2561 | return templ_7745c5c3_Err | |
| 2543 | 2562 | } | |
| 2544 | - | var templ_7745c5c3_Var133 string | |
| 2545 | - | templ_7745c5c3_Var133, templ_7745c5c3_Err = templ.JoinStringErrs(r.Name) | |
| 2563 | + | var templ_7745c5c3_Var134 string | |
| 2564 | + | templ_7745c5c3_Var134, templ_7745c5c3_Err = templ.JoinStringErrs(r.Name) | |
| 2546 | 2565 | if templ_7745c5c3_Err != nil { | |
| 2547 | - | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 365, Col: 49} | |
| 2566 | + | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 368, Col: 49} | |
| 2548 | 2567 | } | |
| 2549 | - | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var133)) | |
| 2568 | + | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var134)) | |
| 2550 | 2569 | if templ_7745c5c3_Err != nil { | |
| 2551 | 2570 | return templ_7745c5c3_Err | |
| 2552 | 2571 | } | |
| 2553 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 213, "</a> ") | |
| 2572 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 215, "</a> ") | |
| 2554 | 2573 | if templ_7745c5c3_Err != nil { | |
| 2555 | 2574 | return templ_7745c5c3_Err | |
| 2556 | 2575 | } | |
| 2557 | 2576 | } else { | |
| 2558 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 214, "<span>") | |
| 2577 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 216, "<span>") | |
| 2559 | 2578 | if templ_7745c5c3_Err != nil { | |
| 2560 | 2579 | return templ_7745c5c3_Err | |
| 2561 | 2580 | } | |
| 2562 | - | var templ_7745c5c3_Var134 string | |
| 2563 | - | templ_7745c5c3_Var134, templ_7745c5c3_Err = templ.JoinStringErrs(r.Name) | |
| 2581 | + | var templ_7745c5c3_Var135 string | |
| 2582 | + | templ_7745c5c3_Var135, templ_7745c5c3_Err = templ.JoinStringErrs(r.Name) | |
| 2564 | 2583 | if templ_7745c5c3_Err != nil { | |
| 2565 | - | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 367, Col: 21} | |
| 2584 | + | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 370, Col: 21} | |
| 2566 | 2585 | } | |
| 2567 | - | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var134)) | |
| 2586 | + | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var135)) | |
| 2568 | 2587 | if templ_7745c5c3_Err != nil { | |
| 2569 | 2588 | return templ_7745c5c3_Err | |
| 2570 | 2589 | } | |
| 2571 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 215, "</span> ") | |
| 2590 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 217, "</span> ") | |
| 2572 | 2591 | if templ_7745c5c3_Err != nil { | |
| 2573 | 2592 | return templ_7745c5c3_Err | |
| 2574 | 2593 | } | |
| 2575 | 2594 | } | |
| 2576 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 216, "<span class=\"dim\">") | |
| 2595 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 218, "<span class=\"dim\">") | |
| 2577 | 2596 | if templ_7745c5c3_Err != nil { | |
| 2578 | 2597 | return templ_7745c5c3_Err | |
| 2579 | 2598 | } | |
| 2580 | - | var templ_7745c5c3_Var135 string | |
| 2581 | - | templ_7745c5c3_Var135, templ_7745c5c3_Err = templ.JoinStringErrs(r.State) | |
| 2599 | + | var templ_7745c5c3_Var136 string | |
| 2600 | + | templ_7745c5c3_Var136, templ_7745c5c3_Err = templ.JoinStringErrs(r.State) | |
| 2582 | 2601 | if templ_7745c5c3_Err != nil { | |
| 2583 | - | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 369, Col: 33} | |
| 2602 | + | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 372, Col: 33} | |
| 2584 | 2603 | } | |
| 2585 | - | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var135)) | |
| 2604 | + | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var136)) | |
| 2586 | 2605 | if templ_7745c5c3_Err != nil { | |
| 2587 | 2606 | return templ_7745c5c3_Err | |
| 2588 | 2607 | } | |
| 2589 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 217, "</span> ") | |
| 2608 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 219, "</span> ") | |
| 2590 | 2609 | if templ_7745c5c3_Err != nil { | |
| 2591 | 2610 | return templ_7745c5c3_Err | |
| 2592 | 2611 | } | |
| 2593 | 2612 | if r.Waiting { | |
| 2594 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 218, "<span class=\"mute\">waiting for a runner</span>") | |
| 2613 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 220, "<span class=\"mute\">waiting for a runner</span>") | |
| 2595 | 2614 | if templ_7745c5c3_Err != nil { | |
| 2596 | 2615 | return templ_7745c5c3_Err | |
| 2597 | 2616 | } | |
| 2598 | 2617 | } | |
| 2599 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 219, "</li>") | |
| 2618 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 221, "</li>") | |
| 2600 | 2619 | if templ_7745c5c3_Err != nil { | |
| 2601 | 2620 | return templ_7745c5c3_Err | |
| 2602 | 2621 | } | |
| 2603 | 2622 | } | |
| 2604 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 220, "</ul>") | |
| 2623 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 222, "</ul>") | |
| 2605 | 2624 | if templ_7745c5c3_Err != nil { | |
| 2606 | 2625 | return templ_7745c5c3_Err | |
| 2607 | 2626 | } | |
| 2608 | 2627 | } | |
| 2609 | 2628 | if c.Note != "" { | |
| 2610 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 221, "<p class=\"mute\">") | |
| 2629 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 223, "<p class=\"mute\">") | |
| 2611 | 2630 | if templ_7745c5c3_Err != nil { | |
| 2612 | 2631 | return templ_7745c5c3_Err | |
| 2613 | 2632 | } | |
| 2614 | - | var templ_7745c5c3_Var136 string | |
| 2615 | - | templ_7745c5c3_Var136, templ_7745c5c3_Err = templ.JoinStringErrs(c.Note) | |
| 2633 | + | var templ_7745c5c3_Var137 string | |
| 2634 | + | templ_7745c5c3_Var137, templ_7745c5c3_Err = templ.JoinStringErrs(c.Note) | |
| 2616 | 2635 | if templ_7745c5c3_Err != nil { | |
| 2617 | - | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 378, Col: 27} | |
| 2636 | + | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 381, Col: 27} | |
| 2618 | 2637 | } | |
| 2619 | - | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var136)) | |
| 2638 | + | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var137)) | |
| 2620 | 2639 | if templ_7745c5c3_Err != nil { | |
| 2621 | 2640 | return templ_7745c5c3_Err | |
| 2622 | 2641 | } | |
| 2623 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 222, "</p>") | |
| 2642 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 224, "</p>") | |
| 2624 | 2643 | if templ_7745c5c3_Err != nil { | |
| 2625 | 2644 | return templ_7745c5c3_Err | |
| 2626 | 2645 | } | |
| 2627 | 2646 | } | |
| 2628 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 223, "</section>") | |
| 2647 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 225, "</section>") | |
| 2629 | 2648 | if templ_7745c5c3_Err != nil { | |
| 2630 | 2649 | return templ_7745c5c3_Err | |
| 2631 | 2650 | } | |
| @@ -495,7 +495,7 @@ func RunDetail(l Layout, p RunPage) templ.Component { | |||||
| 495 | if templ_7745c5c3_Err != nil { | 495 | if templ_7745c5c3_Err != nil { | ||
| 496 | return templ_7745c5c3_Err | 496 | return templ_7745c5c3_Err | ||
| 497 | } | 497 | } | ||
| 498 | - | templ_7745c5c3_Err = RunSummaries(p.Summaries).Render(ctx, templ_7745c5c3_Buffer) | 498 | + | templ_7745c5c3_Err = RunSummaries(p.Summaries, p.SummariesMore).Render(ctx, templ_7745c5c3_Buffer) |
| 499 | if templ_7745c5c3_Err != nil { | 499 | if templ_7745c5c3_Err != nil { | ||
| 500 | return templ_7745c5c3_Err | 500 | return templ_7745c5c3_Err | ||
| 501 | } | 501 | } | ||
| @@ -1271,7 +1271,7 @@ func JobAnnotations(anns []AnnotationView, more bool) templ.Component { | |||||
| 1271 | // RunSummaries is the job summaries of a run, one block per step that wrote | 1271 | // RunSummaries is the job summaries of a run, one block per step that wrote | ||
| 1272 | // one. The Markdown is rendered by the README renderer: raw HTML dropped, URLs | 1272 | // one. The Markdown is rendered by the README renderer: raw HTML dropped, URLs | ||
| 1273 | // filtered, images shown as their alt text. | 1273 | // filtered, images shown as their alt text. | ||
| 1274 | - | func RunSummaries(sums []JobSummaries) templ.Component { | 1274 | + | func RunSummaries(sums []JobSummaries, more bool) templ.Component { |
| 1275 | return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) { | 1275 | return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) { | ||
| 1276 | templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context | 1276 | templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context | ||
| 1277 | if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil { | 1277 | if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil { | ||
| @@ -1431,6 +1431,25 @@ func RunSummaries(sums []JobSummaries) templ.Component { | |||||
| 1431 | return templ_7745c5c3_Err | 1431 | return templ_7745c5c3_Err | ||
| 1432 | } | 1432 | } | ||
| 1433 | } | 1433 | } | ||
| 1434 | + | if more { | |||
| 1435 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 119, "<p class=\"mute\">more summaries are not shown: the summaries of the page are over ") | |||
| 1436 | + | if templ_7745c5c3_Err != nil { | |||
| 1437 | + | return templ_7745c5c3_Err | |||
| 1438 | + | } | |||
| 1439 | + | var templ_7745c5c3_Var76 string | |||
| 1440 | + | templ_7745c5c3_Var76, templ_7745c5c3_Err = templ.JoinStringErrs(humanSize(maxSummaryPageBytes)) | |||
| 1441 | + | if templ_7745c5c3_Err != nil { | |||
| 1442 | + | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 211, Col: 115} | |||
| 1443 | + | } | |||
| 1444 | + | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var76)) | |||
| 1445 | + | if templ_7745c5c3_Err != nil { | |||
| 1446 | + | return templ_7745c5c3_Err | |||
| 1447 | + | } | |||
| 1448 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 120, ".</p>") | |||
| 1449 | + | if templ_7745c5c3_Err != nil { | |||
| 1450 | + | return templ_7745c5c3_Err | |||
| 1451 | + | } | |||
| 1452 | + | } | |||
| 1434 | return nil | 1453 | return nil | ||
| 1435 | }) | 1454 | }) | ||
| 1436 | } | 1455 | } | ||
| @@ -1451,256 +1470,256 @@ func runRail(p RunPage) templ.Component { | |||||
| 1451 | }() | 1470 | }() | ||
| 1452 | } | 1471 | } | ||
| 1453 | ctx = templ.InitializeContext(ctx) | 1472 | ctx = templ.InitializeContext(ctx) | ||
| 1454 | - | templ_7745c5c3_Var76 := templ.GetChildren(ctx) | 1473 | + | templ_7745c5c3_Var77 := templ.GetChildren(ctx) |
| 1455 | - | if templ_7745c5c3_Var76 == nil { | 1474 | + | if templ_7745c5c3_Var77 == nil { |
| 1456 | - | templ_7745c5c3_Var76 = templ.NopComponent | 1475 | + | templ_7745c5c3_Var77 = templ.NopComponent |
| 1457 | } | 1476 | } | ||
| 1458 | ctx = templ.ClearChildren(ctx) | 1477 | ctx = templ.ClearChildren(ctx) | ||
| 1459 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 119, "<section aria-labelledby=\"r-run\"><h2 id=\"r-run\">Run</h2><dl class=\"kv\"><dt>result</dt><dd>") | 1478 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 121, "<section aria-labelledby=\"r-run\"><h2 id=\"r-run\">Run</h2><dl class=\"kv\"><dt>result</dt><dd>") |
| 1460 | if templ_7745c5c3_Err != nil { | 1479 | if templ_7745c5c3_Err != nil { | ||
| 1461 | return templ_7745c5c3_Err | 1480 | return templ_7745c5c3_Err | ||
| 1462 | } | 1481 | } | ||
| 1463 | - | var templ_7745c5c3_Var77 string | 1482 | + | var templ_7745c5c3_Var78 string |
| 1464 | - | templ_7745c5c3_Var77, templ_7745c5c3_Err = templ.JoinStringErrs(p.State) | 1483 | + | templ_7745c5c3_Var78, templ_7745c5c3_Err = templ.JoinStringErrs(p.State) |
| 1465 | if templ_7745c5c3_Err != nil { | 1484 | if templ_7745c5c3_Err != nil { | ||
| 1466 | - | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 217, Col: 16} | 1485 | + | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 220, Col: 16} |
| 1467 | - | } | |||
| 1468 | - | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var77)) | |||
| 1469 | - | if templ_7745c5c3_Err != nil { | |||
| 1470 | - | return templ_7745c5c3_Err | |||
| 1471 | - | } | |||
| 1472 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 120, "</dd><dt>commit</dt><dd><a href=\"") | |||
| 1473 | - | if templ_7745c5c3_Err != nil { | |||
| 1474 | - | return templ_7745c5c3_Err | |||
| 1475 | - | } | |||
| 1476 | - | var templ_7745c5c3_Var78 templ.SafeURL | |||
| 1477 | - | templ_7745c5c3_Var78, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.CHref)) | |||
| 1478 | - | if templ_7745c5c3_Err != nil { | |||
| 1479 | - | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 219, Col: 39} | |||
| 1480 | } | 1486 | } | ||
| 1481 | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var78)) | 1487 | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var78)) | ||
| 1482 | if templ_7745c5c3_Err != nil { | 1488 | if templ_7745c5c3_Err != nil { | ||
| 1483 | return templ_7745c5c3_Err | 1489 | return templ_7745c5c3_Err | ||
| 1484 | } | 1490 | } | ||
| 1485 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 121, "\">") | 1491 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 122, "</dd><dt>commit</dt><dd><a href=\"") |
| 1486 | if templ_7745c5c3_Err != nil { | 1492 | if templ_7745c5c3_Err != nil { | ||
| 1487 | return templ_7745c5c3_Err | 1493 | return templ_7745c5c3_Err | ||
| 1488 | } | 1494 | } | ||
| 1489 | - | var templ_7745c5c3_Var79 string | 1495 | + | var templ_7745c5c3_Var79 templ.SafeURL |
| 1490 | - | templ_7745c5c3_Var79, templ_7745c5c3_Err = templ.JoinStringErrs(p.Short) | 1496 | + | templ_7745c5c3_Var79, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.CHref)) |
| 1491 | if templ_7745c5c3_Err != nil { | 1497 | if templ_7745c5c3_Err != nil { | ||
| 1492 | - | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 219, Col: 51} | 1498 | + | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 222, Col: 39} |
| 1493 | } | 1499 | } | ||
| 1494 | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var79)) | 1500 | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var79)) | ||
| 1495 | if templ_7745c5c3_Err != nil { | 1501 | if templ_7745c5c3_Err != nil { | ||
| 1496 | return templ_7745c5c3_Err | 1502 | return templ_7745c5c3_Err | ||
| 1497 | } | 1503 | } | ||
| 1498 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 122, "</a></dd><dt>ref</dt><dd><a href=\"") | 1504 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 123, "\">") |
| 1499 | if templ_7745c5c3_Err != nil { | 1505 | if templ_7745c5c3_Err != nil { | ||
| 1500 | return templ_7745c5c3_Err | 1506 | return templ_7745c5c3_Err | ||
| 1501 | } | 1507 | } | ||
| 1502 | - | var templ_7745c5c3_Var80 templ.SafeURL | 1508 | + | var templ_7745c5c3_Var80 string |
| 1503 | - | templ_7745c5c3_Var80, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.RefHref)) | 1509 | + | templ_7745c5c3_Var80, templ_7745c5c3_Err = templ.JoinStringErrs(p.Short) |
| 1504 | if templ_7745c5c3_Err != nil { | 1510 | if templ_7745c5c3_Err != nil { | ||
| 1505 | - | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 221, Col: 41} | 1511 | + | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 222, Col: 51} |
| 1506 | } | 1512 | } | ||
| 1507 | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var80)) | 1513 | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var80)) | ||
| 1508 | if templ_7745c5c3_Err != nil { | 1514 | if templ_7745c5c3_Err != nil { | ||
| 1509 | return templ_7745c5c3_Err | 1515 | return templ_7745c5c3_Err | ||
| 1510 | } | 1516 | } | ||
| 1511 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 123, "\">") | 1517 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 124, "</a></dd><dt>ref</dt><dd><a href=\"") |
| 1512 | if templ_7745c5c3_Err != nil { | 1518 | if templ_7745c5c3_Err != nil { | ||
| 1513 | return templ_7745c5c3_Err | 1519 | return templ_7745c5c3_Err | ||
| 1514 | } | 1520 | } | ||
| 1515 | - | var templ_7745c5c3_Var81 string | 1521 | + | var templ_7745c5c3_Var81 templ.SafeURL |
| 1516 | - | templ_7745c5c3_Var81, templ_7745c5c3_Err = templ.JoinStringErrs(p.Ref) | 1522 | + | templ_7745c5c3_Var81, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.RefHref)) |
| 1517 | if templ_7745c5c3_Err != nil { | 1523 | if templ_7745c5c3_Err != nil { | ||
| 1518 | - | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 221, Col: 51} | 1524 | + | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 224, Col: 41} |
| 1519 | } | 1525 | } | ||
| 1520 | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var81)) | 1526 | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var81)) | ||
| 1521 | if templ_7745c5c3_Err != nil { | 1527 | if templ_7745c5c3_Err != nil { | ||
| 1522 | return templ_7745c5c3_Err | 1528 | return templ_7745c5c3_Err | ||
| 1523 | } | 1529 | } | ||
| 1524 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 124, "</a></dd><dt>actor</dt><dd>") | 1530 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 125, "\">") |
| 1525 | if templ_7745c5c3_Err != nil { | 1531 | if templ_7745c5c3_Err != nil { | ||
| 1526 | return templ_7745c5c3_Err | 1532 | return templ_7745c5c3_Err | ||
| 1527 | } | 1533 | } | ||
| 1528 | var templ_7745c5c3_Var82 string | 1534 | var templ_7745c5c3_Var82 string | ||
| 1529 | - | templ_7745c5c3_Var82, templ_7745c5c3_Err = templ.JoinStringErrs(p.Actor) | 1535 | + | templ_7745c5c3_Var82, templ_7745c5c3_Err = templ.JoinStringErrs(p.Ref) |
| 1530 | if templ_7745c5c3_Err != nil { | 1536 | if templ_7745c5c3_Err != nil { | ||
| 1531 | - | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 223, Col: 16} | 1537 | + | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 224, Col: 51} |
| 1532 | } | 1538 | } | ||
| 1533 | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var82)) | 1539 | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var82)) | ||
| 1534 | if templ_7745c5c3_Err != nil { | 1540 | if templ_7745c5c3_Err != nil { | ||
| 1535 | return templ_7745c5c3_Err | 1541 | return templ_7745c5c3_Err | ||
| 1536 | } | 1542 | } | ||
| 1537 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 125, "</dd><dt>attempt</dt><dd>") | 1543 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 126, "</a></dd><dt>actor</dt><dd>") |
| 1538 | if templ_7745c5c3_Err != nil { | 1544 | if templ_7745c5c3_Err != nil { | ||
| 1539 | return templ_7745c5c3_Err | 1545 | return templ_7745c5c3_Err | ||
| 1540 | } | 1546 | } | ||
| 1541 | var templ_7745c5c3_Var83 string | 1547 | var templ_7745c5c3_Var83 string | ||
| 1542 | - | templ_7745c5c3_Var83, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(int(p.Attempt))) | 1548 | + | templ_7745c5c3_Var83, templ_7745c5c3_Err = templ.JoinStringErrs(p.Actor) |
| 1543 | if templ_7745c5c3_Err != nil { | 1549 | if templ_7745c5c3_Err != nil { | ||
| 1544 | - | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 225, Col: 29} | 1550 | + | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 226, Col: 16} |
| 1545 | } | 1551 | } | ||
| 1546 | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var83)) | 1552 | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var83)) | ||
| 1547 | if templ_7745c5c3_Err != nil { | 1553 | if templ_7745c5c3_Err != nil { | ||
| 1548 | return templ_7745c5c3_Err | 1554 | return templ_7745c5c3_Err | ||
| 1549 | } | 1555 | } | ||
| 1550 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 126, " of ") | 1556 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 127, "</dd><dt>attempt</dt><dd>") |
| 1551 | if templ_7745c5c3_Err != nil { | 1557 | if templ_7745c5c3_Err != nil { | ||
| 1552 | return templ_7745c5c3_Err | 1558 | return templ_7745c5c3_Err | ||
| 1553 | } | 1559 | } | ||
| 1554 | var templ_7745c5c3_Var84 string | 1560 | var templ_7745c5c3_Var84 string | ||
| 1555 | - | templ_7745c5c3_Var84, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(int(p.Latest))) | 1561 | + | templ_7745c5c3_Var84, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(int(p.Attempt))) |
| 1556 | if templ_7745c5c3_Err != nil { | 1562 | if templ_7745c5c3_Err != nil { | ||
| 1557 | - | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 225, Col: 56} | 1563 | + | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 228, Col: 29} |
| 1558 | } | 1564 | } | ||
| 1559 | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var84)) | 1565 | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var84)) | ||
| 1560 | if templ_7745c5c3_Err != nil { | 1566 | if templ_7745c5c3_Err != nil { | ||
| 1561 | return templ_7745c5c3_Err | 1567 | return templ_7745c5c3_Err | ||
| 1562 | } | 1568 | } | ||
| 1563 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 127, "</dd></dl>") | 1569 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 128, " of ") |
| 1570 | + | if templ_7745c5c3_Err != nil { | |||
| 1571 | + | return templ_7745c5c3_Err | |||
| 1572 | + | } | |||
| 1573 | + | var templ_7745c5c3_Var85 string | |||
| 1574 | + | templ_7745c5c3_Var85, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(int(p.Latest))) | |||
| 1575 | + | if templ_7745c5c3_Err != nil { | |||
| 1576 | + | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 228, Col: 56} | |||
| 1577 | + | } | |||
| 1578 | + | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var85)) | |||
| 1579 | + | if templ_7745c5c3_Err != nil { | |||
| 1580 | + | return templ_7745c5c3_Err | |||
| 1581 | + | } | |||
| 1582 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 129, "</dd></dl>") | |||
| 1564 | if templ_7745c5c3_Err != nil { | 1583 | if templ_7745c5c3_Err != nil { | ||
| 1565 | return templ_7745c5c3_Err | 1584 | return templ_7745c5c3_Err | ||
| 1566 | } | 1585 | } | ||
| 1567 | if len(p.Attempts) > 0 { | 1586 | if len(p.Attempts) > 0 { | ||
| 1568 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 128, "<ul class=\"attempts\">") | 1587 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 130, "<ul class=\"attempts\">") |
| 1569 | if templ_7745c5c3_Err != nil { | 1588 | if templ_7745c5c3_Err != nil { | ||
| 1570 | return templ_7745c5c3_Err | 1589 | return templ_7745c5c3_Err | ||
| 1571 | } | 1590 | } | ||
| 1572 | for _, a := range p.Attempts { | 1591 | for _, a := range p.Attempts { | ||
| 1573 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 129, "<li>") | 1592 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 131, "<li>") |
| 1574 | if templ_7745c5c3_Err != nil { | 1593 | if templ_7745c5c3_Err != nil { | ||
| 1575 | return templ_7745c5c3_Err | 1594 | return templ_7745c5c3_Err | ||
| 1576 | } | 1595 | } | ||
| 1577 | if a.Current { | 1596 | if a.Current { | ||
| 1578 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 130, "<span aria-current=\"page\">") | 1597 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 132, "<span aria-current=\"page\">") |
| 1579 | if templ_7745c5c3_Err != nil { | 1598 | if templ_7745c5c3_Err != nil { | ||
| 1580 | return templ_7745c5c3_Err | 1599 | return templ_7745c5c3_Err | ||
| 1581 | } | 1600 | } | ||
| 1582 | - | var templ_7745c5c3_Var85 string | 1601 | + | var templ_7745c5c3_Var86 string |
| 1583 | - | templ_7745c5c3_Var85, templ_7745c5c3_Err = templ.JoinStringErrs(a.Label) | 1602 | + | templ_7745c5c3_Var86, templ_7745c5c3_Err = templ.JoinStringErrs(a.Label) |
| 1584 | if templ_7745c5c3_Err != nil { | 1603 | if templ_7745c5c3_Err != nil { | ||
| 1585 | - | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 232, Col: 42} | 1604 | + | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 235, Col: 42} |
| 1586 | } | 1605 | } | ||
| 1587 | - | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var85)) | 1606 | + | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var86)) |
| 1588 | if templ_7745c5c3_Err != nil { | 1607 | if templ_7745c5c3_Err != nil { | ||
| 1589 | return templ_7745c5c3_Err | 1608 | return templ_7745c5c3_Err | ||
| 1590 | } | 1609 | } | ||
| 1591 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 131, "</span>") | 1610 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 133, "</span>") |
| 1592 | if templ_7745c5c3_Err != nil { | 1611 | if templ_7745c5c3_Err != nil { | ||
| 1593 | return templ_7745c5c3_Err | 1612 | return templ_7745c5c3_Err | ||
| 1594 | } | 1613 | } | ||
| 1595 | } else { | 1614 | } else { | ||
| 1596 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 132, "<a href=\"") | 1615 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 134, "<a href=\"") |
| 1597 | if templ_7745c5c3_Err != nil { | 1616 | if templ_7745c5c3_Err != nil { | ||
| 1598 | return templ_7745c5c3_Err | 1617 | return templ_7745c5c3_Err | ||
| 1599 | } | 1618 | } | ||
| 1600 | - | var templ_7745c5c3_Var86 templ.SafeURL | 1619 | + | var templ_7745c5c3_Var87 templ.SafeURL |
| 1601 | - | templ_7745c5c3_Var86, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(a.Href)) | 1620 | + | templ_7745c5c3_Var87, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(a.Href)) |
| 1602 | if templ_7745c5c3_Err != nil { | 1621 | if templ_7745c5c3_Err != nil { | ||
| 1603 | - | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 234, Col: 38} | 1622 | + | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 237, Col: 38} |
| 1604 | } | 1623 | } | ||
| 1605 | - | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var86)) | 1624 | + | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var87)) |
| 1606 | if templ_7745c5c3_Err != nil { | 1625 | if templ_7745c5c3_Err != nil { | ||
| 1607 | return templ_7745c5c3_Err | 1626 | return templ_7745c5c3_Err | ||
| 1608 | } | 1627 | } | ||
| 1609 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 133, "\">") | 1628 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 135, "\">") |
| 1610 | if templ_7745c5c3_Err != nil { | 1629 | if templ_7745c5c3_Err != nil { | ||
| 1611 | return templ_7745c5c3_Err | 1630 | return templ_7745c5c3_Err | ||
| 1612 | } | 1631 | } | ||
| 1613 | - | var templ_7745c5c3_Var87 string | 1632 | + | var templ_7745c5c3_Var88 string |
| 1614 | - | templ_7745c5c3_Var87, templ_7745c5c3_Err = templ.JoinStringErrs(a.Label) | 1633 | + | templ_7745c5c3_Var88, templ_7745c5c3_Err = templ.JoinStringErrs(a.Label) |
| 1615 | if templ_7745c5c3_Err != nil { | 1634 | if templ_7745c5c3_Err != nil { | ||
| 1616 | - | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 234, Col: 50} | 1635 | + | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 237, Col: 50} |
| 1617 | } | 1636 | } | ||
| 1618 | - | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var87)) | 1637 | + | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var88)) |
| 1619 | if templ_7745c5c3_Err != nil { | 1638 | if templ_7745c5c3_Err != nil { | ||
| 1620 | return templ_7745c5c3_Err | 1639 | return templ_7745c5c3_Err | ||
| 1621 | } | 1640 | } | ||
| 1622 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 134, "</a>") | 1641 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 136, "</a>") |
| 1623 | if templ_7745c5c3_Err != nil { | 1642 | if templ_7745c5c3_Err != nil { | ||
| 1624 | return templ_7745c5c3_Err | 1643 | return templ_7745c5c3_Err | ||
| 1625 | } | 1644 | } | ||
| 1626 | } | 1645 | } | ||
| 1627 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 135, "</li>") | 1646 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 137, "</li>") |
| 1628 | if templ_7745c5c3_Err != nil { | 1647 | if templ_7745c5c3_Err != nil { | ||
| 1629 | return templ_7745c5c3_Err | 1648 | return templ_7745c5c3_Err | ||
| 1630 | } | 1649 | } | ||
| 1631 | } | 1650 | } | ||
| 1632 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 136, "</ul>") | 1651 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 138, "</ul>") |
| 1633 | if templ_7745c5c3_Err != nil { | 1652 | if templ_7745c5c3_Err != nil { | ||
| 1634 | return templ_7745c5c3_Err | 1653 | return templ_7745c5c3_Err | ||
| 1635 | } | 1654 | } | ||
| 1636 | } | 1655 | } | ||
| 1637 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 137, "</section>") | 1656 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 139, "</section>") |
| 1638 | if templ_7745c5c3_Err != nil { | 1657 | if templ_7745c5c3_Err != nil { | ||
| 1639 | return templ_7745c5c3_Err | 1658 | return templ_7745c5c3_Err | ||
| 1640 | } | 1659 | } | ||
| 1641 | if p.CancelAction != "" || p.RerunAction != "" { | 1660 | if p.CancelAction != "" || p.RerunAction != "" { | ||
| 1642 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 138, "<section aria-labelledby=\"r-act\" class=\"decide\"><h2 id=\"r-act\">Actions</h2><div class=\"d-btns\">") | 1661 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 140, "<section aria-labelledby=\"r-act\" class=\"decide\"><h2 id=\"r-act\">Actions</h2><div class=\"d-btns\">") |
| 1643 | if templ_7745c5c3_Err != nil { | 1662 | if templ_7745c5c3_Err != nil { | ||
| 1644 | return templ_7745c5c3_Err | 1663 | return templ_7745c5c3_Err | ||
| 1645 | } | 1664 | } | ||
| 1646 | if p.CancelAction != "" { | 1665 | if p.CancelAction != "" { | ||
| 1647 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 139, "<form method=\"post\" action=\"") | 1666 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 141, "<form method=\"post\" action=\"") |
| 1648 | if templ_7745c5c3_Err != nil { | 1667 | if templ_7745c5c3_Err != nil { | ||
| 1649 | return templ_7745c5c3_Err | 1668 | return templ_7745c5c3_Err | ||
| 1650 | } | 1669 | } | ||
| 1651 | - | var templ_7745c5c3_Var88 templ.SafeURL | 1670 | + | var templ_7745c5c3_Var89 templ.SafeURL |
| 1652 | - | templ_7745c5c3_Var88, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.CancelAction)) | 1671 | + | templ_7745c5c3_Var89, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.CancelAction)) |
| 1653 | if templ_7745c5c3_Err != nil { | 1672 | if templ_7745c5c3_Err != nil { | ||
| 1654 | - | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 246, Col: 63} | 1673 | + | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 249, Col: 63} |
| 1655 | } | 1674 | } | ||
| 1656 | - | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var88)) | 1675 | + | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var89)) |
| 1657 | if templ_7745c5c3_Err != nil { | 1676 | if templ_7745c5c3_Err != nil { | ||
| 1658 | return templ_7745c5c3_Err | 1677 | return templ_7745c5c3_Err | ||
| 1659 | } | 1678 | } | ||
| 1660 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 140, "\"><button type=\"submit\" class=\"btn\">Cancel run</button></form>") | 1679 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 142, "\"><button type=\"submit\" class=\"btn\">Cancel run</button></form>") |
| 1661 | if templ_7745c5c3_Err != nil { | 1680 | if templ_7745c5c3_Err != nil { | ||
| 1662 | return templ_7745c5c3_Err | 1681 | return templ_7745c5c3_Err | ||
| 1663 | } | 1682 | } | ||
| 1664 | } | 1683 | } | ||
| 1665 | if p.RerunAction != "" { | 1684 | if p.RerunAction != "" { | ||
| 1666 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 141, "<form method=\"post\" action=\"") | 1685 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 143, "<form method=\"post\" action=\"") |
| 1667 | if templ_7745c5c3_Err != nil { | 1686 | if templ_7745c5c3_Err != nil { | ||
| 1668 | return templ_7745c5c3_Err | 1687 | return templ_7745c5c3_Err | ||
| 1669 | } | 1688 | } | ||
| 1670 | - | var templ_7745c5c3_Var89 templ.SafeURL | 1689 | + | var templ_7745c5c3_Var90 templ.SafeURL |
| 1671 | - | templ_7745c5c3_Var89, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.RerunAction)) | 1690 | + | templ_7745c5c3_Var90, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.RerunAction)) |
| 1672 | if templ_7745c5c3_Err != nil { | 1691 | if templ_7745c5c3_Err != nil { | ||
| 1673 | - | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 249, Col: 62} | 1692 | + | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 252, Col: 62} |
| 1674 | } | 1693 | } | ||
| 1675 | - | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var89)) | 1694 | + | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var90)) |
| 1676 | if templ_7745c5c3_Err != nil { | 1695 | if templ_7745c5c3_Err != nil { | ||
| 1677 | return templ_7745c5c3_Err | 1696 | return templ_7745c5c3_Err | ||
| 1678 | } | 1697 | } | ||
| 1679 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 142, "\"><button type=\"submit\" class=\"btn primary\">Re-run all jobs</button></form>") | 1698 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 144, "\"><button type=\"submit\" class=\"btn primary\">Re-run all jobs</button></form>") |
| 1680 | if templ_7745c5c3_Err != nil { | 1699 | if templ_7745c5c3_Err != nil { | ||
| 1681 | return templ_7745c5c3_Err | 1700 | return templ_7745c5c3_Err | ||
| 1682 | } | 1701 | } | ||
| 1683 | } | 1702 | } | ||
| 1684 | if p.CanRerunFailed { | 1703 | if p.CanRerunFailed { | ||
| 1685 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 143, "<form method=\"post\" action=\"") | 1704 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 145, "<form method=\"post\" action=\"") |
| 1686 | if templ_7745c5c3_Err != nil { | 1705 | if templ_7745c5c3_Err != nil { | ||
| 1687 | return templ_7745c5c3_Err | 1706 | return templ_7745c5c3_Err | ||
| 1688 | } | 1707 | } | ||
| 1689 | - | var templ_7745c5c3_Var90 templ.SafeURL | 1708 | + | var templ_7745c5c3_Var91 templ.SafeURL |
| 1690 | - | templ_7745c5c3_Var90, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.RerunFailedAction)) | 1709 | + | templ_7745c5c3_Var91, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.RerunFailedAction)) |
| 1691 | if templ_7745c5c3_Err != nil { | 1710 | if templ_7745c5c3_Err != nil { | ||
| 1692 | - | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 252, Col: 68} | 1711 | + | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 255, Col: 68} |
| 1693 | } | 1712 | } | ||
| 1694 | - | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var90)) | 1713 | + | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var91)) |
| 1695 | if templ_7745c5c3_Err != nil { | 1714 | if templ_7745c5c3_Err != nil { | ||
| 1696 | return templ_7745c5c3_Err | 1715 | return templ_7745c5c3_Err | ||
| 1697 | } | 1716 | } | ||
| 1698 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 144, "\"><button type=\"submit\" class=\"btn\">Re-run failed jobs</button></form>") | 1717 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 146, "\"><button type=\"submit\" class=\"btn\">Re-run failed jobs</button></form>") |
| 1699 | if templ_7745c5c3_Err != nil { | 1718 | if templ_7745c5c3_Err != nil { | ||
| 1700 | return templ_7745c5c3_Err | 1719 | return templ_7745c5c3_Err | ||
| 1701 | } | 1720 | } | ||
| 1702 | } | 1721 | } | ||
| 1703 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 145, "</div></section>") | 1722 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 147, "</div></section>") |
| 1704 | if templ_7745c5c3_Err != nil { | 1723 | if templ_7745c5c3_Err != nil { | ||
| 1705 | return templ_7745c5c3_Err | 1724 | return templ_7745c5c3_Err | ||
| 1706 | } | 1725 | } | ||
| @@ -1727,25 +1746,25 @@ func JobHead(j JobRow, total int64) templ.Component { | |||||
| 1727 | }() | 1746 | }() | ||
| 1728 | } | 1747 | } | ||
| 1729 | ctx = templ.InitializeContext(ctx) | 1748 | ctx = templ.InitializeContext(ctx) | ||
| 1730 | - | templ_7745c5c3_Var91 := templ.GetChildren(ctx) | 1749 | + | templ_7745c5c3_Var92 := templ.GetChildren(ctx) |
| 1731 | - | if templ_7745c5c3_Var91 == nil { | 1750 | + | if templ_7745c5c3_Var92 == nil { |
| 1732 | - | templ_7745c5c3_Var91 = templ.NopComponent | 1751 | + | templ_7745c5c3_Var92 = templ.NopComponent |
| 1733 | } | 1752 | } | ||
| 1734 | ctx = templ.ClearChildren(ctx) | 1753 | ctx = templ.ClearChildren(ctx) | ||
| 1735 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 146, "<div id=\"job-head\" data-total=\"") | 1754 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 148, "<div id=\"job-head\" data-total=\"") |
| 1736 | if templ_7745c5c3_Err != nil { | 1755 | if templ_7745c5c3_Err != nil { | ||
| 1737 | return templ_7745c5c3_Err | 1756 | return templ_7745c5c3_Err | ||
| 1738 | } | 1757 | } | ||
| 1739 | - | var templ_7745c5c3_Var92 string | 1758 | + | var templ_7745c5c3_Var93 string |
| 1740 | - | templ_7745c5c3_Var92, templ_7745c5c3_Err = templ.ResolveAttributeValue(itoa64(total)) | 1759 | + | templ_7745c5c3_Var93, templ_7745c5c3_Err = templ.ResolveAttributeValue(itoa64(total)) |
| 1741 | if templ_7745c5c3_Err != nil { | 1760 | if templ_7745c5c3_Err != nil { | ||
| 1742 | - | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 262, Col: 46} | 1761 | + | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 265, Col: 46} |
| 1743 | } | 1762 | } | ||
| 1744 | - | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var92) | 1763 | + | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var93) |
| 1745 | if templ_7745c5c3_Err != nil { | 1764 | if templ_7745c5c3_Err != nil { | ||
| 1746 | return templ_7745c5c3_Err | 1765 | return templ_7745c5c3_Err | ||
| 1747 | } | 1766 | } | ||
| 1748 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 147, "\"><h2 class=\"run-h\">") | 1767 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 149, "\"><h2 class=\"run-h\">") |
| 1749 | if templ_7745c5c3_Err != nil { | 1768 | if templ_7745c5c3_Err != nil { | ||
| 1750 | return templ_7745c5c3_Err | 1769 | return templ_7745c5c3_Err | ||
| 1751 | } | 1770 | } | ||
| @@ -1753,74 +1772,74 @@ func JobHead(j JobRow, total int64) templ.Component { | |||||
| 1753 | if templ_7745c5c3_Err != nil { | 1772 | if templ_7745c5c3_Err != nil { | ||
| 1754 | return templ_7745c5c3_Err | 1773 | return templ_7745c5c3_Err | ||
| 1755 | } | 1774 | } | ||
| 1756 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 148, "<span>") | 1775 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 150, "<span>") |
| 1757 | if templ_7745c5c3_Err != nil { | 1776 | if templ_7745c5c3_Err != nil { | ||
| 1758 | return templ_7745c5c3_Err | 1777 | return templ_7745c5c3_Err | ||
| 1759 | } | 1778 | } | ||
| 1760 | - | var templ_7745c5c3_Var93 string | 1779 | + | var templ_7745c5c3_Var94 string |
| 1761 | - | templ_7745c5c3_Var93, templ_7745c5c3_Err = templ.JoinStringErrs(j.Name) | 1780 | + | templ_7745c5c3_Var94, templ_7745c5c3_Err = templ.JoinStringErrs(j.Name) |
| 1762 | if templ_7745c5c3_Err != nil { | 1781 | if templ_7745c5c3_Err != nil { | ||
| 1763 | - | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 263, Col: 61} | 1782 | + | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 266, Col: 61} |
| 1764 | } | 1783 | } | ||
| 1765 | - | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var93)) | 1784 | + | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var94)) |
| 1766 | if templ_7745c5c3_Err != nil { | 1785 | if templ_7745c5c3_Err != nil { | ||
| 1767 | return templ_7745c5c3_Err | 1786 | return templ_7745c5c3_Err | ||
| 1768 | } | 1787 | } | ||
| 1769 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 149, "</span> <span class=\"dim\">") | 1788 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 151, "</span> <span class=\"dim\">") |
| 1770 | if templ_7745c5c3_Err != nil { | 1789 | if templ_7745c5c3_Err != nil { | ||
| 1771 | return templ_7745c5c3_Err | 1790 | return templ_7745c5c3_Err | ||
| 1772 | } | 1791 | } | ||
| 1773 | - | var templ_7745c5c3_Var94 string | 1792 | + | var templ_7745c5c3_Var95 string |
| 1774 | - | templ_7745c5c3_Var94, templ_7745c5c3_Err = templ.JoinStringErrs(j.State) | 1793 | + | templ_7745c5c3_Var95, templ_7745c5c3_Err = templ.JoinStringErrs(j.State) |
| 1775 | if templ_7745c5c3_Err != nil { | 1794 | if templ_7745c5c3_Err != nil { | ||
| 1776 | - | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 263, Col: 98} | 1795 | + | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 266, Col: 98} |
| 1777 | } | 1796 | } | ||
| 1778 | - | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var94)) | 1797 | + | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var95)) |
| 1779 | if templ_7745c5c3_Err != nil { | 1798 | if templ_7745c5c3_Err != nil { | ||
| 1780 | return templ_7745c5c3_Err | 1799 | return templ_7745c5c3_Err | ||
| 1781 | } | 1800 | } | ||
| 1782 | - | var templ_7745c5c3_Var95 string | 1801 | + | var templ_7745c5c3_Var96 string |
| 1783 | - | templ_7745c5c3_Var95, templ_7745c5c3_Err = templ.JoinStringErrs(" ") | 1802 | + | templ_7745c5c3_Var96, templ_7745c5c3_Err = templ.JoinStringErrs(" ") |
| 1784 | if templ_7745c5c3_Err != nil { | 1803 | if templ_7745c5c3_Err != nil { | ||
| 1785 | - | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 263, Col: 105} | 1804 | + | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 266, Col: 105} |
| 1786 | } | 1805 | } | ||
| 1787 | - | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var95)) | 1806 | + | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var96)) |
| 1788 | if templ_7745c5c3_Err != nil { | 1807 | if templ_7745c5c3_Err != nil { | ||
| 1789 | return templ_7745c5c3_Err | 1808 | return templ_7745c5c3_Err | ||
| 1790 | } | 1809 | } | ||
| 1791 | - | var templ_7745c5c3_Var96 string | 1810 | + | var templ_7745c5c3_Var97 string |
| 1792 | - | templ_7745c5c3_Var96, templ_7745c5c3_Err = templ.JoinStringErrs(j.Duration) | 1811 | + | templ_7745c5c3_Var97, templ_7745c5c3_Err = templ.JoinStringErrs(j.Duration) |
| 1793 | if templ_7745c5c3_Err != nil { | 1812 | if templ_7745c5c3_Err != nil { | ||
| 1794 | - | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 263, Col: 119} | 1813 | + | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 266, Col: 119} |
| 1795 | } | 1814 | } | ||
| 1796 | - | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var96)) | 1815 | + | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var97)) |
| 1797 | if templ_7745c5c3_Err != nil { | 1816 | if templ_7745c5c3_Err != nil { | ||
| 1798 | return templ_7745c5c3_Err | 1817 | return templ_7745c5c3_Err | ||
| 1799 | } | 1818 | } | ||
| 1800 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 150, "</span></h2>") | 1819 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 152, "</span></h2>") |
| 1801 | if templ_7745c5c3_Err != nil { | 1820 | if templ_7745c5c3_Err != nil { | ||
| 1802 | return templ_7745c5c3_Err | 1821 | return templ_7745c5c3_Err | ||
| 1803 | } | 1822 | } | ||
| 1804 | if j.Error != "" { | 1823 | if j.Error != "" { | ||
| 1805 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 151, "<p class=\"job-err\">") | 1824 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 153, "<p class=\"job-err\">") |
| 1806 | if templ_7745c5c3_Err != nil { | 1825 | if templ_7745c5c3_Err != nil { | ||
| 1807 | return templ_7745c5c3_Err | 1826 | return templ_7745c5c3_Err | ||
| 1808 | } | 1827 | } | ||
| 1809 | - | var templ_7745c5c3_Var97 string | 1828 | + | var templ_7745c5c3_Var98 string |
| 1810 | - | templ_7745c5c3_Var97, templ_7745c5c3_Err = templ.JoinStringErrs(j.Error) | 1829 | + | templ_7745c5c3_Var98, templ_7745c5c3_Err = templ.JoinStringErrs(j.Error) |
| 1811 | if templ_7745c5c3_Err != nil { | 1830 | if templ_7745c5c3_Err != nil { | ||
| 1812 | - | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 265, Col: 31} | 1831 | + | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 268, Col: 31} |
| 1813 | } | 1832 | } | ||
| 1814 | - | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var97)) | 1833 | + | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var98)) |
| 1815 | if templ_7745c5c3_Err != nil { | 1834 | if templ_7745c5c3_Err != nil { | ||
| 1816 | return templ_7745c5c3_Err | 1835 | return templ_7745c5c3_Err | ||
| 1817 | } | 1836 | } | ||
| 1818 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 152, "</p>") | 1837 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 154, "</p>") |
| 1819 | if templ_7745c5c3_Err != nil { | 1838 | if templ_7745c5c3_Err != nil { | ||
| 1820 | return templ_7745c5c3_Err | 1839 | return templ_7745c5c3_Err | ||
| 1821 | } | 1840 | } | ||
| 1822 | } | 1841 | } | ||
| 1823 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 153, "</div>") | 1842 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 155, "</div>") |
| 1824 | if templ_7745c5c3_Err != nil { | 1843 | if templ_7745c5c3_Err != nil { | ||
| 1825 | return templ_7745c5c3_Err | 1844 | return templ_7745c5c3_Err | ||
| 1826 | } | 1845 | } | ||
| @@ -1845,17 +1864,17 @@ func JobSteps(steps []StepView) templ.Component { | |||||
| 1845 | }() | 1864 | }() | ||
| 1846 | } | 1865 | } | ||
| 1847 | ctx = templ.InitializeContext(ctx) | 1866 | ctx = templ.InitializeContext(ctx) | ||
| 1848 | - | templ_7745c5c3_Var98 := templ.GetChildren(ctx) | 1867 | + | templ_7745c5c3_Var99 := templ.GetChildren(ctx) |
| 1849 | - | if templ_7745c5c3_Var98 == nil { | 1868 | + | if templ_7745c5c3_Var99 == nil { |
| 1850 | - | templ_7745c5c3_Var98 = templ.NopComponent | 1869 | + | templ_7745c5c3_Var99 = templ.NopComponent |
| 1851 | } | 1870 | } | ||
| 1852 | ctx = templ.ClearChildren(ctx) | 1871 | ctx = templ.ClearChildren(ctx) | ||
| 1853 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 154, "<ol class=\"steps\" id=\"job-steps\">") | 1872 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 156, "<ol class=\"steps\" id=\"job-steps\">") |
| 1854 | if templ_7745c5c3_Err != nil { | 1873 | if templ_7745c5c3_Err != nil { | ||
| 1855 | return templ_7745c5c3_Err | 1874 | return templ_7745c5c3_Err | ||
| 1856 | } | 1875 | } | ||
| 1857 | for _, s := range steps { | 1876 | for _, s := range steps { | ||
| 1858 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 155, "<li>") | 1877 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 157, "<li>") |
| 1859 | if templ_7745c5c3_Err != nil { | 1878 | if templ_7745c5c3_Err != nil { | ||
| 1860 | return templ_7745c5c3_Err | 1879 | return templ_7745c5c3_Err | ||
| 1861 | } | 1880 | } | ||
| @@ -1864,74 +1883,74 @@ func JobSteps(steps []StepView) templ.Component { | |||||
| 1864 | return templ_7745c5c3_Err | 1883 | return templ_7745c5c3_Err | ||
| 1865 | } | 1884 | } | ||
| 1866 | if s.LogEnd > s.LogStart { | 1885 | if s.LogEnd > s.LogStart { | ||
| 1867 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 156, "<a href=\"") | 1886 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 158, "<a href=\"") |
| 1868 | if templ_7745c5c3_Err != nil { | 1887 | if templ_7745c5c3_Err != nil { | ||
| 1869 | return templ_7745c5c3_Err | 1888 | return templ_7745c5c3_Err | ||
| 1870 | } | 1889 | } | ||
| 1871 | - | var templ_7745c5c3_Var99 templ.SafeURL | 1890 | + | var templ_7745c5c3_Var100 templ.SafeURL |
| 1872 | - | templ_7745c5c3_Var99, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL("#L" + itoa64(s.LogStart))) | 1891 | + | templ_7745c5c3_Var100, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL("#L" + itoa64(s.LogStart))) |
| 1873 | if templ_7745c5c3_Err != nil { | 1892 | if templ_7745c5c3_Err != nil { | ||
| 1874 | - | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 277, Col: 55} | 1893 | + | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 280, Col: 55} |
| 1875 | } | 1894 | } | ||
| 1876 | - | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var99)) | 1895 | + | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var100)) |
| 1877 | if templ_7745c5c3_Err != nil { | 1896 | if templ_7745c5c3_Err != nil { | ||
| 1878 | return templ_7745c5c3_Err | 1897 | return templ_7745c5c3_Err | ||
| 1879 | } | 1898 | } | ||
| 1880 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 157, "\">") | 1899 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 159, "\">") |
| 1881 | if templ_7745c5c3_Err != nil { | 1900 | if templ_7745c5c3_Err != nil { | ||
| 1882 | return templ_7745c5c3_Err | 1901 | return templ_7745c5c3_Err | ||
| 1883 | } | 1902 | } | ||
| 1884 | - | var templ_7745c5c3_Var100 string | 1903 | + | var templ_7745c5c3_Var101 string |
| 1885 | - | templ_7745c5c3_Var100, templ_7745c5c3_Err = templ.JoinStringErrs(s.Name) | 1904 | + | templ_7745c5c3_Var101, templ_7745c5c3_Err = templ.JoinStringErrs(s.Name) |
| 1886 | if templ_7745c5c3_Err != nil { | 1905 | if templ_7745c5c3_Err != nil { | ||
| 1887 | - | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 277, Col: 66} | 1906 | + | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 280, Col: 66} |
| 1888 | } | 1907 | } | ||
| 1889 | - | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var100)) | 1908 | + | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var101)) |
| 1890 | if templ_7745c5c3_Err != nil { | 1909 | if templ_7745c5c3_Err != nil { | ||
| 1891 | return templ_7745c5c3_Err | 1910 | return templ_7745c5c3_Err | ||
| 1892 | } | 1911 | } | ||
| 1893 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 158, "</a> ") | 1912 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 160, "</a> ") |
| 1894 | if templ_7745c5c3_Err != nil { | 1913 | if templ_7745c5c3_Err != nil { | ||
| 1895 | return templ_7745c5c3_Err | 1914 | return templ_7745c5c3_Err | ||
| 1896 | } | 1915 | } | ||
| 1897 | } else { | 1916 | } else { | ||
| 1898 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 159, "<span>") | 1917 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 161, "<span>") |
| 1899 | if templ_7745c5c3_Err != nil { | 1918 | if templ_7745c5c3_Err != nil { | ||
| 1900 | return templ_7745c5c3_Err | 1919 | return templ_7745c5c3_Err | ||
| 1901 | } | 1920 | } | ||
| 1902 | - | var templ_7745c5c3_Var101 string | 1921 | + | var templ_7745c5c3_Var102 string |
| 1903 | - | templ_7745c5c3_Var101, templ_7745c5c3_Err = templ.JoinStringErrs(s.Name) | 1922 | + | templ_7745c5c3_Var102, templ_7745c5c3_Err = templ.JoinStringErrs(s.Name) |
| 1904 | if templ_7745c5c3_Err != nil { | 1923 | if templ_7745c5c3_Err != nil { | ||
| 1905 | - | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 279, Col: 19} | 1924 | + | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 282, Col: 19} |
| 1906 | } | 1925 | } | ||
| 1907 | - | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var101)) | 1926 | + | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var102)) |
| 1908 | if templ_7745c5c3_Err != nil { | 1927 | if templ_7745c5c3_Err != nil { | ||
| 1909 | return templ_7745c5c3_Err | 1928 | return templ_7745c5c3_Err | ||
| 1910 | } | 1929 | } | ||
| 1911 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 160, "</span> ") | 1930 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 162, "</span> ") |
| 1912 | if templ_7745c5c3_Err != nil { | 1931 | if templ_7745c5c3_Err != nil { | ||
| 1913 | return templ_7745c5c3_Err | 1932 | return templ_7745c5c3_Err | ||
| 1914 | } | 1933 | } | ||
| 1915 | } | 1934 | } | ||
| 1916 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 161, "<span class=\"dim\">") | 1935 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 163, "<span class=\"dim\">") |
| 1917 | if templ_7745c5c3_Err != nil { | 1936 | if templ_7745c5c3_Err != nil { | ||
| 1918 | return templ_7745c5c3_Err | 1937 | return templ_7745c5c3_Err | ||
| 1919 | } | 1938 | } | ||
| 1920 | - | var templ_7745c5c3_Var102 string | 1939 | + | var templ_7745c5c3_Var103 string |
| 1921 | - | templ_7745c5c3_Var102, templ_7745c5c3_Err = templ.JoinStringErrs(s.Duration) | 1940 | + | templ_7745c5c3_Var103, templ_7745c5c3_Err = templ.JoinStringErrs(s.Duration) |
| 1922 | if templ_7745c5c3_Err != nil { | 1941 | if templ_7745c5c3_Err != nil { | ||
| 1923 | - | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 281, Col: 34} | 1942 | + | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 284, Col: 34} |
| 1924 | } | 1943 | } | ||
| 1925 | - | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var102)) | 1944 | + | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var103)) |
| 1926 | if templ_7745c5c3_Err != nil { | 1945 | if templ_7745c5c3_Err != nil { | ||
| 1927 | return templ_7745c5c3_Err | 1946 | return templ_7745c5c3_Err | ||
| 1928 | } | 1947 | } | ||
| 1929 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 162, "</span></li>") | 1948 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 164, "</span></li>") |
| 1930 | if templ_7745c5c3_Err != nil { | 1949 | if templ_7745c5c3_Err != nil { | ||
| 1931 | return templ_7745c5c3_Err | 1950 | return templ_7745c5c3_Err | ||
| 1932 | } | 1951 | } | ||
| 1933 | } | 1952 | } | ||
| 1934 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 163, "</ol>") | 1953 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 165, "</ol>") |
| 1935 | if templ_7745c5c3_Err != nil { | 1954 | if templ_7745c5c3_Err != nil { | ||
| 1936 | return templ_7745c5c3_Err | 1955 | return templ_7745c5c3_Err | ||
| 1937 | } | 1956 | } | ||
| @@ -1955,12 +1974,12 @@ func Job(l Layout, p JobPage) templ.Component { | |||||
| 1955 | }() | 1974 | }() | ||
| 1956 | } | 1975 | } | ||
| 1957 | ctx = templ.InitializeContext(ctx) | 1976 | ctx = templ.InitializeContext(ctx) | ||
| 1958 | - | templ_7745c5c3_Var103 := templ.GetChildren(ctx) | 1977 | + | templ_7745c5c3_Var104 := templ.GetChildren(ctx) |
| 1959 | - | if templ_7745c5c3_Var103 == nil { | 1978 | + | if templ_7745c5c3_Var104 == nil { |
| 1960 | - | templ_7745c5c3_Var103 = templ.NopComponent | 1979 | + | templ_7745c5c3_Var104 = templ.NopComponent |
| 1961 | } | 1980 | } | ||
| 1962 | ctx = templ.ClearChildren(ctx) | 1981 | ctx = templ.ClearChildren(ctx) | ||
| 1963 | - | templ_7745c5c3_Var104 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) { | 1982 | + | templ_7745c5c3_Var105 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) { |
| 1964 | templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context | 1983 | templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context | ||
| 1965 | templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W) | 1984 | templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W) | ||
| 1966 | if !templ_7745c5c3_IsBuffer { | 1985 | if !templ_7745c5c3_IsBuffer { | ||
| @@ -1976,7 +1995,7 @@ func Job(l Layout, p JobPage) templ.Component { | |||||
| 1976 | if templ_7745c5c3_Err != nil { | 1995 | if templ_7745c5c3_Err != nil { | ||
| 1977 | return templ_7745c5c3_Err | 1996 | return templ_7745c5c3_Err | ||
| 1978 | } | 1997 | } | ||
| 1979 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 164, " ") | 1998 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 166, " ") |
| 1980 | if templ_7745c5c3_Err != nil { | 1999 | if templ_7745c5c3_Err != nil { | ||
| 1981 | return templ_7745c5c3_Err | 2000 | return templ_7745c5c3_Err | ||
| 1982 | } | 2001 | } | ||
| @@ -1984,7 +2003,7 @@ func Job(l Layout, p JobPage) templ.Component { | |||||
| 1984 | if templ_7745c5c3_Err != nil { | 2003 | if templ_7745c5c3_Err != nil { | ||
| 1985 | return templ_7745c5c3_Err | 2004 | return templ_7745c5c3_Err | ||
| 1986 | } | 2005 | } | ||
| 1987 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 165, " ") | 2006 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 167, " ") |
| 1988 | if templ_7745c5c3_Err != nil { | 2007 | if templ_7745c5c3_Err != nil { | ||
| 1989 | return templ_7745c5c3_Err | 2008 | return templ_7745c5c3_Err | ||
| 1990 | } | 2009 | } | ||
| @@ -1992,111 +2011,111 @@ func Job(l Layout, p JobPage) templ.Component { | |||||
| 1992 | if templ_7745c5c3_Err != nil { | 2011 | if templ_7745c5c3_Err != nil { | ||
| 1993 | return templ_7745c5c3_Err | 2012 | return templ_7745c5c3_Err | ||
| 1994 | } | 2013 | } | ||
| 1995 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 166, " <div id=\"job-log\" class=\"joblog\" data-total=\"") | 2014 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 168, " <div id=\"job-log\" class=\"joblog\" data-total=\"") |
| 1996 | if templ_7745c5c3_Err != nil { | 2015 | if templ_7745c5c3_Err != nil { | ||
| 1997 | return templ_7745c5c3_Err | 2016 | return templ_7745c5c3_Err | ||
| 1998 | } | 2017 | } | ||
| 1999 | - | var templ_7745c5c3_Var105 string | 2018 | + | var templ_7745c5c3_Var106 string |
| 2000 | - | templ_7745c5c3_Var105, templ_7745c5c3_Err = templ.ResolveAttributeValue(itoa64(p.Total)) | 2019 | + | templ_7745c5c3_Var106, templ_7745c5c3_Err = templ.ResolveAttributeValue(itoa64(p.Total)) |
| 2001 | if templ_7745c5c3_Err != nil { | 2020 | if templ_7745c5c3_Err != nil { | ||
| 2002 | - | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 292, Col: 63} | 2021 | + | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 295, Col: 63} |
| 2003 | } | 2022 | } | ||
| 2004 | - | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var105) | 2023 | + | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var106) |
| 2005 | if templ_7745c5c3_Err != nil { | 2024 | if templ_7745c5c3_Err != nil { | ||
| 2006 | return templ_7745c5c3_Err | 2025 | return templ_7745c5c3_Err | ||
| 2007 | } | 2026 | } | ||
| 2008 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 167, "\"") | 2027 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 169, "\"") |
| 2009 | if templ_7745c5c3_Err != nil { | 2028 | if templ_7745c5c3_Err != nil { | ||
| 2010 | return templ_7745c5c3_Err | 2029 | return templ_7745c5c3_Err | ||
| 2011 | } | 2030 | } | ||
| 2012 | if p.Follow { | 2031 | if p.Follow { | ||
| 2013 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 168, " data-follow") | 2032 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 170, " data-follow") |
| 2014 | if templ_7745c5c3_Err != nil { | 2033 | if templ_7745c5c3_Err != nil { | ||
| 2015 | return templ_7745c5c3_Err | 2034 | return templ_7745c5c3_Err | ||
| 2016 | } | 2035 | } | ||
| 2017 | } | 2036 | } | ||
| 2018 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 169, " data-stream=\"") | 2037 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 171, " data-stream=\"") |
| 2019 | if templ_7745c5c3_Err != nil { | 2038 | if templ_7745c5c3_Err != nil { | ||
| 2020 | return templ_7745c5c3_Err | 2039 | return templ_7745c5c3_Err | ||
| 2021 | } | 2040 | } | ||
| 2022 | - | var templ_7745c5c3_Var106 string | 2041 | + | var templ_7745c5c3_Var107 string |
| 2023 | - | templ_7745c5c3_Var106, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.StreamHref) | 2042 | + | templ_7745c5c3_Var107, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.StreamHref) |
| 2024 | if templ_7745c5c3_Err != nil { | 2043 | if templ_7745c5c3_Err != nil { | ||
| 2025 | - | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 292, Col: 118} | 2044 | + | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 295, Col: 118} |
| 2026 | } | 2045 | } | ||
| 2027 | - | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var106) | 2046 | + | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var107) |
| 2028 | if templ_7745c5c3_Err != nil { | 2047 | if templ_7745c5c3_Err != nil { | ||
| 2029 | return templ_7745c5c3_Err | 2048 | return templ_7745c5c3_Err | ||
| 2030 | } | 2049 | } | ||
| 2031 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 170, "\" data-next=\"") | 2050 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 172, "\" data-next=\"") |
| 2032 | if templ_7745c5c3_Err != nil { | 2051 | if templ_7745c5c3_Err != nil { | ||
| 2033 | return templ_7745c5c3_Err | 2052 | return templ_7745c5c3_Err | ||
| 2034 | } | 2053 | } | ||
| 2035 | - | var templ_7745c5c3_Var107 string | 2054 | + | var templ_7745c5c3_Var108 string |
| 2036 | - | templ_7745c5c3_Var107, templ_7745c5c3_Err = templ.ResolveAttributeValue(itoa64(p.From + int64(len(p.Lines)))) | 2055 | + | templ_7745c5c3_Var108, templ_7745c5c3_Err = templ.ResolveAttributeValue(itoa64(p.From + int64(len(p.Lines)))) |
| 2037 | if templ_7745c5c3_Err != nil { | 2056 | if templ_7745c5c3_Err != nil { | ||
| 2038 | - | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 292, Col: 169} | 2057 | + | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 295, Col: 169} |
| 2039 | } | 2058 | } | ||
| 2040 | - | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var107) | 2059 | + | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var108) |
| 2041 | if templ_7745c5c3_Err != nil { | 2060 | if templ_7745c5c3_Err != nil { | ||
| 2042 | return templ_7745c5c3_Err | 2061 | return templ_7745c5c3_Err | ||
| 2043 | } | 2062 | } | ||
| 2044 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 171, "\">") | 2063 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 173, "\">") |
| 2045 | if templ_7745c5c3_Err != nil { | 2064 | if templ_7745c5c3_Err != nil { | ||
| 2046 | return templ_7745c5c3_Err | 2065 | return templ_7745c5c3_Err | ||
| 2047 | } | 2066 | } | ||
| 2048 | if p.Note != "" { | 2067 | if p.Note != "" { | ||
| 2049 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 172, "<p class=\"dim\">") | 2068 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 174, "<p class=\"dim\">") |
| 2050 | if templ_7745c5c3_Err != nil { | 2069 | if templ_7745c5c3_Err != nil { | ||
| 2051 | return templ_7745c5c3_Err | 2070 | return templ_7745c5c3_Err | ||
| 2052 | } | 2071 | } | ||
| 2053 | - | var templ_7745c5c3_Var108 string | 2072 | + | var templ_7745c5c3_Var109 string |
| 2054 | - | templ_7745c5c3_Var108, templ_7745c5c3_Err = templ.JoinStringErrs(p.Note) | 2073 | + | templ_7745c5c3_Var109, templ_7745c5c3_Err = templ.JoinStringErrs(p.Note) |
| 2055 | if templ_7745c5c3_Err != nil { | 2074 | if templ_7745c5c3_Err != nil { | ||
| 2056 | - | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 294, Col: 27} | 2075 | + | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 297, Col: 27} |
| 2057 | } | 2076 | } | ||
| 2058 | - | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var108)) | 2077 | + | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var109)) |
| 2059 | if templ_7745c5c3_Err != nil { | 2078 | if templ_7745c5c3_Err != nil { | ||
| 2060 | return templ_7745c5c3_Err | 2079 | return templ_7745c5c3_Err | ||
| 2061 | } | 2080 | } | ||
| 2062 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 173, "</p>") | 2081 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 175, "</p>") |
| 2063 | if templ_7745c5c3_Err != nil { | 2082 | if templ_7745c5c3_Err != nil { | ||
| 2064 | return templ_7745c5c3_Err | 2083 | return templ_7745c5c3_Err | ||
| 2065 | } | 2084 | } | ||
| 2066 | } | 2085 | } | ||
| 2067 | if p.Prev != "" { | 2086 | if p.Prev != "" { | ||
| 2068 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 174, "<p class=\"more\"><a href=\"") | 2087 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 176, "<p class=\"more\"><a href=\"") |
| 2069 | if templ_7745c5c3_Err != nil { | 2088 | if templ_7745c5c3_Err != nil { | ||
| 2070 | return templ_7745c5c3_Err | 2089 | return templ_7745c5c3_Err | ||
| 2071 | } | 2090 | } | ||
| 2072 | - | var templ_7745c5c3_Var109 templ.SafeURL | 2091 | + | var templ_7745c5c3_Var110 templ.SafeURL |
| 2073 | - | templ_7745c5c3_Var109, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.Prev)) | 2092 | + | templ_7745c5c3_Var110, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.Prev)) |
| 2074 | if templ_7745c5c3_Err != nil { | 2093 | if templ_7745c5c3_Err != nil { | ||
| 2075 | - | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 297, Col: 51} | 2094 | + | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 300, Col: 51} |
| 2076 | } | 2095 | } | ||
| 2077 | - | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var109)) | 2096 | + | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var110)) |
| 2078 | if templ_7745c5c3_Err != nil { | 2097 | if templ_7745c5c3_Err != nil { | ||
| 2079 | return templ_7745c5c3_Err | 2098 | return templ_7745c5c3_Err | ||
| 2080 | } | 2099 | } | ||
| 2081 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 175, "\" rel=\"prev\">earlier lines</a></p>") | 2100 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 177, "\" rel=\"prev\">earlier lines</a></p>") |
| 2082 | if templ_7745c5c3_Err != nil { | 2101 | if templ_7745c5c3_Err != nil { | ||
| 2083 | return templ_7745c5c3_Err | 2102 | return templ_7745c5c3_Err | ||
| 2084 | } | 2103 | } | ||
| 2085 | } | 2104 | } | ||
| 2086 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 176, "<ol class=\"log\" start=\"") | 2105 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 178, "<ol class=\"log\" start=\"") |
| 2087 | if templ_7745c5c3_Err != nil { | 2106 | if templ_7745c5c3_Err != nil { | ||
| 2088 | return templ_7745c5c3_Err | 2107 | return templ_7745c5c3_Err | ||
| 2089 | } | 2108 | } | ||
| 2090 | - | var templ_7745c5c3_Var110 string | 2109 | + | var templ_7745c5c3_Var111 string |
| 2091 | - | templ_7745c5c3_Var110, templ_7745c5c3_Err = templ.ResolveAttributeValue(itoa64(p.From + 1)) | 2110 | + | templ_7745c5c3_Var111, templ_7745c5c3_Err = templ.ResolveAttributeValue(itoa64(p.From + 1)) |
| 2092 | if templ_7745c5c3_Err != nil { | 2111 | if templ_7745c5c3_Err != nil { | ||
| 2093 | - | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 299, Col: 45} | 2112 | + | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 302, Col: 45} |
| 2094 | } | 2113 | } | ||
| 2095 | - | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var110) | 2114 | + | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var111) |
| 2096 | if templ_7745c5c3_Err != nil { | 2115 | if templ_7745c5c3_Err != nil { | ||
| 2097 | return templ_7745c5c3_Err | 2116 | return templ_7745c5c3_Err | ||
| 2098 | } | 2117 | } | ||
| 2099 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 177, "\">") | 2118 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 179, "\">") |
| 2100 | if templ_7745c5c3_Err != nil { | 2119 | if templ_7745c5c3_Err != nil { | ||
| 2101 | return templ_7745c5c3_Err | 2120 | return templ_7745c5c3_Err | ||
| 2102 | } | 2121 | } | ||
| @@ -2106,36 +2125,36 @@ func Job(l Layout, p JobPage) templ.Component { | |||||
| 2106 | return templ_7745c5c3_Err | 2125 | return templ_7745c5c3_Err | ||
| 2107 | } | 2126 | } | ||
| 2108 | } | 2127 | } | ||
| 2109 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 178, "</ol>") | 2128 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 180, "</ol>") |
| 2110 | if templ_7745c5c3_Err != nil { | 2129 | if templ_7745c5c3_Err != nil { | ||
| 2111 | return templ_7745c5c3_Err | 2130 | return templ_7745c5c3_Err | ||
| 2112 | } | 2131 | } | ||
| 2113 | if p.Next != "" { | 2132 | if p.Next != "" { | ||
| 2114 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 179, "<p class=\"more\"><a href=\"") | 2133 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 181, "<p class=\"more\"><a href=\"") |
| 2115 | if templ_7745c5c3_Err != nil { | 2134 | if templ_7745c5c3_Err != nil { | ||
| 2116 | return templ_7745c5c3_Err | 2135 | return templ_7745c5c3_Err | ||
| 2117 | } | 2136 | } | ||
| 2118 | - | var templ_7745c5c3_Var111 templ.SafeURL | 2137 | + | var templ_7745c5c3_Var112 templ.SafeURL |
| 2119 | - | templ_7745c5c3_Var111, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.Next)) | 2138 | + | templ_7745c5c3_Var112, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.Next)) |
| 2120 | if templ_7745c5c3_Err != nil { | 2139 | if templ_7745c5c3_Err != nil { | ||
| 2121 | - | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 305, Col: 51} | 2140 | + | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 308, Col: 51} |
| 2122 | } | 2141 | } | ||
| 2123 | - | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var111)) | 2142 | + | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var112)) |
| 2124 | if templ_7745c5c3_Err != nil { | 2143 | if templ_7745c5c3_Err != nil { | ||
| 2125 | return templ_7745c5c3_Err | 2144 | return templ_7745c5c3_Err | ||
| 2126 | } | 2145 | } | ||
| 2127 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 180, "\" rel=\"next\">more lines</a></p>") | 2146 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 182, "\" rel=\"next\">more lines</a></p>") |
| 2128 | if templ_7745c5c3_Err != nil { | 2147 | if templ_7745c5c3_Err != nil { | ||
| 2129 | return templ_7745c5c3_Err | 2148 | return templ_7745c5c3_Err | ||
| 2130 | } | 2149 | } | ||
| 2131 | } | 2150 | } | ||
| 2132 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 181, "</div>") | 2151 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 183, "</div>") |
| 2133 | if templ_7745c5c3_Err != nil { | 2152 | if templ_7745c5c3_Err != nil { | ||
| 2134 | return templ_7745c5c3_Err | 2153 | return templ_7745c5c3_Err | ||
| 2135 | } | 2154 | } | ||
| 2136 | return nil | 2155 | return nil | ||
| 2137 | }) | 2156 | }) | ||
| 2138 | - | templ_7745c5c3_Err = Shell(l, jobRail(p)).Render(templ.WithChildren(ctx, templ_7745c5c3_Var104), templ_7745c5c3_Buffer) | 2157 | + | templ_7745c5c3_Err = Shell(l, jobRail(p)).Render(templ.WithChildren(ctx, templ_7745c5c3_Var105), templ_7745c5c3_Buffer) |
| 2139 | if templ_7745c5c3_Err != nil { | 2158 | if templ_7745c5c3_Err != nil { | ||
| 2140 | return templ_7745c5c3_Err | 2159 | return templ_7745c5c3_Err | ||
| 2141 | } | 2160 | } | ||
| @@ -2161,92 +2180,92 @@ func LogLine(ln LogLineView) templ.Component { | |||||
| 2161 | }() | 2180 | }() | ||
| 2162 | } | 2181 | } | ||
| 2163 | ctx = templ.InitializeContext(ctx) | 2182 | ctx = templ.InitializeContext(ctx) | ||
| 2164 | - | templ_7745c5c3_Var112 := templ.GetChildren(ctx) | 2183 | + | templ_7745c5c3_Var113 := templ.GetChildren(ctx) |
| 2165 | - | if templ_7745c5c3_Var112 == nil { | 2184 | + | if templ_7745c5c3_Var113 == nil { |
| 2166 | - | templ_7745c5c3_Var112 = templ.NopComponent | 2185 | + | templ_7745c5c3_Var113 = templ.NopComponent |
| 2167 | } | 2186 | } | ||
| 2168 | ctx = templ.ClearChildren(ctx) | 2187 | ctx = templ.ClearChildren(ctx) | ||
| 2169 | - | var templ_7745c5c3_Var113 = []any{logClass(ln)} | 2188 | + | var templ_7745c5c3_Var114 = []any{logClass(ln)} |
| 2170 | - | templ_7745c5c3_Err = templ.RenderCSSItems(ctx, templ_7745c5c3_Buffer, templ_7745c5c3_Var113...) | 2189 | + | templ_7745c5c3_Err = templ.RenderCSSItems(ctx, templ_7745c5c3_Buffer, templ_7745c5c3_Var114...) |
| 2171 | if templ_7745c5c3_Err != nil { | 2190 | if templ_7745c5c3_Err != nil { | ||
| 2172 | return templ_7745c5c3_Err | 2191 | return templ_7745c5c3_Err | ||
| 2173 | } | 2192 | } | ||
| 2174 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 182, "<li id=\"") | 2193 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 184, "<li id=\"") |
| 2175 | if templ_7745c5c3_Err != nil { | 2194 | if templ_7745c5c3_Err != nil { | ||
| 2176 | return templ_7745c5c3_Err | 2195 | return templ_7745c5c3_Err | ||
| 2177 | } | 2196 | } | ||
| 2178 | - | var templ_7745c5c3_Var114 string | 2197 | + | var templ_7745c5c3_Var115 string |
| 2179 | - | templ_7745c5c3_Var114, templ_7745c5c3_Err = templ.ResolveAttributeValue("L" + itoa64(ln.N)) | 2198 | + | templ_7745c5c3_Var115, templ_7745c5c3_Err = templ.ResolveAttributeValue("L" + itoa64(ln.N)) |
| 2180 | if templ_7745c5c3_Err != nil { | 2199 | if templ_7745c5c3_Err != nil { | ||
| 2181 | - | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 314, Col: 28} | 2200 | + | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 317, Col: 28} |
| 2182 | } | 2201 | } | ||
| 2183 | - | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var114) | 2202 | + | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var115) |
| 2184 | if templ_7745c5c3_Err != nil { | 2203 | if templ_7745c5c3_Err != nil { | ||
| 2185 | return templ_7745c5c3_Err | 2204 | return templ_7745c5c3_Err | ||
| 2186 | } | 2205 | } | ||
| 2187 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 183, "\" class=\"") | 2206 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 185, "\" class=\"") |
| 2188 | if templ_7745c5c3_Err != nil { | 2207 | if templ_7745c5c3_Err != nil { | ||
| 2189 | return templ_7745c5c3_Err | 2208 | return templ_7745c5c3_Err | ||
| 2190 | } | 2209 | } | ||
| 2191 | - | var templ_7745c5c3_Var115 string | 2210 | + | var templ_7745c5c3_Var116 string |
| 2192 | - | templ_7745c5c3_Var115, templ_7745c5c3_Err = templ.ResolveAttributeValue(templ.CSSClasses(templ_7745c5c3_Var113).String()) | 2211 | + | templ_7745c5c3_Var116, templ_7745c5c3_Err = templ.ResolveAttributeValue(templ.CSSClasses(templ_7745c5c3_Var114).String()) |
| 2193 | if templ_7745c5c3_Err != nil { | 2212 | if templ_7745c5c3_Err != nil { | ||
| 2194 | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 1, Col: 0} | 2213 | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 1, Col: 0} | ||
| 2195 | } | 2214 | } | ||
| 2196 | - | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var115) | 2215 | + | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var116) |
| 2197 | if templ_7745c5c3_Err != nil { | 2216 | if templ_7745c5c3_Err != nil { | ||
| 2198 | return templ_7745c5c3_Err | 2217 | return templ_7745c5c3_Err | ||
| 2199 | } | 2218 | } | ||
| 2200 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 184, "\" data-step=\"") | 2219 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 186, "\" data-step=\"") |
| 2201 | if templ_7745c5c3_Err != nil { | 2220 | if templ_7745c5c3_Err != nil { | ||
| 2202 | return templ_7745c5c3_Err | 2221 | return templ_7745c5c3_Err | ||
| 2203 | } | 2222 | } | ||
| 2204 | - | var templ_7745c5c3_Var116 string | 2223 | + | var templ_7745c5c3_Var117 string |
| 2205 | - | templ_7745c5c3_Var116, templ_7745c5c3_Err = templ.ResolveAttributeValue(itoa(int(ln.Step))) | 2224 | + | templ_7745c5c3_Var117, templ_7745c5c3_Err = templ.ResolveAttributeValue(itoa(int(ln.Step))) |
| 2206 | if templ_7745c5c3_Err != nil { | 2225 | if templ_7745c5c3_Err != nil { | ||
| 2207 | - | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 314, Col: 84} | 2226 | + | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 317, Col: 84} |
| 2208 | } | 2227 | } | ||
| 2209 | - | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var116) | 2228 | + | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var117) |
| 2210 | if templ_7745c5c3_Err != nil { | 2229 | if templ_7745c5c3_Err != nil { | ||
| 2211 | return templ_7745c5c3_Err | 2230 | return templ_7745c5c3_Err | ||
| 2212 | } | 2231 | } | ||
| 2213 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 185, "\"") | 2232 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 187, "\"") |
| 2214 | if templ_7745c5c3_Err != nil { | 2233 | if templ_7745c5c3_Err != nil { | ||
| 2215 | return templ_7745c5c3_Err | 2234 | return templ_7745c5c3_Err | ||
| 2216 | } | 2235 | } | ||
| 2217 | if ln.Continued { | 2236 | if ln.Continued { | ||
| 2218 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 186, " data-cont") | 2237 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 188, " data-cont") |
| 2219 | if templ_7745c5c3_Err != nil { | 2238 | if templ_7745c5c3_Err != nil { | ||
| 2220 | return templ_7745c5c3_Err | 2239 | return templ_7745c5c3_Err | ||
| 2221 | } | 2240 | } | ||
| 2222 | } | 2241 | } | ||
| 2223 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 187, "><time>") | 2242 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 189, "><time>") |
| 2224 | if templ_7745c5c3_Err != nil { | 2243 | if templ_7745c5c3_Err != nil { | ||
| 2225 | return templ_7745c5c3_Err | 2244 | return templ_7745c5c3_Err | ||
| 2226 | } | 2245 | } | ||
| 2227 | - | var templ_7745c5c3_Var117 string | 2246 | + | var templ_7745c5c3_Var118 string |
| 2228 | - | templ_7745c5c3_Var117, templ_7745c5c3_Err = templ.JoinStringErrs(ln.Time) | 2247 | + | templ_7745c5c3_Var118, templ_7745c5c3_Err = templ.JoinStringErrs(ln.Time) |
| 2229 | if templ_7745c5c3_Err != nil { | 2248 | if templ_7745c5c3_Err != nil { | ||
| 2230 | - | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 314, Col: 130} | 2249 | + | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 317, Col: 130} |
| 2231 | } | 2250 | } | ||
| 2232 | - | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var117)) | 2251 | + | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var118)) |
| 2233 | if templ_7745c5c3_Err != nil { | 2252 | if templ_7745c5c3_Err != nil { | ||
| 2234 | return templ_7745c5c3_Err | 2253 | return templ_7745c5c3_Err | ||
| 2235 | } | 2254 | } | ||
| 2236 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 188, "</time><span class=\"t\">") | 2255 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 190, "</time><span class=\"t\">") |
| 2237 | if templ_7745c5c3_Err != nil { | 2256 | if templ_7745c5c3_Err != nil { | ||
| 2238 | return templ_7745c5c3_Err | 2257 | return templ_7745c5c3_Err | ||
| 2239 | } | 2258 | } | ||
| 2240 | - | var templ_7745c5c3_Var118 string | 2259 | + | var templ_7745c5c3_Var119 string |
| 2241 | - | templ_7745c5c3_Var118, templ_7745c5c3_Err = templ.JoinStringErrs(ln.Text) | 2260 | + | templ_7745c5c3_Var119, templ_7745c5c3_Err = templ.JoinStringErrs(ln.Text) |
| 2242 | if templ_7745c5c3_Err != nil { | 2261 | if templ_7745c5c3_Err != nil { | ||
| 2243 | - | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 314, Col: 164} | 2262 | + | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 317, Col: 164} |
| 2244 | } | 2263 | } | ||
| 2245 | - | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var118)) | 2264 | + | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var119)) |
| 2246 | if templ_7745c5c3_Err != nil { | 2265 | if templ_7745c5c3_Err != nil { | ||
| 2247 | return templ_7745c5c3_Err | 2266 | return templ_7745c5c3_Err | ||
| 2248 | } | 2267 | } | ||
| 2249 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 189, "</span></li>") | 2268 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 191, "</span></li>") |
| 2250 | if templ_7745c5c3_Err != nil { | 2269 | if templ_7745c5c3_Err != nil { | ||
| 2251 | return templ_7745c5c3_Err | 2270 | return templ_7745c5c3_Err | ||
| 2252 | } | 2271 | } | ||
| @@ -2270,12 +2289,12 @@ func jobRail(p JobPage) templ.Component { | |||||
| 2270 | }() | 2289 | }() | ||
| 2271 | } | 2290 | } | ||
| 2272 | ctx = templ.InitializeContext(ctx) | 2291 | ctx = templ.InitializeContext(ctx) | ||
| 2273 | - | templ_7745c5c3_Var119 := templ.GetChildren(ctx) | 2292 | + | templ_7745c5c3_Var120 := templ.GetChildren(ctx) |
| 2274 | - | if templ_7745c5c3_Var119 == nil { | 2293 | + | if templ_7745c5c3_Var120 == nil { |
| 2275 | - | templ_7745c5c3_Var119 = templ.NopComponent | 2294 | + | templ_7745c5c3_Var120 = templ.NopComponent |
| 2276 | } | 2295 | } | ||
| 2277 | ctx = templ.ClearChildren(ctx) | 2296 | ctx = templ.ClearChildren(ctx) | ||
| 2278 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 190, "<section aria-labelledby=\"r-job\"><h2 id=\"r-job\">Steps</h2>") | 2297 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 192, "<section aria-labelledby=\"r-job\"><h2 id=\"r-job\">Steps</h2>") |
| 2279 | if templ_7745c5c3_Err != nil { | 2298 | if templ_7745c5c3_Err != nil { | ||
| 2280 | return templ_7745c5c3_Err | 2299 | return templ_7745c5c3_Err | ||
| 2281 | } | 2300 | } | ||
| @@ -2283,101 +2302,101 @@ func jobRail(p JobPage) templ.Component { | |||||
| 2283 | if templ_7745c5c3_Err != nil { | 2302 | if templ_7745c5c3_Err != nil { | ||
| 2284 | return templ_7745c5c3_Err | 2303 | return templ_7745c5c3_Err | ||
| 2285 | } | 2304 | } | ||
| 2286 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 191, "</section><section aria-labelledby=\"r-jobf\"><h2 id=\"r-jobf\">Job</h2><dl class=\"kv\"><dt>run</dt><dd><a href=\"") | 2305 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 193, "</section><section aria-labelledby=\"r-jobf\"><h2 id=\"r-jobf\">Job</h2><dl class=\"kv\"><dt>run</dt><dd><a href=\"") |
| 2287 | if templ_7745c5c3_Err != nil { | 2306 | if templ_7745c5c3_Err != nil { | ||
| 2288 | return templ_7745c5c3_Err | 2307 | return templ_7745c5c3_Err | ||
| 2289 | } | 2308 | } | ||
| 2290 | - | var templ_7745c5c3_Var120 templ.SafeURL | 2309 | + | var templ_7745c5c3_Var121 templ.SafeURL |
| 2291 | - | templ_7745c5c3_Var120, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.RunHref)) | 2310 | + | templ_7745c5c3_Var121, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.RunHref)) |
| 2292 | if templ_7745c5c3_Err != nil { | 2311 | if templ_7745c5c3_Err != nil { | ||
| 2293 | - | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 326, Col: 41} | 2312 | + | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 329, Col: 41} |
| 2294 | } | 2313 | } | ||
| 2295 | - | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var120)) | 2314 | + | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var121)) |
| 2296 | if templ_7745c5c3_Err != nil { | 2315 | if templ_7745c5c3_Err != nil { | ||
| 2297 | return templ_7745c5c3_Err | 2316 | return templ_7745c5c3_Err | ||
| 2298 | } | 2317 | } | ||
| 2299 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 192, "\">") | 2318 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 194, "\">") |
| 2300 | if templ_7745c5c3_Err != nil { | 2319 | if templ_7745c5c3_Err != nil { | ||
| 2301 | return templ_7745c5c3_Err | 2320 | return templ_7745c5c3_Err | ||
| 2302 | } | 2321 | } | ||
| 2303 | - | var templ_7745c5c3_Var121 string | 2322 | + | var templ_7745c5c3_Var122 string |
| 2304 | - | templ_7745c5c3_Var121, templ_7745c5c3_Err = templ.JoinStringErrs(p.RunName) | 2323 | + | templ_7745c5c3_Var122, templ_7745c5c3_Err = templ.JoinStringErrs(p.RunName) |
| 2305 | if templ_7745c5c3_Err != nil { | 2324 | if templ_7745c5c3_Err != nil { | ||
| 2306 | - | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 326, Col: 55} | 2325 | + | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 329, Col: 55} |
| 2307 | } | 2326 | } | ||
| 2308 | - | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var121)) | 2327 | + | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var122)) |
| 2309 | if templ_7745c5c3_Err != nil { | 2328 | if templ_7745c5c3_Err != nil { | ||
| 2310 | return templ_7745c5c3_Err | 2329 | return templ_7745c5c3_Err | ||
| 2311 | } | 2330 | } | ||
| 2312 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 193, "</a></dd>") | 2331 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 195, "</a></dd>") |
| 2313 | if templ_7745c5c3_Err != nil { | 2332 | if templ_7745c5c3_Err != nil { | ||
| 2314 | return templ_7745c5c3_Err | 2333 | return templ_7745c5c3_Err | ||
| 2315 | } | 2334 | } | ||
| 2316 | if p.Runner != "" { | 2335 | if p.Runner != "" { | ||
| 2317 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 194, "<dt>runner</dt><dd>") | 2336 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 196, "<dt>runner</dt><dd>") |
| 2318 | if templ_7745c5c3_Err != nil { | 2337 | if templ_7745c5c3_Err != nil { | ||
| 2319 | return templ_7745c5c3_Err | 2338 | return templ_7745c5c3_Err | ||
| 2320 | } | 2339 | } | ||
| 2321 | - | var templ_7745c5c3_Var122 string | 2340 | + | var templ_7745c5c3_Var123 string |
| 2322 | - | templ_7745c5c3_Var122, templ_7745c5c3_Err = templ.JoinStringErrs(p.Runner) | 2341 | + | templ_7745c5c3_Var123, templ_7745c5c3_Err = templ.JoinStringErrs(p.Runner) |
| 2323 | if templ_7745c5c3_Err != nil { | 2342 | if templ_7745c5c3_Err != nil { | ||
| 2324 | - | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 329, Col: 18} | 2343 | + | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 332, Col: 18} |
| 2325 | } | 2344 | } | ||
| 2326 | - | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var122)) | 2345 | + | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var123)) |
| 2327 | if templ_7745c5c3_Err != nil { | 2346 | if templ_7745c5c3_Err != nil { | ||
| 2328 | return templ_7745c5c3_Err | 2347 | return templ_7745c5c3_Err | ||
| 2329 | } | 2348 | } | ||
| 2330 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 195, "</dd>") | 2349 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 197, "</dd>") |
| 2331 | if templ_7745c5c3_Err != nil { | 2350 | if templ_7745c5c3_Err != nil { | ||
| 2332 | return templ_7745c5c3_Err | 2351 | return templ_7745c5c3_Err | ||
| 2333 | } | 2352 | } | ||
| 2334 | } | 2353 | } | ||
| 2335 | if p.Isolation != "" { | 2354 | if p.Isolation != "" { | ||
| 2336 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 196, "<dt>isolation</dt><dd>") | 2355 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 198, "<dt>isolation</dt><dd>") |
| 2337 | if templ_7745c5c3_Err != nil { | 2356 | if templ_7745c5c3_Err != nil { | ||
| 2338 | return templ_7745c5c3_Err | 2357 | return templ_7745c5c3_Err | ||
| 2339 | } | 2358 | } | ||
| 2340 | - | var templ_7745c5c3_Var123 string | 2359 | + | var templ_7745c5c3_Var124 string |
| 2341 | - | templ_7745c5c3_Var123, templ_7745c5c3_Err = templ.JoinStringErrs(p.Isolation) | 2360 | + | templ_7745c5c3_Var124, templ_7745c5c3_Err = templ.JoinStringErrs(p.Isolation) |
| 2342 | if templ_7745c5c3_Err != nil { | 2361 | if templ_7745c5c3_Err != nil { | ||
| 2343 | - | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 333, Col: 21} | 2362 | + | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 336, Col: 21} |
| 2344 | } | 2363 | } | ||
| 2345 | - | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var123)) | 2364 | + | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var124)) |
| 2346 | if templ_7745c5c3_Err != nil { | 2365 | if templ_7745c5c3_Err != nil { | ||
| 2347 | return templ_7745c5c3_Err | 2366 | return templ_7745c5c3_Err | ||
| 2348 | } | 2367 | } | ||
| 2349 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 197, "</dd>") | 2368 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 199, "</dd>") |
| 2350 | if templ_7745c5c3_Err != nil { | 2369 | if templ_7745c5c3_Err != nil { | ||
| 2351 | return templ_7745c5c3_Err | 2370 | return templ_7745c5c3_Err | ||
| 2352 | } | 2371 | } | ||
| 2353 | } | 2372 | } | ||
| 2354 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 198, "<dt>lines</dt><dd>") | 2373 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 200, "<dt>lines</dt><dd>") |
| 2355 | if templ_7745c5c3_Err != nil { | 2374 | if templ_7745c5c3_Err != nil { | ||
| 2356 | return templ_7745c5c3_Err | 2375 | return templ_7745c5c3_Err | ||
| 2357 | } | 2376 | } | ||
| 2358 | - | var templ_7745c5c3_Var124 string | 2377 | + | var templ_7745c5c3_Var125 string |
| 2359 | - | templ_7745c5c3_Var124, templ_7745c5c3_Err = templ.JoinStringErrs(itoa64(p.Total)) | 2378 | + | templ_7745c5c3_Var125, templ_7745c5c3_Err = templ.JoinStringErrs(itoa64(p.Total)) |
| 2360 | if templ_7745c5c3_Err != nil { | 2379 | if templ_7745c5c3_Err != nil { | ||
| 2361 | - | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 336, Col: 24} | 2380 | + | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 339, Col: 24} |
| 2362 | } | 2381 | } | ||
| 2363 | - | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var124)) | 2382 | + | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var125)) |
| 2364 | if templ_7745c5c3_Err != nil { | 2383 | if templ_7745c5c3_Err != nil { | ||
| 2365 | return templ_7745c5c3_Err | 2384 | return templ_7745c5c3_Err | ||
| 2366 | } | 2385 | } | ||
| 2367 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 199, "</dd></dl><p><a href=\"") | 2386 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 201, "</dd></dl><p><a href=\"") |
| 2368 | if templ_7745c5c3_Err != nil { | 2387 | if templ_7745c5c3_Err != nil { | ||
| 2369 | return templ_7745c5c3_Err | 2388 | return templ_7745c5c3_Err | ||
| 2370 | } | 2389 | } | ||
| 2371 | - | var templ_7745c5c3_Var125 templ.SafeURL | 2390 | + | var templ_7745c5c3_Var126 templ.SafeURL |
| 2372 | - | templ_7745c5c3_Var125, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.RawHref)) | 2391 | + | templ_7745c5c3_Var126, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.RawHref)) |
| 2373 | if templ_7745c5c3_Err != nil { | 2392 | if templ_7745c5c3_Err != nil { | ||
| 2374 | - | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 338, Col: 39} | 2393 | + | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 341, Col: 39} |
| 2375 | } | 2394 | } | ||
| 2376 | - | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var125)) | 2395 | + | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var126)) |
| 2377 | if templ_7745c5c3_Err != nil { | 2396 | if templ_7745c5c3_Err != nil { | ||
| 2378 | return templ_7745c5c3_Err | 2397 | return templ_7745c5c3_Err | ||
| 2379 | } | 2398 | } | ||
| 2380 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 200, "\">raw log</a></p></section>") | 2399 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 202, "\">raw log</a></p></section>") |
| 2381 | if templ_7745c5c3_Err != nil { | 2400 | if templ_7745c5c3_Err != nil { | ||
| 2382 | return templ_7745c5c3_Err | 2401 | return templ_7745c5c3_Err | ||
| 2383 | } | 2402 | } | ||
| @@ -2403,39 +2422,39 @@ func CommitChecks(c ChecksSummary) templ.Component { | |||||
| 2403 | }() | 2422 | }() | ||
| 2404 | } | 2423 | } | ||
| 2405 | ctx = templ.InitializeContext(ctx) | 2424 | ctx = templ.InitializeContext(ctx) | ||
| 2406 | - | templ_7745c5c3_Var126 := templ.GetChildren(ctx) | 2425 | + | templ_7745c5c3_Var127 := templ.GetChildren(ctx) |
| 2407 | - | if templ_7745c5c3_Var126 == nil { | 2426 | + | if templ_7745c5c3_Var127 == nil { |
| 2408 | - | templ_7745c5c3_Var126 = templ.NopComponent | 2427 | + | templ_7745c5c3_Var127 = templ.NopComponent |
| 2409 | } | 2428 | } | ||
| 2410 | ctx = templ.ClearChildren(ctx) | 2429 | ctx = templ.ClearChildren(ctx) | ||
| 2411 | if c.Total > 0 { | 2430 | if c.Total > 0 { | ||
| 2412 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 201, "<a class=\"ck-sum\" href=\"") | 2431 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 203, "<a class=\"ck-sum\" href=\"") |
| 2413 | if templ_7745c5c3_Err != nil { | 2432 | if templ_7745c5c3_Err != nil { | ||
| 2414 | return templ_7745c5c3_Err | 2433 | return templ_7745c5c3_Err | ||
| 2415 | } | 2434 | } | ||
| 2416 | - | var templ_7745c5c3_Var127 templ.SafeURL | 2435 | + | var templ_7745c5c3_Var128 templ.SafeURL |
| 2417 | - | templ_7745c5c3_Var127, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(c.Href)) | 2436 | + | templ_7745c5c3_Var128, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(c.Href)) |
| 2418 | if templ_7745c5c3_Err != nil { | 2437 | if templ_7745c5c3_Err != nil { | ||
| 2419 | - | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 346, Col: 48} | 2438 | + | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 349, Col: 48} |
| 2420 | } | 2439 | } | ||
| 2421 | - | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var127)) | 2440 | + | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var128)) |
| 2422 | if templ_7745c5c3_Err != nil { | 2441 | if templ_7745c5c3_Err != nil { | ||
| 2423 | return templ_7745c5c3_Err | 2442 | return templ_7745c5c3_Err | ||
| 2424 | } | 2443 | } | ||
| 2425 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 202, "\" title=\"") | 2444 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 204, "\" title=\"") |
| 2426 | if templ_7745c5c3_Err != nil { | 2445 | if templ_7745c5c3_Err != nil { | ||
| 2427 | return templ_7745c5c3_Err | 2446 | return templ_7745c5c3_Err | ||
| 2428 | } | 2447 | } | ||
| 2429 | - | var templ_7745c5c3_Var128 string | 2448 | + | var templ_7745c5c3_Var129 string |
| 2430 | - | templ_7745c5c3_Var128, templ_7745c5c3_Err = templ.ResolveAttributeValue(c.Title) | 2449 | + | templ_7745c5c3_Var129, templ_7745c5c3_Err = templ.ResolveAttributeValue(c.Title) |
| 2431 | if templ_7745c5c3_Err != nil { | 2450 | if templ_7745c5c3_Err != nil { | ||
| 2432 | - | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 346, Col: 66} | 2451 | + | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 349, Col: 66} |
| 2433 | } | 2452 | } | ||
| 2434 | - | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var128) | 2453 | + | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var129) |
| 2435 | if templ_7745c5c3_Err != nil { | 2454 | if templ_7745c5c3_Err != nil { | ||
| 2436 | return templ_7745c5c3_Err | 2455 | return templ_7745c5c3_Err | ||
| 2437 | } | 2456 | } | ||
| 2438 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 203, "\">") | 2457 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 205, "\">") |
| 2439 | if templ_7745c5c3_Err != nil { | 2458 | if templ_7745c5c3_Err != nil { | ||
| 2440 | return templ_7745c5c3_Err | 2459 | return templ_7745c5c3_Err | ||
| 2441 | } | 2460 | } | ||
| @@ -2443,20 +2462,20 @@ func CommitChecks(c ChecksSummary) templ.Component { | |||||
| 2443 | if templ_7745c5c3_Err != nil { | 2462 | if templ_7745c5c3_Err != nil { | ||
| 2444 | return templ_7745c5c3_Err | 2463 | return templ_7745c5c3_Err | ||
| 2445 | } | 2464 | } | ||
| 2446 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 204, "<span class=\"mute\">") | 2465 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 206, "<span class=\"mute\">") |
| 2447 | if templ_7745c5c3_Err != nil { | 2466 | if templ_7745c5c3_Err != nil { | ||
| 2448 | return templ_7745c5c3_Err | 2467 | return templ_7745c5c3_Err | ||
| 2449 | } | 2468 | } | ||
| 2450 | - | var templ_7745c5c3_Var129 string | 2469 | + | var templ_7745c5c3_Var130 string |
| 2451 | - | templ_7745c5c3_Var129, templ_7745c5c3_Err = templ.JoinStringErrs(c.Label) | 2470 | + | templ_7745c5c3_Var130, templ_7745c5c3_Err = templ.JoinStringErrs(c.Label) |
| 2452 | if templ_7745c5c3_Err != nil { | 2471 | if templ_7745c5c3_Err != nil { | ||
| 2453 | - | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 348, Col: 31} | 2472 | + | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 351, Col: 31} |
| 2454 | } | 2473 | } | ||
| 2455 | - | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var129)) | 2474 | + | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var130)) |
| 2456 | if templ_7745c5c3_Err != nil { | 2475 | if templ_7745c5c3_Err != nil { | ||
| 2457 | return templ_7745c5c3_Err | 2476 | return templ_7745c5c3_Err | ||
| 2458 | } | 2477 | } | ||
| 2459 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 205, "</span></a>") | 2478 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 207, "</span></a>") |
| 2460 | if templ_7745c5c3_Err != nil { | 2479 | if templ_7745c5c3_Err != nil { | ||
| 2461 | return templ_7745c5c3_Err | 2480 | return templ_7745c5c3_Err | ||
| 2462 | } | 2481 | } | ||
| @@ -2482,40 +2501,40 @@ func MRChecks(c ChecksSection) templ.Component { | |||||
| 2482 | }() | 2501 | }() | ||
| 2483 | } | 2502 | } | ||
| 2484 | ctx = templ.InitializeContext(ctx) | 2503 | ctx = templ.InitializeContext(ctx) | ||
| 2485 | - | templ_7745c5c3_Var130 := templ.GetChildren(ctx) | 2504 | + | templ_7745c5c3_Var131 := templ.GetChildren(ctx) |
| 2486 | - | if templ_7745c5c3_Var130 == nil { | 2505 | + | if templ_7745c5c3_Var131 == nil { |
| 2487 | - | templ_7745c5c3_Var130 = templ.NopComponent | 2506 | + | templ_7745c5c3_Var131 = templ.NopComponent |
| 2488 | } | 2507 | } | ||
| 2489 | ctx = templ.ClearChildren(ctx) | 2508 | ctx = templ.ClearChildren(ctx) | ||
| 2490 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 206, "<section aria-labelledby=\"r-checks\" id=\"mr-checks\"><h2 id=\"r-checks\">Checks <span class=\"count\">") | 2509 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 208, "<section aria-labelledby=\"r-checks\" id=\"mr-checks\"><h2 id=\"r-checks\">Checks <span class=\"count\">") |
| 2491 | if templ_7745c5c3_Err != nil { | 2510 | if templ_7745c5c3_Err != nil { | ||
| 2492 | return templ_7745c5c3_Err | 2511 | return templ_7745c5c3_Err | ||
| 2493 | } | 2512 | } | ||
| 2494 | - | var templ_7745c5c3_Var131 string | 2513 | + | var templ_7745c5c3_Var132 string |
| 2495 | - | templ_7745c5c3_Var131, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(len(c.Rows))) | 2514 | + | templ_7745c5c3_Var132, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(len(c.Rows))) |
| 2496 | if templ_7745c5c3_Err != nil { | 2515 | if templ_7745c5c3_Err != nil { | ||
| 2497 | - | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 356, Col: 66} | 2516 | + | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 359, Col: 66} |
| 2498 | } | 2517 | } | ||
| 2499 | - | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var131)) | 2518 | + | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var132)) |
| 2500 | if templ_7745c5c3_Err != nil { | 2519 | if templ_7745c5c3_Err != nil { | ||
| 2501 | return templ_7745c5c3_Err | 2520 | return templ_7745c5c3_Err | ||
| 2502 | } | 2521 | } | ||
| 2503 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 207, "</span></h2>") | 2522 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 209, "</span></h2>") |
| 2504 | if templ_7745c5c3_Err != nil { | 2523 | if templ_7745c5c3_Err != nil { | ||
| 2505 | return templ_7745c5c3_Err | 2524 | return templ_7745c5c3_Err | ||
| 2506 | } | 2525 | } | ||
| 2507 | if len(c.Rows) == 0 { | 2526 | if len(c.Rows) == 0 { | ||
| 2508 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 208, "<p class=\"dim\">no checks</p>") | 2527 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 210, "<p class=\"dim\">no checks</p>") |
| 2509 | if templ_7745c5c3_Err != nil { | 2528 | if templ_7745c5c3_Err != nil { | ||
| 2510 | return templ_7745c5c3_Err | 2529 | return templ_7745c5c3_Err | ||
| 2511 | } | 2530 | } | ||
| 2512 | } else { | 2531 | } else { | ||
| 2513 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 209, "<ul class=\"checks\">") | 2532 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 211, "<ul class=\"checks\">") |
| 2514 | if templ_7745c5c3_Err != nil { | 2533 | if templ_7745c5c3_Err != nil { | ||
| 2515 | return templ_7745c5c3_Err | 2534 | return templ_7745c5c3_Err | ||
| 2516 | } | 2535 | } | ||
| 2517 | for _, r := range c.Rows { | 2536 | for _, r := range c.Rows { | ||
| 2518 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 210, "<li>") | 2537 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 212, "<li>") |
| 2519 | if templ_7745c5c3_Err != nil { | 2538 | if templ_7745c5c3_Err != nil { | ||
| 2520 | return templ_7745c5c3_Err | 2539 | return templ_7745c5c3_Err | ||
| 2521 | } | 2540 | } | ||
| @@ -2524,108 +2543,108 @@ func MRChecks(c ChecksSection) templ.Component { | |||||
| 2524 | return templ_7745c5c3_Err | 2543 | return templ_7745c5c3_Err | ||
| 2525 | } | 2544 | } | ||
| 2526 | if r.Href != "" { | 2545 | if r.Href != "" { | ||
| 2527 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 211, "<a href=\"") | 2546 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 213, "<a href=\"") |
| 2528 | if templ_7745c5c3_Err != nil { | 2547 | if templ_7745c5c3_Err != nil { | ||
| 2529 | return templ_7745c5c3_Err | 2548 | return templ_7745c5c3_Err | ||
| 2530 | } | 2549 | } | ||
| 2531 | - | var templ_7745c5c3_Var132 templ.SafeURL | 2550 | + | var templ_7745c5c3_Var133 templ.SafeURL |
| 2532 | - | templ_7745c5c3_Var132, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(r.Href)) | 2551 | + | templ_7745c5c3_Var133, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(r.Href)) |
| 2533 | if templ_7745c5c3_Err != nil { | 2552 | if templ_7745c5c3_Err != nil { | ||
| 2534 | - | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 365, Col: 38} | 2553 | + | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 368, Col: 38} |
| 2535 | } | 2554 | } | ||
| 2536 | - | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var132)) | 2555 | + | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var133)) |
| 2537 | if templ_7745c5c3_Err != nil { | 2556 | if templ_7745c5c3_Err != nil { | ||
| 2538 | return templ_7745c5c3_Err | 2557 | return templ_7745c5c3_Err | ||
| 2539 | } | 2558 | } | ||
| 2540 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 212, "\">") | 2559 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 214, "\">") |
| 2541 | if templ_7745c5c3_Err != nil { | 2560 | if templ_7745c5c3_Err != nil { | ||
| 2542 | return templ_7745c5c3_Err | 2561 | return templ_7745c5c3_Err | ||
| 2543 | } | 2562 | } | ||
| 2544 | - | var templ_7745c5c3_Var133 string | 2563 | + | var templ_7745c5c3_Var134 string |
| 2545 | - | templ_7745c5c3_Var133, templ_7745c5c3_Err = templ.JoinStringErrs(r.Name) | 2564 | + | templ_7745c5c3_Var134, templ_7745c5c3_Err = templ.JoinStringErrs(r.Name) |
| 2546 | if templ_7745c5c3_Err != nil { | 2565 | if templ_7745c5c3_Err != nil { | ||
| 2547 | - | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 365, Col: 49} | 2566 | + | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 368, Col: 49} |
| 2548 | } | 2567 | } | ||
| 2549 | - | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var133)) | 2568 | + | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var134)) |
| 2550 | if templ_7745c5c3_Err != nil { | 2569 | if templ_7745c5c3_Err != nil { | ||
| 2551 | return templ_7745c5c3_Err | 2570 | return templ_7745c5c3_Err | ||
| 2552 | } | 2571 | } | ||
| 2553 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 213, "</a> ") | 2572 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 215, "</a> ") |
| 2554 | if templ_7745c5c3_Err != nil { | 2573 | if templ_7745c5c3_Err != nil { | ||
| 2555 | return templ_7745c5c3_Err | 2574 | return templ_7745c5c3_Err | ||
| 2556 | } | 2575 | } | ||
| 2557 | } else { | 2576 | } else { | ||
| 2558 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 214, "<span>") | 2577 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 216, "<span>") |
| 2559 | if templ_7745c5c3_Err != nil { | 2578 | if templ_7745c5c3_Err != nil { | ||
| 2560 | return templ_7745c5c3_Err | 2579 | return templ_7745c5c3_Err | ||
| 2561 | } | 2580 | } | ||
| 2562 | - | var templ_7745c5c3_Var134 string | 2581 | + | var templ_7745c5c3_Var135 string |
| 2563 | - | templ_7745c5c3_Var134, templ_7745c5c3_Err = templ.JoinStringErrs(r.Name) | 2582 | + | templ_7745c5c3_Var135, templ_7745c5c3_Err = templ.JoinStringErrs(r.Name) |
| 2564 | if templ_7745c5c3_Err != nil { | 2583 | if templ_7745c5c3_Err != nil { | ||
| 2565 | - | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 367, Col: 21} | 2584 | + | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 370, Col: 21} |
| 2566 | } | 2585 | } | ||
| 2567 | - | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var134)) | 2586 | + | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var135)) |
| 2568 | if templ_7745c5c3_Err != nil { | 2587 | if templ_7745c5c3_Err != nil { | ||
| 2569 | return templ_7745c5c3_Err | 2588 | return templ_7745c5c3_Err | ||
| 2570 | } | 2589 | } | ||
| 2571 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 215, "</span> ") | 2590 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 217, "</span> ") |
| 2572 | if templ_7745c5c3_Err != nil { | 2591 | if templ_7745c5c3_Err != nil { | ||
| 2573 | return templ_7745c5c3_Err | 2592 | return templ_7745c5c3_Err | ||
| 2574 | } | 2593 | } | ||
| 2575 | } | 2594 | } | ||
| 2576 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 216, "<span class=\"dim\">") | 2595 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 218, "<span class=\"dim\">") |
| 2577 | if templ_7745c5c3_Err != nil { | 2596 | if templ_7745c5c3_Err != nil { | ||
| 2578 | return templ_7745c5c3_Err | 2597 | return templ_7745c5c3_Err | ||
| 2579 | } | 2598 | } | ||
| 2580 | - | var templ_7745c5c3_Var135 string | 2599 | + | var templ_7745c5c3_Var136 string |
| 2581 | - | templ_7745c5c3_Var135, templ_7745c5c3_Err = templ.JoinStringErrs(r.State) | 2600 | + | templ_7745c5c3_Var136, templ_7745c5c3_Err = templ.JoinStringErrs(r.State) |
| 2582 | if templ_7745c5c3_Err != nil { | 2601 | if templ_7745c5c3_Err != nil { | ||
| 2583 | - | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 369, Col: 33} | 2602 | + | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 372, Col: 33} |
| 2584 | } | 2603 | } | ||
| 2585 | - | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var135)) | 2604 | + | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var136)) |
| 2586 | if templ_7745c5c3_Err != nil { | 2605 | if templ_7745c5c3_Err != nil { | ||
| 2587 | return templ_7745c5c3_Err | 2606 | return templ_7745c5c3_Err | ||
| 2588 | } | 2607 | } | ||
| 2589 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 217, "</span> ") | 2608 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 219, "</span> ") |
| 2590 | if templ_7745c5c3_Err != nil { | 2609 | if templ_7745c5c3_Err != nil { | ||
| 2591 | return templ_7745c5c3_Err | 2610 | return templ_7745c5c3_Err | ||
| 2592 | } | 2611 | } | ||
| 2593 | if r.Waiting { | 2612 | if r.Waiting { | ||
| 2594 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 218, "<span class=\"mute\">waiting for a runner</span>") | 2613 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 220, "<span class=\"mute\">waiting for a runner</span>") |
| 2595 | if templ_7745c5c3_Err != nil { | 2614 | if templ_7745c5c3_Err != nil { | ||
| 2596 | return templ_7745c5c3_Err | 2615 | return templ_7745c5c3_Err | ||
| 2597 | } | 2616 | } | ||
| 2598 | } | 2617 | } | ||
| 2599 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 219, "</li>") | 2618 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 221, "</li>") |
| 2600 | if templ_7745c5c3_Err != nil { | 2619 | if templ_7745c5c3_Err != nil { | ||
| 2601 | return templ_7745c5c3_Err | 2620 | return templ_7745c5c3_Err | ||
| 2602 | } | 2621 | } | ||
| 2603 | } | 2622 | } | ||
| 2604 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 220, "</ul>") | 2623 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 222, "</ul>") |
| 2605 | if templ_7745c5c3_Err != nil { | 2624 | if templ_7745c5c3_Err != nil { | ||
| 2606 | return templ_7745c5c3_Err | 2625 | return templ_7745c5c3_Err | ||
| 2607 | } | 2626 | } | ||
| 2608 | } | 2627 | } | ||
| 2609 | if c.Note != "" { | 2628 | if c.Note != "" { | ||
| 2610 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 221, "<p class=\"mute\">") | 2629 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 223, "<p class=\"mute\">") |
| 2611 | if templ_7745c5c3_Err != nil { | 2630 | if templ_7745c5c3_Err != nil { | ||
| 2612 | return templ_7745c5c3_Err | 2631 | return templ_7745c5c3_Err | ||
| 2613 | } | 2632 | } | ||
| 2614 | - | var templ_7745c5c3_Var136 string | 2633 | + | var templ_7745c5c3_Var137 string |
| 2615 | - | templ_7745c5c3_Var136, templ_7745c5c3_Err = templ.JoinStringErrs(c.Note) | 2634 | + | templ_7745c5c3_Var137, templ_7745c5c3_Err = templ.JoinStringErrs(c.Note) |
| 2616 | if templ_7745c5c3_Err != nil { | 2635 | if templ_7745c5c3_Err != nil { | ||
| 2617 | - | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 378, Col: 27} | 2636 | + | return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 381, Col: 27} |
| 2618 | } | 2637 | } | ||
| 2619 | - | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var136)) | 2638 | + | _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var137)) |
| 2620 | if templ_7745c5c3_Err != nil { | 2639 | if templ_7745c5c3_Err != nil { | ||
| 2621 | return templ_7745c5c3_Err | 2640 | return templ_7745c5c3_Err | ||
| 2622 | } | 2641 | } | ||
| 2623 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 222, "</p>") | 2642 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 224, "</p>") |
| 2624 | if templ_7745c5c3_Err != nil { | 2643 | if templ_7745c5c3_Err != nil { | ||
| 2625 | return templ_7745c5c3_Err | 2644 | return templ_7745c5c3_Err | ||
| 2626 | } | 2645 | } | ||
| 2627 | } | 2646 | } | ||
| 2628 | - | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 223, "</section>") | 2647 | + | templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 225, "</section>") |
| 2629 | if templ_7745c5c3_Err != nil { | 2648 | if templ_7745c5c3_Err != nil { | ||
| 2630 | return templ_7745c5c3_Err | 2649 | return templ_7745c5c3_Err | ||
| 2631 | } | 2650 | } | ||
M internal/adapters/web/events.go +17 -1
| @@ -120,6 +120,22 @@ func (s *Server) events(w http.ResponseWriter, r *http.Request) { | |||
| 120 | 120 | } | |
| 121 | 121 | } | |
| 122 | 122 | ||
| 123 | + | // The commit of the run of a job page is read once here: the annotations of | |
| 124 | + | // the live job fragments link to files at it, and it never changes, so a | |
| 125 | + | // job update does not read the run again. A run that is not there or not | |
| 126 | + | // readable refuses the stream like a missing repository. | |
| 127 | + | var sha string | |
| 128 | + | if repo != "" && q.Get("view") == "job" && s.cfg.Runs != nil { | |
| 129 | + | cctx, ccancel := context.WithTimeout(ctx, requestTimeout) | |
| 130 | + | var err error | |
| 131 | + | sha, err = s.jobRunSha(cctx, repo, q.Get("job")) | |
| 132 | + | ccancel() | |
| 133 | + | if err != nil { | |
| 134 | + | s.denyEvents(ctx, w, err) | |
| 135 | + | return | |
| 136 | + | } | |
| 137 | + | } | |
| 138 | + | ||
| 123 | 139 | // The watch runs in a goroutine and hands each event to this one through | |
| 124 | 140 | // an unbuffered channel: a visitor that reads slowly holds the watch in | |
| 125 | 141 | // its send, falls behind the buffer of the use case, and gets a gap. | |
| @@ -202,7 +218,7 @@ func (s *Server) events(w http.ResponseWriter, r *http.Request) { | |||
| 202 | 218 | return | |
| 203 | 219 | } | |
| 204 | 220 | ||
| 205 | - | st := &liveStream{s: s, repo: repo, view: q.Get("view"), ref: q.Get("ref"), head: q.Get("head"), n: q.Get("n"), job: q.Get("job")} | |
| 221 | + | st := &liveStream{s: s, repo: repo, view: q.Get("view"), ref: q.Get("ref"), head: q.Get("head"), n: q.Get("n"), job: q.Get("job"), sha: sha} | |
| 206 | 222 | handle := func(m recvd) bool { | |
| 207 | 223 | if m.err != nil { | |
| 208 | 224 | if ctx.Err() == nil && !errors.Is(m.err, context.Canceled) { | |
| @@ -120,6 +120,22 @@ func (s *Server) events(w http.ResponseWriter, r *http.Request) { | |||||
| 120 | } | 120 | } | ||
| 121 | } | 121 | } | ||
| 122 | 122 | ||||
| 123 | + | // The commit of the run of a job page is read once here: the annotations of | |||
| 124 | + | // the live job fragments link to files at it, and it never changes, so a | |||
| 125 | + | // job update does not read the run again. A run that is not there or not | |||
| 126 | + | // readable refuses the stream like a missing repository. | |||
| 127 | + | var sha string | |||
| 128 | + | if repo != "" && q.Get("view") == "job" && s.cfg.Runs != nil { | |||
| 129 | + | cctx, ccancel := context.WithTimeout(ctx, requestTimeout) | |||
| 130 | + | var err error | |||
| 131 | + | sha, err = s.jobRunSha(cctx, repo, q.Get("job")) | |||
| 132 | + | ccancel() | |||
| 133 | + | if err != nil { | |||
| 134 | + | s.denyEvents(ctx, w, err) | |||
| 135 | + | return | |||
| 136 | + | } | |||
| 137 | + | } | |||
| 138 | + | ||||
| 123 | // The watch runs in a goroutine and hands each event to this one through | 139 | // The watch runs in a goroutine and hands each event to this one through | ||
| 124 | // an unbuffered channel: a visitor that reads slowly holds the watch in | 140 | // an unbuffered channel: a visitor that reads slowly holds the watch in | ||
| 125 | // its send, falls behind the buffer of the use case, and gets a gap. | 141 | // its send, falls behind the buffer of the use case, and gets a gap. | ||
| @@ -202,7 +218,7 @@ func (s *Server) events(w http.ResponseWriter, r *http.Request) { | |||||
| 202 | return | 218 | return | ||
| 203 | } | 219 | } | ||
| 204 | 220 | ||||
| 205 | - | st := &liveStream{s: s, repo: repo, view: q.Get("view"), ref: q.Get("ref"), head: q.Get("head"), n: q.Get("n"), job: q.Get("job")} | 221 | + | st := &liveStream{s: s, repo: repo, view: q.Get("view"), ref: q.Get("ref"), head: q.Get("head"), n: q.Get("n"), job: q.Get("job"), sha: sha} |
| 206 | handle := func(m recvd) bool { | 222 | handle := func(m recvd) bool { | ||
| 207 | if m.err != nil { | 223 | if m.err != nil { | ||
| 208 | if ctx.Err() == nil && !errors.Is(m.err, context.Canceled) { | 224 | if ctx.Err() == nil && !errors.Is(m.err, context.Canceled) { | ||
M internal/adapters/web/fragments.go +7 -5
| @@ -26,6 +26,9 @@ type liveStream struct { | |||
| 26 | 26 | head string // commits: the commit listed first | |
| 27 | 27 | n string // mr: the number of the merge request shown; run: the run id | |
| 28 | 28 | job string // job: the id of the job shown | |
| 29 | + | // sha is the commit of the run of the job shown, read once when the stream | |
| 30 | + | // is set up: the annotations link to files at it, and it never changes. | |
| 31 | + | sha string | |
| 29 | 32 | } | |
| 30 | 33 | ||
| 31 | 34 | // renderFragment renders a component to the data of an event. | |
| @@ -478,6 +481,9 @@ func (l *liveStream) runBody(ctx context.Context) ([]fragment, error) { | |||
| 478 | 481 | // jobState tells the job page that its state or its steps changed: the page | |
| 479 | 482 | // reloads the part of the log after the last line it holds (ermite.js). | |
| 480 | 483 | func (l *liveStream) jobState(ctx context.Context) ([]fragment, error) { | |
| 484 | + | if l.sha == "" { | |
| 485 | + | return gap, nil // the stream was set up without the commit of the run | |
| 486 | + | } | |
| 481 | 487 | d, err := l.s.loadRepo(ctx, l.repo) | |
| 482 | 488 | if err != nil { | |
| 483 | 489 | return nil, err | |
| @@ -496,11 +502,7 @@ func (l *liveStream) jobState(ctx context.Context) ([]fragment, error) { | |||
| 496 | 502 | if err != nil { | |
| 497 | 503 | return nil, err | |
| 498 | 504 | } | |
| 499 | - | run, err := l.s.cfg.Runs.GetRun(ctx, principal(ctx), d.repo.Name, view.RunID, 0) | |
| 500 | - | if err != nil { | |
| 501 | - | return nil, err | |
| 502 | - | } | |
| 503 | - | anns, more, err := l.s.jobAnnotations(ctx, d, view.RunID, run.Run.Sha, view, 0) | |
| 505 | + | anns, more, err := l.s.jobAnnotations(ctx, d, view.RunID, l.sha, view, 0) | |
| 504 | 506 | if err != nil { | |
| 505 | 507 | return nil, err | |
| 506 | 508 | } | |
| @@ -26,6 +26,9 @@ type liveStream struct { | |||||
| 26 | head string // commits: the commit listed first | 26 | head string // commits: the commit listed first | ||
| 27 | n string // mr: the number of the merge request shown; run: the run id | 27 | n string // mr: the number of the merge request shown; run: the run id | ||
| 28 | job string // job: the id of the job shown | 28 | job string // job: the id of the job shown | ||
| 29 | + | // sha is the commit of the run of the job shown, read once when the stream | |||
| 30 | + | // is set up: the annotations link to files at it, and it never changes. | |||
| 31 | + | sha string | |||
| 29 | } | 32 | } | ||
| 30 | 33 | ||||
| 31 | // renderFragment renders a component to the data of an event. | 34 | // renderFragment renders a component to the data of an event. | ||
| @@ -478,6 +481,9 @@ func (l *liveStream) runBody(ctx context.Context) ([]fragment, error) { | |||||
| 478 | // jobState tells the job page that its state or its steps changed: the page | 481 | // jobState tells the job page that its state or its steps changed: the page | ||
| 479 | // reloads the part of the log after the last line it holds (ermite.js). | 482 | // reloads the part of the log after the last line it holds (ermite.js). | ||
| 480 | func (l *liveStream) jobState(ctx context.Context) ([]fragment, error) { | 483 | func (l *liveStream) jobState(ctx context.Context) ([]fragment, error) { | ||
| 484 | + | if l.sha == "" { | |||
| 485 | + | return gap, nil // the stream was set up without the commit of the run | |||
| 486 | + | } | |||
| 481 | d, err := l.s.loadRepo(ctx, l.repo) | 487 | d, err := l.s.loadRepo(ctx, l.repo) | ||
| 482 | if err != nil { | 488 | if err != nil { | ||
| 483 | return nil, err | 489 | return nil, err | ||
| @@ -496,11 +502,7 @@ func (l *liveStream) jobState(ctx context.Context) ([]fragment, error) { | |||||
| 496 | if err != nil { | 502 | if err != nil { | ||
| 497 | return nil, err | 503 | return nil, err | ||
| 498 | } | 504 | } | ||
| 499 | - | run, err := l.s.cfg.Runs.GetRun(ctx, principal(ctx), d.repo.Name, view.RunID, 0) | 505 | + | anns, more, err := l.s.jobAnnotations(ctx, d, view.RunID, l.sha, view, 0) |
| 500 | - | if err != nil { | |||
| 501 | - | return nil, err | |||
| 502 | - | } | |||
| 503 | - | anns, more, err := l.s.jobAnnotations(ctx, d, view.RunID, run.Run.Sha, view, 0) | |||
| 504 | if err != nil { | 506 | if err != nil { | ||
| 505 | return nil, err | 507 | return nil, err | ||
| 506 | } | 508 | } | ||
M internal/domain/ci_annotation.go +3 -0
| @@ -57,6 +57,9 @@ type CIAnnotation struct { | |||
| 57 | 57 | type CIStepSummary struct { | |
| 58 | 58 | Step int32 | |
| 59 | 59 | Markdown string | |
| 60 | + | // Omitted is set when the summary exists but was not read, because the | |
| 61 | + | // caller's byte budget was used up; Markdown is then empty. | |
| 62 | + | Omitted bool | |
| 60 | 63 | } | |
| 61 | 64 | ||
| 62 | 65 | // CheckAnnotations validates the annotations of a request: the limits of the | |
| @@ -57,6 +57,9 @@ type CIAnnotation struct { | |||||
| 57 | type CIStepSummary struct { | 57 | type CIStepSummary struct { | ||
| 58 | Step int32 | 58 | Step int32 | ||
| 59 | Markdown string | 59 | Markdown string | ||
| 60 | + | // Omitted is set when the summary exists but was not read, because the | |||
| 61 | + | // caller's byte budget was used up; Markdown is then empty. | |||
| 62 | + | Omitted bool | |||
| 60 | } | 63 | } | ||
| 61 | 64 | ||||
| 62 | // CheckAnnotations validates the annotations of a request: the limits of the | 65 | // CheckAnnotations validates the annotations of a request: the limits of the | ||
M internal/ports/ci.go +10 -4
| @@ -218,8 +218,12 @@ type CISummaryStore interface { | |||
| 218 | 218 | // appears whole or not at all. An empty markdown removes the summary. | |
| 219 | 219 | Put(ctx context.Context, ref CILogRef, step int32, markdown string) error | |
| 220 | 220 | // List returns the summaries of the steps that have one, by step number, | |
| 221 | - | // at most limit; more is true when there are others. | |
| 222 | - | List(ctx context.Context, ref CILogRef, limit int) (summaries []domain.CIStepSummary, more bool, err error) | |
| 221 | + | // at most limit; more is true when there are others. With maxBytes above | |
| 222 | + | // 0 the files are sized (stat) before they are read, and a summary that | |
| 223 | + | // would take the total of the Markdown read past maxBytes is returned | |
| 224 | + | // Omitted, unread, as are all the ones after it: a call never reads more | |
| 225 | + | // than maxBytes. | |
| 226 | + | List(ctx context.Context, ref CILogRef, limit int, maxBytes int64) (summaries []domain.CIStepSummary, more bool, err error) | |
| 223 | 227 | // RemoveJob deletes the summaries of one execution of a job. | |
| 224 | 228 | RemoveJob(ctx context.Context, ref CILogRef) error | |
| 225 | 229 | // RemoveRuns deletes the summaries of the runs. | |
| @@ -531,8 +535,10 @@ type RunService interface { | |||
| 531 | 535 | // attempt in which it executed. | |
| 532 | 536 | ListAnnotations(ctx context.Context, p domain.Principal, repo domain.RepoName, runID int64, attempt int32, jobID string) (AnnotationList, error) | |
| 533 | 537 | // GetStepSummaries returns the summaries of a job at an attempt (0 for the | |
| 534 | - | // latest), by step number. | |
| 535 | - | GetStepSummaries(ctx context.Context, p domain.Principal, repo domain.RepoName, jobID string, attempt int32) (SummaryList, error) | |
| 538 | + | // latest), by step number. maxBytes above 0 bounds the Markdown read: the | |
| 539 | + | // summaries past it come back Omitted, without their Markdown (the API | |
| 540 | + | // passes 0, no bound). | |
| 541 | + | GetStepSummaries(ctx context.Context, p domain.Principal, repo domain.RepoName, jobID string, attempt int32, maxBytes int64) (SummaryList, error) | |
| 536 | 542 | ListRunners(ctx context.Context, p domain.Principal, size int, token string) (RunnerPage, error) | |
| 537 | 543 | RemoveRunner(ctx context.Context, p domain.Principal, id string) error | |
| 538 | 544 | } | |
| @@ -218,8 +218,12 @@ type CISummaryStore interface { | |||||
| 218 | // appears whole or not at all. An empty markdown removes the summary. | 218 | // appears whole or not at all. An empty markdown removes the summary. | ||
| 219 | Put(ctx context.Context, ref CILogRef, step int32, markdown string) error | 219 | Put(ctx context.Context, ref CILogRef, step int32, markdown string) error | ||
| 220 | // List returns the summaries of the steps that have one, by step number, | 220 | // List returns the summaries of the steps that have one, by step number, | ||
| 221 | - | // at most limit; more is true when there are others. | 221 | + | // at most limit; more is true when there are others. With maxBytes above |
| 222 | - | List(ctx context.Context, ref CILogRef, limit int) (summaries []domain.CIStepSummary, more bool, err error) | 222 | + | // 0 the files are sized (stat) before they are read, and a summary that |
| 223 | + | // would take the total of the Markdown read past maxBytes is returned | |||
| 224 | + | // Omitted, unread, as are all the ones after it: a call never reads more | |||
| 225 | + | // than maxBytes. | |||
| 226 | + | List(ctx context.Context, ref CILogRef, limit int, maxBytes int64) (summaries []domain.CIStepSummary, more bool, err error) | |||
| 223 | // RemoveJob deletes the summaries of one execution of a job. | 227 | // RemoveJob deletes the summaries of one execution of a job. | ||
| 224 | RemoveJob(ctx context.Context, ref CILogRef) error | 228 | RemoveJob(ctx context.Context, ref CILogRef) error | ||
| 225 | // RemoveRuns deletes the summaries of the runs. | 229 | // RemoveRuns deletes the summaries of the runs. | ||
| @@ -531,8 +535,10 @@ type RunService interface { | |||||
| 531 | // attempt in which it executed. | 535 | // attempt in which it executed. | ||
| 532 | ListAnnotations(ctx context.Context, p domain.Principal, repo domain.RepoName, runID int64, attempt int32, jobID string) (AnnotationList, error) | 536 | ListAnnotations(ctx context.Context, p domain.Principal, repo domain.RepoName, runID int64, attempt int32, jobID string) (AnnotationList, error) | ||
| 533 | // GetStepSummaries returns the summaries of a job at an attempt (0 for the | 537 | // GetStepSummaries returns the summaries of a job at an attempt (0 for the | ||
| 534 | - | // latest), by step number. | 538 | + | // latest), by step number. maxBytes above 0 bounds the Markdown read: the |
| 535 | - | GetStepSummaries(ctx context.Context, p domain.Principal, repo domain.RepoName, jobID string, attempt int32) (SummaryList, error) | 539 | + | // summaries past it come back Omitted, without their Markdown (the API |
| 540 | + | // passes 0, no bound). | |||
| 541 | + | GetStepSummaries(ctx context.Context, p domain.Principal, repo domain.RepoName, jobID string, attempt int32, maxBytes int64) (SummaryList, error) | |||
| 536 | ListRunners(ctx context.Context, p domain.Principal, size int, token string) (RunnerPage, error) | 542 | ListRunners(ctx context.Context, p domain.Principal, size int, token string) (RunnerPage, error) | ||
| 537 | RemoveRunner(ctx context.Context, p domain.Principal, id string) error | 543 | RemoveRunner(ctx context.Context, p domain.Principal, id string) error | ||
| 538 | } | 544 | } | ||
M internal/ports/mocks/CISummaryStore.go +20 -14
| @@ -49,8 +49,8 @@ func (_m *CISummaryStore) EXPECT() *CISummaryStore_Expecter { | |||
| 49 | 49 | } | |
| 50 | 50 | ||
| 51 | 51 | // List provides a mock function for the type CISummaryStore | |
| 52 | - | func (_mock *CISummaryStore) List(ctx context.Context, ref ports.CILogRef, limit int) ([]domain.CIStepSummary, bool, error) { | |
| 53 | - | ret := _mock.Called(ctx, ref, limit) | |
| 52 | + | func (_mock *CISummaryStore) List(ctx context.Context, ref ports.CILogRef, limit int, maxBytes int64) ([]domain.CIStepSummary, bool, error) { | |
| 53 | + | ret := _mock.Called(ctx, ref, limit, maxBytes) | |
| 54 | 54 | ||
| 55 | 55 | if len(ret) == 0 { | |
| 56 | 56 | panic("no return value specified for List") | |
| @@ -59,23 +59,23 @@ func (_mock *CISummaryStore) List(ctx context.Context, ref ports.CILogRef, limit | |||
| 59 | 59 | var r0 []domain.CIStepSummary | |
| 60 | 60 | var r1 bool | |
| 61 | 61 | var r2 error | |
| 62 | - | if returnFunc, ok := ret.Get(0).(func(context.Context, ports.CILogRef, int) ([]domain.CIStepSummary, bool, error)); ok { | |
| 63 | - | return returnFunc(ctx, ref, limit) | |
| 62 | + | if returnFunc, ok := ret.Get(0).(func(context.Context, ports.CILogRef, int, int64) ([]domain.CIStepSummary, bool, error)); ok { | |
| 63 | + | return returnFunc(ctx, ref, limit, maxBytes) | |
| 64 | 64 | } | |
| 65 | - | if returnFunc, ok := ret.Get(0).(func(context.Context, ports.CILogRef, int) []domain.CIStepSummary); ok { | |
| 66 | - | r0 = returnFunc(ctx, ref, limit) | |
| 65 | + | if returnFunc, ok := ret.Get(0).(func(context.Context, ports.CILogRef, int, int64) []domain.CIStepSummary); ok { | |
| 66 | + | r0 = returnFunc(ctx, ref, limit, maxBytes) | |
| 67 | 67 | } else { | |
| 68 | 68 | if ret.Get(0) != nil { | |
| 69 | 69 | r0 = ret.Get(0).([]domain.CIStepSummary) | |
| 70 | 70 | } | |
| 71 | 71 | } | |
| 72 | - | if returnFunc, ok := ret.Get(1).(func(context.Context, ports.CILogRef, int) bool); ok { | |
| 73 | - | r1 = returnFunc(ctx, ref, limit) | |
| 72 | + | if returnFunc, ok := ret.Get(1).(func(context.Context, ports.CILogRef, int, int64) bool); ok { | |
| 73 | + | r1 = returnFunc(ctx, ref, limit, maxBytes) | |
| 74 | 74 | } else { | |
| 75 | 75 | r1 = ret.Get(1).(bool) | |
| 76 | 76 | } | |
| 77 | - | if returnFunc, ok := ret.Get(2).(func(context.Context, ports.CILogRef, int) error); ok { | |
| 78 | - | r2 = returnFunc(ctx, ref, limit) | |
| 77 | + | if returnFunc, ok := ret.Get(2).(func(context.Context, ports.CILogRef, int, int64) error); ok { | |
| 78 | + | r2 = returnFunc(ctx, ref, limit, maxBytes) | |
| 79 | 79 | } else { | |
| 80 | 80 | r2 = ret.Error(2) | |
| 81 | 81 | } | |
| @@ -91,11 +91,12 @@ type CISummaryStore_List_Call struct { | |||
| 91 | 91 | // - ctx context.Context | |
| 92 | 92 | // - ref ports.CILogRef | |
| 93 | 93 | // - limit int | |
| 94 | - | func (_e *CISummaryStore_Expecter) List(ctx any, ref any, limit any) *CISummaryStore_List_Call { | |
| 95 | - | return &CISummaryStore_List_Call{Call: _e.mock.On("List", ctx, ref, limit)} | |
| 94 | + | // - maxBytes int64 | |
| 95 | + | func (_e *CISummaryStore_Expecter) List(ctx any, ref any, limit any, maxBytes any) *CISummaryStore_List_Call { | |
| 96 | + | return &CISummaryStore_List_Call{Call: _e.mock.On("List", ctx, ref, limit, maxBytes)} | |
| 96 | 97 | } | |
| 97 | 98 | ||
| 98 | - | func (_c *CISummaryStore_List_Call) Run(run func(ctx context.Context, ref ports.CILogRef, limit int)) *CISummaryStore_List_Call { | |
| 99 | + | func (_c *CISummaryStore_List_Call) Run(run func(ctx context.Context, ref ports.CILogRef, limit int, maxBytes int64)) *CISummaryStore_List_Call { | |
| 99 | 100 | _c.Call.Run(func(args mock.Arguments) { | |
| 100 | 101 | var arg0 context.Context | |
| 101 | 102 | if args[0] != nil { | |
| @@ -109,10 +110,15 @@ func (_c *CISummaryStore_List_Call) Run(run func(ctx context.Context, ref ports. | |||
| 109 | 110 | if args[2] != nil { | |
| 110 | 111 | arg2 = args[2].(int) | |
| 111 | 112 | } | |
| 113 | + | var arg3 int64 | |
| 114 | + | if args[3] != nil { | |
| 115 | + | arg3 = args[3].(int64) | |
| 116 | + | } | |
| 112 | 117 | run( | |
| 113 | 118 | arg0, | |
| 114 | 119 | arg1, | |
| 115 | 120 | arg2, | |
| 121 | + | arg3, | |
| 116 | 122 | ) | |
| 117 | 123 | }) | |
| 118 | 124 | return _c | |
| @@ -123,7 +129,7 @@ func (_c *CISummaryStore_List_Call) Return(summaries []domain.CIStepSummary, mor | |||
| 123 | 129 | return _c | |
| 124 | 130 | } | |
| 125 | 131 | ||
| 126 | - | func (_c *CISummaryStore_List_Call) RunAndReturn(run func(ctx context.Context, ref ports.CILogRef, limit int) ([]domain.CIStepSummary, bool, error)) *CISummaryStore_List_Call { | |
| 132 | + | func (_c *CISummaryStore_List_Call) RunAndReturn(run func(ctx context.Context, ref ports.CILogRef, limit int, maxBytes int64) ([]domain.CIStepSummary, bool, error)) *CISummaryStore_List_Call { | |
| 127 | 133 | _c.Call.Return(run) | |
| 128 | 134 | return _c | |
| 129 | 135 | } | |
| @@ -49,8 +49,8 @@ func (_m *CISummaryStore) EXPECT() *CISummaryStore_Expecter { | |||||
| 49 | } | 49 | } | ||
| 50 | 50 | ||||
| 51 | // List provides a mock function for the type CISummaryStore | 51 | // List provides a mock function for the type CISummaryStore | ||
| 52 | - | func (_mock *CISummaryStore) List(ctx context.Context, ref ports.CILogRef, limit int) ([]domain.CIStepSummary, bool, error) { | 52 | + | func (_mock *CISummaryStore) List(ctx context.Context, ref ports.CILogRef, limit int, maxBytes int64) ([]domain.CIStepSummary, bool, error) { |
| 53 | - | ret := _mock.Called(ctx, ref, limit) | 53 | + | ret := _mock.Called(ctx, ref, limit, maxBytes) |
| 54 | 54 | ||||
| 55 | if len(ret) == 0 { | 55 | if len(ret) == 0 { | ||
| 56 | panic("no return value specified for List") | 56 | panic("no return value specified for List") | ||
| @@ -59,23 +59,23 @@ func (_mock *CISummaryStore) List(ctx context.Context, ref ports.CILogRef, limit | |||||
| 59 | var r0 []domain.CIStepSummary | 59 | var r0 []domain.CIStepSummary | ||
| 60 | var r1 bool | 60 | var r1 bool | ||
| 61 | var r2 error | 61 | var r2 error | ||
| 62 | - | if returnFunc, ok := ret.Get(0).(func(context.Context, ports.CILogRef, int) ([]domain.CIStepSummary, bool, error)); ok { | 62 | + | if returnFunc, ok := ret.Get(0).(func(context.Context, ports.CILogRef, int, int64) ([]domain.CIStepSummary, bool, error)); ok { |
| 63 | - | return returnFunc(ctx, ref, limit) | 63 | + | return returnFunc(ctx, ref, limit, maxBytes) |
| 64 | } | 64 | } | ||
| 65 | - | if returnFunc, ok := ret.Get(0).(func(context.Context, ports.CILogRef, int) []domain.CIStepSummary); ok { | 65 | + | if returnFunc, ok := ret.Get(0).(func(context.Context, ports.CILogRef, int, int64) []domain.CIStepSummary); ok { |
| 66 | - | r0 = returnFunc(ctx, ref, limit) | 66 | + | r0 = returnFunc(ctx, ref, limit, maxBytes) |
| 67 | } else { | 67 | } else { | ||
| 68 | if ret.Get(0) != nil { | 68 | if ret.Get(0) != nil { | ||
| 69 | r0 = ret.Get(0).([]domain.CIStepSummary) | 69 | r0 = ret.Get(0).([]domain.CIStepSummary) | ||
| 70 | } | 70 | } | ||
| 71 | } | 71 | } | ||
| 72 | - | if returnFunc, ok := ret.Get(1).(func(context.Context, ports.CILogRef, int) bool); ok { | 72 | + | if returnFunc, ok := ret.Get(1).(func(context.Context, ports.CILogRef, int, int64) bool); ok { |
| 73 | - | r1 = returnFunc(ctx, ref, limit) | 73 | + | r1 = returnFunc(ctx, ref, limit, maxBytes) |
| 74 | } else { | 74 | } else { | ||
| 75 | r1 = ret.Get(1).(bool) | 75 | r1 = ret.Get(1).(bool) | ||
| 76 | } | 76 | } | ||
| 77 | - | if returnFunc, ok := ret.Get(2).(func(context.Context, ports.CILogRef, int) error); ok { | 77 | + | if returnFunc, ok := ret.Get(2).(func(context.Context, ports.CILogRef, int, int64) error); ok { |
| 78 | - | r2 = returnFunc(ctx, ref, limit) | 78 | + | r2 = returnFunc(ctx, ref, limit, maxBytes) |
| 79 | } else { | 79 | } else { | ||
| 80 | r2 = ret.Error(2) | 80 | r2 = ret.Error(2) | ||
| 81 | } | 81 | } | ||
| @@ -91,11 +91,12 @@ type CISummaryStore_List_Call struct { | |||||
| 91 | // - ctx context.Context | 91 | // - ctx context.Context | ||
| 92 | // - ref ports.CILogRef | 92 | // - ref ports.CILogRef | ||
| 93 | // - limit int | 93 | // - limit int | ||
| 94 | - | func (_e *CISummaryStore_Expecter) List(ctx any, ref any, limit any) *CISummaryStore_List_Call { | 94 | + | // - maxBytes int64 |
| 95 | - | return &CISummaryStore_List_Call{Call: _e.mock.On("List", ctx, ref, limit)} | 95 | + | func (_e *CISummaryStore_Expecter) List(ctx any, ref any, limit any, maxBytes any) *CISummaryStore_List_Call { |
| 96 | + | return &CISummaryStore_List_Call{Call: _e.mock.On("List", ctx, ref, limit, maxBytes)} | |||
| 96 | } | 97 | } | ||
| 97 | 98 | ||||
| 98 | - | func (_c *CISummaryStore_List_Call) Run(run func(ctx context.Context, ref ports.CILogRef, limit int)) *CISummaryStore_List_Call { | 99 | + | func (_c *CISummaryStore_List_Call) Run(run func(ctx context.Context, ref ports.CILogRef, limit int, maxBytes int64)) *CISummaryStore_List_Call { |
| 99 | _c.Call.Run(func(args mock.Arguments) { | 100 | _c.Call.Run(func(args mock.Arguments) { | ||
| 100 | var arg0 context.Context | 101 | var arg0 context.Context | ||
| 101 | if args[0] != nil { | 102 | if args[0] != nil { | ||
| @@ -109,10 +110,15 @@ func (_c *CISummaryStore_List_Call) Run(run func(ctx context.Context, ref ports. | |||||
| 109 | if args[2] != nil { | 110 | if args[2] != nil { | ||
| 110 | arg2 = args[2].(int) | 111 | arg2 = args[2].(int) | ||
| 111 | } | 112 | } | ||
| 113 | + | var arg3 int64 | |||
| 114 | + | if args[3] != nil { | |||
| 115 | + | arg3 = args[3].(int64) | |||
| 116 | + | } | |||
| 112 | run( | 117 | run( | ||
| 113 | arg0, | 118 | arg0, | ||
| 114 | arg1, | 119 | arg1, | ||
| 115 | arg2, | 120 | arg2, | ||
| 121 | + | arg3, | |||
| 116 | ) | 122 | ) | ||
| 117 | }) | 123 | }) | ||
| 118 | return _c | 124 | return _c | ||
| @@ -123,7 +129,7 @@ func (_c *CISummaryStore_List_Call) Return(summaries []domain.CIStepSummary, mor | |||||
| 123 | return _c | 129 | return _c | ||
| 124 | } | 130 | } | ||
| 125 | 131 | ||||
| 126 | - | func (_c *CISummaryStore_List_Call) RunAndReturn(run func(ctx context.Context, ref ports.CILogRef, limit int) ([]domain.CIStepSummary, bool, error)) *CISummaryStore_List_Call { | 132 | + | func (_c *CISummaryStore_List_Call) RunAndReturn(run func(ctx context.Context, ref ports.CILogRef, limit int, maxBytes int64) ([]domain.CIStepSummary, bool, error)) *CISummaryStore_List_Call { |
| 127 | _c.Call.Return(run) | 133 | _c.Call.Return(run) | ||
| 128 | return _c | 134 | return _c | ||
| 129 | } | 135 | } | ||
M internal/ports/mocks/RunService.go +18 -12
| @@ -370,8 +370,8 @@ func (_c *RunService_GetRun_Call) RunAndReturn(run func(ctx context.Context, p d | |||
| 370 | 370 | } | |
| 371 | 371 | ||
| 372 | 372 | // GetStepSummaries provides a mock function for the type RunService | |
| 373 | - | func (_mock *RunService) GetStepSummaries(ctx context.Context, p domain.Principal, repo domain.RepoName, jobID string, attempt int32) (ports.SummaryList, error) { | |
| 374 | - | ret := _mock.Called(ctx, p, repo, jobID, attempt) | |
| 373 | + | func (_mock *RunService) GetStepSummaries(ctx context.Context, p domain.Principal, repo domain.RepoName, jobID string, attempt int32, maxBytes int64) (ports.SummaryList, error) { | |
| 374 | + | ret := _mock.Called(ctx, p, repo, jobID, attempt, maxBytes) | |
| 375 | 375 | ||
| 376 | 376 | if len(ret) == 0 { | |
| 377 | 377 | panic("no return value specified for GetStepSummaries") | |
| @@ -379,16 +379,16 @@ func (_mock *RunService) GetStepSummaries(ctx context.Context, p domain.Principa | |||
| 379 | 379 | ||
| 380 | 380 | var r0 ports.SummaryList | |
| 381 | 381 | var r1 error | |
| 382 | - | if returnFunc, ok := ret.Get(0).(func(context.Context, domain.Principal, domain.RepoName, string, int32) (ports.SummaryList, error)); ok { | |
| 383 | - | return returnFunc(ctx, p, repo, jobID, attempt) | |
| 382 | + | if returnFunc, ok := ret.Get(0).(func(context.Context, domain.Principal, domain.RepoName, string, int32, int64) (ports.SummaryList, error)); ok { | |
| 383 | + | return returnFunc(ctx, p, repo, jobID, attempt, maxBytes) | |
| 384 | 384 | } | |
| 385 | - | if returnFunc, ok := ret.Get(0).(func(context.Context, domain.Principal, domain.RepoName, string, int32) ports.SummaryList); ok { | |
| 386 | - | r0 = returnFunc(ctx, p, repo, jobID, attempt) | |
| 385 | + | if returnFunc, ok := ret.Get(0).(func(context.Context, domain.Principal, domain.RepoName, string, int32, int64) ports.SummaryList); ok { | |
| 386 | + | r0 = returnFunc(ctx, p, repo, jobID, attempt, maxBytes) | |
| 387 | 387 | } else { | |
| 388 | 388 | r0 = ret.Get(0).(ports.SummaryList) | |
| 389 | 389 | } | |
| 390 | - | if returnFunc, ok := ret.Get(1).(func(context.Context, domain.Principal, domain.RepoName, string, int32) error); ok { | |
| 391 | - | r1 = returnFunc(ctx, p, repo, jobID, attempt) | |
| 390 | + | if returnFunc, ok := ret.Get(1).(func(context.Context, domain.Principal, domain.RepoName, string, int32, int64) error); ok { | |
| 391 | + | r1 = returnFunc(ctx, p, repo, jobID, attempt, maxBytes) | |
| 392 | 392 | } else { | |
| 393 | 393 | r1 = ret.Error(1) | |
| 394 | 394 | } | |
| @@ -406,11 +406,12 @@ type RunService_GetStepSummaries_Call struct { | |||
| 406 | 406 | // - repo domain.RepoName | |
| 407 | 407 | // - jobID string | |
| 408 | 408 | // - attempt int32 | |
| 409 | - | func (_e *RunService_Expecter) GetStepSummaries(ctx any, p any, repo any, jobID any, attempt any) *RunService_GetStepSummaries_Call { | |
| 410 | - | return &RunService_GetStepSummaries_Call{Call: _e.mock.On("GetStepSummaries", ctx, p, repo, jobID, attempt)} | |
| 409 | + | // - maxBytes int64 | |
| 410 | + | func (_e *RunService_Expecter) GetStepSummaries(ctx any, p any, repo any, jobID any, attempt any, maxBytes any) *RunService_GetStepSummaries_Call { | |
| 411 | + | return &RunService_GetStepSummaries_Call{Call: _e.mock.On("GetStepSummaries", ctx, p, repo, jobID, attempt, maxBytes)} | |
| 411 | 412 | } | |
| 412 | 413 | ||
| 413 | - | func (_c *RunService_GetStepSummaries_Call) Run(run func(ctx context.Context, p domain.Principal, repo domain.RepoName, jobID string, attempt int32)) *RunService_GetStepSummaries_Call { | |
| 414 | + | func (_c *RunService_GetStepSummaries_Call) Run(run func(ctx context.Context, p domain.Principal, repo domain.RepoName, jobID string, attempt int32, maxBytes int64)) *RunService_GetStepSummaries_Call { | |
| 414 | 415 | _c.Call.Run(func(args mock.Arguments) { | |
| 415 | 416 | var arg0 context.Context | |
| 416 | 417 | if args[0] != nil { | |
| @@ -432,12 +433,17 @@ func (_c *RunService_GetStepSummaries_Call) Run(run func(ctx context.Context, p | |||
| 432 | 433 | if args[4] != nil { | |
| 433 | 434 | arg4 = args[4].(int32) | |
| 434 | 435 | } | |
| 436 | + | var arg5 int64 | |
| 437 | + | if args[5] != nil { | |
| 438 | + | arg5 = args[5].(int64) | |
| 439 | + | } | |
| 435 | 440 | run( | |
| 436 | 441 | arg0, | |
| 437 | 442 | arg1, | |
| 438 | 443 | arg2, | |
| 439 | 444 | arg3, | |
| 440 | 445 | arg4, | |
| 446 | + | arg5, | |
| 441 | 447 | ) | |
| 442 | 448 | }) | |
| 443 | 449 | return _c | |
| @@ -448,7 +454,7 @@ func (_c *RunService_GetStepSummaries_Call) Return(summaryList ports.SummaryList | |||
| 448 | 454 | return _c | |
| 449 | 455 | } | |
| 450 | 456 | ||
| 451 | - | func (_c *RunService_GetStepSummaries_Call) RunAndReturn(run func(ctx context.Context, p domain.Principal, repo domain.RepoName, jobID string, attempt int32) (ports.SummaryList, error)) *RunService_GetStepSummaries_Call { | |
| 457 | + | func (_c *RunService_GetStepSummaries_Call) RunAndReturn(run func(ctx context.Context, p domain.Principal, repo domain.RepoName, jobID string, attempt int32, maxBytes int64) (ports.SummaryList, error)) *RunService_GetStepSummaries_Call { | |
| 452 | 458 | _c.Call.Return(run) | |
| 453 | 459 | return _c | |
| 454 | 460 | } | |
| @@ -370,8 +370,8 @@ func (_c *RunService_GetRun_Call) RunAndReturn(run func(ctx context.Context, p d | |||||
| 370 | } | 370 | } | ||
| 371 | 371 | ||||
| 372 | // GetStepSummaries provides a mock function for the type RunService | 372 | // GetStepSummaries provides a mock function for the type RunService | ||
| 373 | - | func (_mock *RunService) GetStepSummaries(ctx context.Context, p domain.Principal, repo domain.RepoName, jobID string, attempt int32) (ports.SummaryList, error) { | 373 | + | func (_mock *RunService) GetStepSummaries(ctx context.Context, p domain.Principal, repo domain.RepoName, jobID string, attempt int32, maxBytes int64) (ports.SummaryList, error) { |
| 374 | - | ret := _mock.Called(ctx, p, repo, jobID, attempt) | 374 | + | ret := _mock.Called(ctx, p, repo, jobID, attempt, maxBytes) |
| 375 | 375 | ||||
| 376 | if len(ret) == 0 { | 376 | if len(ret) == 0 { | ||
| 377 | panic("no return value specified for GetStepSummaries") | 377 | panic("no return value specified for GetStepSummaries") | ||
| @@ -379,16 +379,16 @@ func (_mock *RunService) GetStepSummaries(ctx context.Context, p domain.Principa | |||||
| 379 | 379 | ||||
| 380 | var r0 ports.SummaryList | 380 | var r0 ports.SummaryList | ||
| 381 | var r1 error | 381 | var r1 error | ||
| 382 | - | if returnFunc, ok := ret.Get(0).(func(context.Context, domain.Principal, domain.RepoName, string, int32) (ports.SummaryList, error)); ok { | 382 | + | if returnFunc, ok := ret.Get(0).(func(context.Context, domain.Principal, domain.RepoName, string, int32, int64) (ports.SummaryList, error)); ok { |
| 383 | - | return returnFunc(ctx, p, repo, jobID, attempt) | 383 | + | return returnFunc(ctx, p, repo, jobID, attempt, maxBytes) |
| 384 | } | 384 | } | ||
| 385 | - | if returnFunc, ok := ret.Get(0).(func(context.Context, domain.Principal, domain.RepoName, string, int32) ports.SummaryList); ok { | 385 | + | if returnFunc, ok := ret.Get(0).(func(context.Context, domain.Principal, domain.RepoName, string, int32, int64) ports.SummaryList); ok { |
| 386 | - | r0 = returnFunc(ctx, p, repo, jobID, attempt) | 386 | + | r0 = returnFunc(ctx, p, repo, jobID, attempt, maxBytes) |
| 387 | } else { | 387 | } else { | ||
| 388 | r0 = ret.Get(0).(ports.SummaryList) | 388 | r0 = ret.Get(0).(ports.SummaryList) | ||
| 389 | } | 389 | } | ||
| 390 | - | if returnFunc, ok := ret.Get(1).(func(context.Context, domain.Principal, domain.RepoName, string, int32) error); ok { | 390 | + | if returnFunc, ok := ret.Get(1).(func(context.Context, domain.Principal, domain.RepoName, string, int32, int64) error); ok { |
| 391 | - | r1 = returnFunc(ctx, p, repo, jobID, attempt) | 391 | + | r1 = returnFunc(ctx, p, repo, jobID, attempt, maxBytes) |
| 392 | } else { | 392 | } else { | ||
| 393 | r1 = ret.Error(1) | 393 | r1 = ret.Error(1) | ||
| 394 | } | 394 | } | ||
| @@ -406,11 +406,12 @@ type RunService_GetStepSummaries_Call struct { | |||||
| 406 | // - repo domain.RepoName | 406 | // - repo domain.RepoName | ||
| 407 | // - jobID string | 407 | // - jobID string | ||
| 408 | // - attempt int32 | 408 | // - attempt int32 | ||
| 409 | - | func (_e *RunService_Expecter) GetStepSummaries(ctx any, p any, repo any, jobID any, attempt any) *RunService_GetStepSummaries_Call { | 409 | + | // - maxBytes int64 |
| 410 | - | return &RunService_GetStepSummaries_Call{Call: _e.mock.On("GetStepSummaries", ctx, p, repo, jobID, attempt)} | 410 | + | func (_e *RunService_Expecter) GetStepSummaries(ctx any, p any, repo any, jobID any, attempt any, maxBytes any) *RunService_GetStepSummaries_Call { |
| 411 | + | return &RunService_GetStepSummaries_Call{Call: _e.mock.On("GetStepSummaries", ctx, p, repo, jobID, attempt, maxBytes)} | |||
| 411 | } | 412 | } | ||
| 412 | 413 | ||||
| 413 | - | func (_c *RunService_GetStepSummaries_Call) Run(run func(ctx context.Context, p domain.Principal, repo domain.RepoName, jobID string, attempt int32)) *RunService_GetStepSummaries_Call { | 414 | + | func (_c *RunService_GetStepSummaries_Call) Run(run func(ctx context.Context, p domain.Principal, repo domain.RepoName, jobID string, attempt int32, maxBytes int64)) *RunService_GetStepSummaries_Call { |
| 414 | _c.Call.Run(func(args mock.Arguments) { | 415 | _c.Call.Run(func(args mock.Arguments) { | ||
| 415 | var arg0 context.Context | 416 | var arg0 context.Context | ||
| 416 | if args[0] != nil { | 417 | if args[0] != nil { | ||
| @@ -432,12 +433,17 @@ func (_c *RunService_GetStepSummaries_Call) Run(run func(ctx context.Context, p | |||||
| 432 | if args[4] != nil { | 433 | if args[4] != nil { | ||
| 433 | arg4 = args[4].(int32) | 434 | arg4 = args[4].(int32) | ||
| 434 | } | 435 | } | ||
| 436 | + | var arg5 int64 | |||
| 437 | + | if args[5] != nil { | |||
| 438 | + | arg5 = args[5].(int64) | |||
| 439 | + | } | |||
| 435 | run( | 440 | run( | ||
| 436 | arg0, | 441 | arg0, | ||
| 437 | arg1, | 442 | arg1, | ||
| 438 | arg2, | 443 | arg2, | ||
| 439 | arg3, | 444 | arg3, | ||
| 440 | arg4, | 445 | arg4, | ||
| 446 | + | arg5, | |||
| 441 | ) | 447 | ) | ||
| 442 | }) | 448 | }) | ||
| 443 | return _c | 449 | return _c | ||
| @@ -448,7 +454,7 @@ func (_c *RunService_GetStepSummaries_Call) Return(summaryList ports.SummaryList | |||||
| 448 | return _c | 454 | return _c | ||
| 449 | } | 455 | } | ||
| 450 | 456 | ||||
| 451 | - | func (_c *RunService_GetStepSummaries_Call) RunAndReturn(run func(ctx context.Context, p domain.Principal, repo domain.RepoName, jobID string, attempt int32) (ports.SummaryList, error)) *RunService_GetStepSummaries_Call { | 457 | + | func (_c *RunService_GetStepSummaries_Call) RunAndReturn(run func(ctx context.Context, p domain.Principal, repo domain.RepoName, jobID string, attempt int32, maxBytes int64) (ports.SummaryList, error)) *RunService_GetStepSummaries_Call { |
| 452 | _c.Call.Return(run) | 458 | _c.Call.Return(run) | ||
| 453 | return _c | 459 | return _c | ||
| 454 | } | 460 | } | ||
M internal/usecase/ci_results.go +4 -3
| @@ -111,8 +111,9 @@ func (c *CI) ListAnnotations(ctx context.Context, p domain.Principal, name domai | |||
| 111 | 111 | } | |
| 112 | 112 | ||
| 113 | 113 | // GetStepSummaries returns the summaries of a job at an attempt (0 for the | |
| 114 | - | // latest): the first 20 steps that have one, by step number. | |
| 115 | - | func (c *CI) GetStepSummaries(ctx context.Context, p domain.Principal, name domain.RepoName, jobID string, attempt int32) (ports.SummaryList, error) { | |
| 114 | + | // latest): the first 20 steps that have one, by step number. With maxBytes | |
| 115 | + | // above 0, no more than that many bytes of Markdown are read. | |
| 116 | + | func (c *CI) GetStepSummaries(ctx context.Context, p domain.Principal, name domain.RepoName, jobID string, attempt int32, maxBytes int64) (ports.SummaryList, error) { | |
| 116 | 117 | if _, err := c.readableRepo(ctx, p, name); err != nil { | |
| 117 | 118 | return ports.SummaryList{}, err | |
| 118 | 119 | } | |
| @@ -120,7 +121,7 @@ func (c *CI) GetStepSummaries(ctx context.Context, p domain.Principal, name doma | |||
| 120 | 121 | if err != nil { | |
| 121 | 122 | return ports.SummaryList{}, err | |
| 122 | 123 | } | |
| 123 | - | list, more, err := c.cfg.Summaries.List(ctx, logRef(j), domain.CIMaxListedSummaries) | |
| 124 | + | list, more, err := c.cfg.Summaries.List(ctx, logRef(j), domain.CIMaxListedSummaries, max(maxBytes, 0)) | |
| 124 | 125 | if err != nil { | |
| 125 | 126 | return ports.SummaryList{}, err | |
| 126 | 127 | } | |
| @@ -111,8 +111,9 @@ func (c *CI) ListAnnotations(ctx context.Context, p domain.Principal, name domai | |||||
| 111 | } | 111 | } | ||
| 112 | 112 | ||||
| 113 | // GetStepSummaries returns the summaries of a job at an attempt (0 for the | 113 | // GetStepSummaries returns the summaries of a job at an attempt (0 for the | ||
| 114 | - | // latest): the first 20 steps that have one, by step number. | 114 | + | // latest): the first 20 steps that have one, by step number. With maxBytes |
| 115 | - | func (c *CI) GetStepSummaries(ctx context.Context, p domain.Principal, name domain.RepoName, jobID string, attempt int32) (ports.SummaryList, error) { | 115 | + | // above 0, no more than that many bytes of Markdown are read. |
| 116 | + | func (c *CI) GetStepSummaries(ctx context.Context, p domain.Principal, name domain.RepoName, jobID string, attempt int32, maxBytes int64) (ports.SummaryList, error) { | |||
| 116 | if _, err := c.readableRepo(ctx, p, name); err != nil { | 117 | if _, err := c.readableRepo(ctx, p, name); err != nil { | ||
| 117 | return ports.SummaryList{}, err | 118 | return ports.SummaryList{}, err | ||
| 118 | } | 119 | } | ||
| @@ -120,7 +121,7 @@ func (c *CI) GetStepSummaries(ctx context.Context, p domain.Principal, name doma | |||||
| 120 | if err != nil { | 121 | if err != nil { | ||
| 121 | return ports.SummaryList{}, err | 122 | return ports.SummaryList{}, err | ||
| 122 | } | 123 | } | ||
| 123 | - | list, more, err := c.cfg.Summaries.List(ctx, logRef(j), domain.CIMaxListedSummaries) | 124 | + | list, more, err := c.cfg.Summaries.List(ctx, logRef(j), domain.CIMaxListedSummaries, max(maxBytes, 0)) |
| 124 | if err != nil { | 125 | if err != nil { | ||
| 125 | return ports.SummaryList{}, err | 126 | return ports.SummaryList{}, err | ||
| 126 | } | 127 | } | ||
M internal/usecase/ci_results_unit_test.go +24 -3
| @@ -177,7 +177,7 @@ func TestGetStepSummariesAndListAnnotations(t *testing.T) { | |||
| 177 | 177 | u.store.EXPECT().GetJob(mock.Anything, int64(7), int32(2), jobIDOne).Return(j, nil) | |
| 178 | 178 | u.store.EXPECT().ListJobs(mock.Anything, int64(7), int32(2)).Return([]domain.CIJob{j}, nil) | |
| 179 | 179 | u.store.EXPECT().JobAnnotations(mock.Anything, int64(7), int32(1), jobIDOne).Return([]domain.CIAnnotation{warn(1, "from attempt 1")}, nil) | |
| 180 | - | u.sums.EXPECT().List(mock.Anything, ports.CILogRef{RunID: 7, JobID: jobIDOne, Attempt: 1}, domain.CIMaxListedSummaries). | |
| 180 | + | u.sums.EXPECT().List(mock.Anything, ports.CILogRef{RunID: 7, JobID: jobIDOne, Attempt: 1}, domain.CIMaxListedSummaries, int64(0)). | |
| 181 | 181 | Return([]domain.CIStepSummary{{Step: 3, Markdown: "s"}}, true, nil) | |
| 182 | 182 | ctx := context.Background() | |
| 183 | 183 | ||
| @@ -187,7 +187,7 @@ func TestGetStepSummariesAndListAnnotations(t *testing.T) { | |||
| 187 | 187 | assert.Equal(t, jobIDOne, anns.Annotations[0].JobID) | |
| 188 | 188 | assert.False(t, anns.Truncated) | |
| 189 | 189 | ||
| 190 | - | sums, err := u.ci.GetStepSummaries(ctx, domain.Anonymous(), repo, jobIDOne, 0) | |
| 190 | + | sums, err := u.ci.GetStepSummaries(ctx, domain.Anonymous(), repo, jobIDOne, 0, 0) | |
| 191 | 191 | require.NoError(t, err) | |
| 192 | 192 | assert.True(t, sums.Truncated) | |
| 193 | 193 | assert.Equal(t, []domain.CIStepSummary{{Step: 3, Markdown: "s"}}, sums.Summaries) | |
| @@ -226,6 +226,27 @@ func TestResultsReadsFollowTheAccessOfTheRepository(t *testing.T) { | |||
| 226 | 226 | u.meta.EXPECT().Get(mock.Anything, repo).Return(domain.Repo{Name: repo, Visibility: domain.VisibilityPrivate}, nil) | |
| 227 | 227 | _, err := u.ci.ListAnnotations(context.Background(), domain.Anonymous(), repo, 7, 0, "") | |
| 228 | 228 | assert.ErrorIs(t, err, domain.ErrNotFound) | |
| 229 | - | _, err = u.ci.GetStepSummaries(context.Background(), domain.Anonymous(), repo, jobIDOne, 0) | |
| 229 | + | _, err = u.ci.GetStepSummaries(context.Background(), domain.Anonymous(), repo, jobIDOne, 0, 0) | |
| 230 | 230 | assert.ErrorIs(t, err, domain.ErrNotFound) | |
| 231 | 231 | } | |
| 232 | + | ||
| 233 | + | // The byte budget of a reader reaches the store, and a negative one means none. | |
| 234 | + | func TestGetStepSummariesPassesTheBudget(t *testing.T) { | |
| 235 | + | t.Parallel() | |
| 236 | + | u := newCIUnit(t, nil) | |
| 237 | + | repo := name(t, "proj") | |
| 238 | + | j := ciJob(t, domain.CIPhaseEnded, jobSecret) | |
| 239 | + | u.meta.EXPECT().Get(mock.Anything, repo).Return(domain.Repo{Name: repo, Visibility: domain.VisibilityPublic}, nil) | |
| 240 | + | u.store.EXPECT().GetRun(mock.Anything, repo, int64(7)).Return(domain.CIRun{Repo: repo, ID: 7, Attempt: 1}, nil) | |
| 241 | + | u.store.EXPECT().GetJob(mock.Anything, int64(7), int32(1), jobIDOne).Return(j, nil) | |
| 242 | + | ref := ports.CILogRef{RunID: 7, JobID: jobIDOne, Attempt: 1} | |
| 243 | + | u.sums.EXPECT().List(mock.Anything, ref, domain.CIMaxListedSummaries, int64(4096)). | |
| 244 | + | Return([]domain.CIStepSummary{{Step: 1, Markdown: "a"}, {Step: 2, Omitted: true}}, false, nil).Once() | |
| 245 | + | u.sums.EXPECT().List(mock.Anything, ref, domain.CIMaxListedSummaries, int64(0)).Return(nil, false, nil).Once() | |
| 246 | + | ||
| 247 | + | got, err := u.ci.GetStepSummaries(context.Background(), domain.Anonymous(), repo, jobIDOne, 0, 4096) | |
| 248 | + | require.NoError(t, err) | |
| 249 | + | assert.True(t, got.Summaries[1].Omitted) | |
| 250 | + | _, err = u.ci.GetStepSummaries(context.Background(), domain.Anonymous(), repo, jobIDOne, 0, -5) | |
| 251 | + | require.NoError(t, err) | |
| 252 | + | } | |
| @@ -177,7 +177,7 @@ func TestGetStepSummariesAndListAnnotations(t *testing.T) { | |||||
| 177 | u.store.EXPECT().GetJob(mock.Anything, int64(7), int32(2), jobIDOne).Return(j, nil) | 177 | u.store.EXPECT().GetJob(mock.Anything, int64(7), int32(2), jobIDOne).Return(j, nil) | ||
| 178 | u.store.EXPECT().ListJobs(mock.Anything, int64(7), int32(2)).Return([]domain.CIJob{j}, nil) | 178 | u.store.EXPECT().ListJobs(mock.Anything, int64(7), int32(2)).Return([]domain.CIJob{j}, nil) | ||
| 179 | u.store.EXPECT().JobAnnotations(mock.Anything, int64(7), int32(1), jobIDOne).Return([]domain.CIAnnotation{warn(1, "from attempt 1")}, nil) | 179 | u.store.EXPECT().JobAnnotations(mock.Anything, int64(7), int32(1), jobIDOne).Return([]domain.CIAnnotation{warn(1, "from attempt 1")}, nil) | ||
| 180 | - | u.sums.EXPECT().List(mock.Anything, ports.CILogRef{RunID: 7, JobID: jobIDOne, Attempt: 1}, domain.CIMaxListedSummaries). | 180 | + | u.sums.EXPECT().List(mock.Anything, ports.CILogRef{RunID: 7, JobID: jobIDOne, Attempt: 1}, domain.CIMaxListedSummaries, int64(0)). |
| 181 | Return([]domain.CIStepSummary{{Step: 3, Markdown: "s"}}, true, nil) | 181 | Return([]domain.CIStepSummary{{Step: 3, Markdown: "s"}}, true, nil) | ||
| 182 | ctx := context.Background() | 182 | ctx := context.Background() | ||
| 183 | 183 | ||||
| @@ -187,7 +187,7 @@ func TestGetStepSummariesAndListAnnotations(t *testing.T) { | |||||
| 187 | assert.Equal(t, jobIDOne, anns.Annotations[0].JobID) | 187 | assert.Equal(t, jobIDOne, anns.Annotations[0].JobID) | ||
| 188 | assert.False(t, anns.Truncated) | 188 | assert.False(t, anns.Truncated) | ||
| 189 | 189 | ||||
| 190 | - | sums, err := u.ci.GetStepSummaries(ctx, domain.Anonymous(), repo, jobIDOne, 0) | 190 | + | sums, err := u.ci.GetStepSummaries(ctx, domain.Anonymous(), repo, jobIDOne, 0, 0) |
| 191 | require.NoError(t, err) | 191 | require.NoError(t, err) | ||
| 192 | assert.True(t, sums.Truncated) | 192 | assert.True(t, sums.Truncated) | ||
| 193 | assert.Equal(t, []domain.CIStepSummary{{Step: 3, Markdown: "s"}}, sums.Summaries) | 193 | assert.Equal(t, []domain.CIStepSummary{{Step: 3, Markdown: "s"}}, sums.Summaries) | ||
| @@ -226,6 +226,27 @@ func TestResultsReadsFollowTheAccessOfTheRepository(t *testing.T) { | |||||
| 226 | u.meta.EXPECT().Get(mock.Anything, repo).Return(domain.Repo{Name: repo, Visibility: domain.VisibilityPrivate}, nil) | 226 | u.meta.EXPECT().Get(mock.Anything, repo).Return(domain.Repo{Name: repo, Visibility: domain.VisibilityPrivate}, nil) | ||
| 227 | _, err := u.ci.ListAnnotations(context.Background(), domain.Anonymous(), repo, 7, 0, "") | 227 | _, err := u.ci.ListAnnotations(context.Background(), domain.Anonymous(), repo, 7, 0, "") | ||
| 228 | assert.ErrorIs(t, err, domain.ErrNotFound) | 228 | assert.ErrorIs(t, err, domain.ErrNotFound) | ||
| 229 | - | _, err = u.ci.GetStepSummaries(context.Background(), domain.Anonymous(), repo, jobIDOne, 0) | 229 | + | _, err = u.ci.GetStepSummaries(context.Background(), domain.Anonymous(), repo, jobIDOne, 0, 0) |
| 230 | assert.ErrorIs(t, err, domain.ErrNotFound) | 230 | assert.ErrorIs(t, err, domain.ErrNotFound) | ||
| 231 | } | 231 | } | ||
| 232 | + | ||||
| 233 | + | // The byte budget of a reader reaches the store, and a negative one means none. | |||
| 234 | + | func TestGetStepSummariesPassesTheBudget(t *testing.T) { | |||
| 235 | + | t.Parallel() | |||
| 236 | + | u := newCIUnit(t, nil) | |||
| 237 | + | repo := name(t, "proj") | |||
| 238 | + | j := ciJob(t, domain.CIPhaseEnded, jobSecret) | |||
| 239 | + | u.meta.EXPECT().Get(mock.Anything, repo).Return(domain.Repo{Name: repo, Visibility: domain.VisibilityPublic}, nil) | |||
| 240 | + | u.store.EXPECT().GetRun(mock.Anything, repo, int64(7)).Return(domain.CIRun{Repo: repo, ID: 7, Attempt: 1}, nil) | |||
| 241 | + | u.store.EXPECT().GetJob(mock.Anything, int64(7), int32(1), jobIDOne).Return(j, nil) | |||
| 242 | + | ref := ports.CILogRef{RunID: 7, JobID: jobIDOne, Attempt: 1} | |||
| 243 | + | u.sums.EXPECT().List(mock.Anything, ref, domain.CIMaxListedSummaries, int64(4096)). | |||
| 244 | + | Return([]domain.CIStepSummary{{Step: 1, Markdown: "a"}, {Step: 2, Omitted: true}}, false, nil).Once() | |||
| 245 | + | u.sums.EXPECT().List(mock.Anything, ref, domain.CIMaxListedSummaries, int64(0)).Return(nil, false, nil).Once() | |||
| 246 | + | ||||
| 247 | + | got, err := u.ci.GetStepSummaries(context.Background(), domain.Anonymous(), repo, jobIDOne, 0, 4096) | |||
| 248 | + | require.NoError(t, err) | |||
| 249 | + | assert.True(t, got.Summaries[1].Omitted) | |||
| 250 | + | _, err = u.ci.GetStepSummaries(context.Background(), domain.Anonymous(), repo, jobIDOne, 0, -5) | |||
| 251 | + | require.NoError(t, err) | |||
| 252 | + | } | |||