v0.8.0 eaf4295

tree_templ.go RawHistoryFolder

1// Code generated by templ - DO NOT EDIT.
2
3// templ: version: v0.3.1020
4// SPDX-License-Identifier: AGPL-3.0-or-later
5
6package web
7
8//lint:file-ignore SA4006 This context is only used if a nested component is present.
9
10import "github.com/a-h/templ"
11import templruntime "github.com/a-h/templ/runtime"
12
13// Tree is a directory: the file finder, the entries with their last commit, the
14// notes on what is left out, and the README of the directory below.
15func Tree(l Layout, p TreePage) templ.Component {
16	return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
17		templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
18		if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil {
19			return templ_7745c5c3_CtxErr
20		}
21		templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
22		if !templ_7745c5c3_IsBuffer {
23			defer func() {
24				templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer)
25				if templ_7745c5c3_Err == nil {
26					templ_7745c5c3_Err = templ_7745c5c3_BufErr
27				}
28			}()
29		}
30		ctx = templ.InitializeContext(ctx)
31		templ_7745c5c3_Var1 := templ.GetChildren(ctx)
32		if templ_7745c5c3_Var1 == nil {
33			templ_7745c5c3_Var1 = templ.NopComponent
34		}
35		ctx = templ.ClearChildren(ctx)
36		templ_7745c5c3_Var2 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
37			templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
38			templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
39			if !templ_7745c5c3_IsBuffer {
40				defer func() {
41					templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer)
42					if templ_7745c5c3_Err == nil {
43						templ_7745c5c3_Err = templ_7745c5c3_BufErr
44					}
45				}()
46			}
47			ctx = templ.InitializeContext(ctx)
48			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 1, "<div class=\"filter\"><label for=\"finder-q\" class=\"sr\">find a file</label> <input id=\"finder-q\" type=\"search\" data-filter role=\"combobox\" aria-autocomplete=\"list\" aria-controls=\"finder-list\" aria-expanded=\"false\" placeholder=\"Find a file…\" autocomplete=\"off\" spellcheck=\"false\" hx-on:focus=\"ermiteFinder.load()\" hx-on:input=\"ermiteFinder.input(this)\" hx-on:keydown=\"ermiteFinder.key(this, event)\"></div><div id=\"finder\" hidden><p id=\"finder-status\" class=\"dim\" aria-live=\"polite\"></p><ul id=\"finder-list\" class=\"cmd-list\" role=\"listbox\" aria-label=\"Files\"></ul></div><div id=\"tree-view\"><table class=\"list tree\" aria-label=\"Entries\"><thead><tr><th class=\"cur\"></th><th class=\"c-kind\"></th><th class=\"c-name\">name</th><th class=\"c-size\">size</th><th class=\"c-sub\">last commit</th><th class=\"c-who\">author</th><th class=\"c-when\">date</th></tr></thead> <tbody id=\"tree-rows\" data-rows hx-on:click=\"ermiteTree.click(event)\">")
49			if templ_7745c5c3_Err != nil {
50				return templ_7745c5c3_Err
51			}
52			templ_7745c5c3_Err = TreeRows(p).Render(ctx, templ_7745c5c3_Buffer)
53			if templ_7745c5c3_Err != nil {
54				return templ_7745c5c3_Err
55			}
56			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 2, "</tbody></table>")
57			if templ_7745c5c3_Err != nil {
58				return templ_7745c5c3_Err
59			}
60			if len(p.Rows) == 0 {
61				templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 3, "<p class=\"lede dim\">this directory is empty.</p>")
62				if templ_7745c5c3_Err != nil {
63					return templ_7745c5c3_Err
64				}
65			}
66			for _, n := range p.Notes {
67				templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 4, "<p class=\"note\">")
68				if templ_7745c5c3_Err != nil {
69					return templ_7745c5c3_Err
70				}
71				var templ_7745c5c3_Var3 string
72				templ_7745c5c3_Var3, templ_7745c5c3_Err = templ.JoinStringErrs(n)
73				if templ_7745c5c3_Err != nil {
74					return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/tree.templ`, Line: 44, Col: 23}
75				}
76				_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var3))
77				if templ_7745c5c3_Err != nil {
78					return templ_7745c5c3_Err
79				}
80				templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 5, "</p>")
81				if templ_7745c5c3_Err != nil {
82					return templ_7745c5c3_Err
83				}
84			}
85			if p.Readme != nil {
86				templ_7745c5c3_Err = ReadmeCard(*p.Readme).Render(ctx, templ_7745c5c3_Buffer)
87				if templ_7745c5c3_Err != nil {
88					return templ_7745c5c3_Err
89				}
90			}
91			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 6, "</div>")
92			if templ_7745c5c3_Err != nil {
93				return templ_7745c5c3_Err
94			}
95			return nil
96		})
97		templ_7745c5c3_Err = Shell(l, nil).Render(templ.WithChildren(ctx, templ_7745c5c3_Var2), templ_7745c5c3_Buffer)
98		if templ_7745c5c3_Err != nil {
99			return templ_7745c5c3_Err
100		}
101		return nil
102	})
103}
104
105// TreeRows is the rows of a directory alone: what files.js inserts under a
106// directory it opens in place. When the directory has more entries than are
107// listed, the last row links to its page.
108func TreeRows(p TreePage) templ.Component {
109	return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
110		templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
111		if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil {
112			return templ_7745c5c3_CtxErr
113		}
114		templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
115		if !templ_7745c5c3_IsBuffer {
116			defer func() {
117				templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer)
118				if templ_7745c5c3_Err == nil {
119					templ_7745c5c3_Err = templ_7745c5c3_BufErr
120				}
121			}()
122		}
123		ctx = templ.InitializeContext(ctx)
124		templ_7745c5c3_Var4 := templ.GetChildren(ctx)
125		if templ_7745c5c3_Var4 == nil {
126			templ_7745c5c3_Var4 = templ.NopComponent
127		}
128		ctx = templ.ClearChildren(ctx)
129		for _, r := range p.Rows {
130			templ_7745c5c3_Err = TreeRowView(r).Render(ctx, templ_7745c5c3_Buffer)
131			if templ_7745c5c3_Err != nil {
132				return templ_7745c5c3_Err
133			}
134		}
135		if p.More != "" {
136			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 7, "<tr class=\"tree-more\"><td colspan=\"7\"><a href=\"")
137			if templ_7745c5c3_Err != nil {
138				return templ_7745c5c3_Err
139			}
140			var templ_7745c5c3_Var5 templ.SafeURL
141			templ_7745c5c3_Var5, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.More))
142			if templ_7745c5c3_Err != nil {
143				return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/tree.templ`, Line: 61, Col: 71}
144			}
145			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var5))
146			if templ_7745c5c3_Err != nil {
147				return templ_7745c5c3_Err
148			}
149			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 8, "\">more entries: open the directory</a></td></tr>")
150			if templ_7745c5c3_Err != nil {
151				return templ_7745c5c3_Err
152			}
153		}
154		return nil
155	})
156}
157
158// TreeRowView is one entry of a directory. Glyph: ▸ directory (▾ once opened
159// in place), @ symbolic link, + submodule, · file. A directory link carries
160// data-expand, the URL of its rows.
161func TreeRowView(r TreeRow) templ.Component {
162	return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
163		templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
164		if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil {
165			return templ_7745c5c3_CtxErr
166		}
167		templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
168		if !templ_7745c5c3_IsBuffer {
169			defer func() {
170				templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer)
171				if templ_7745c5c3_Err == nil {
172					templ_7745c5c3_Err = templ_7745c5c3_BufErr
173				}
174			}()
175		}
176		ctx = templ.InitializeContext(ctx)
177		templ_7745c5c3_Var6 := templ.GetChildren(ctx)
178		if templ_7745c5c3_Var6 == nil {
179			templ_7745c5c3_Var6 = templ.NopComponent
180		}
181		ctx = templ.ClearChildren(ctx)
182		templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 9, "<tr")
183		if templ_7745c5c3_Err != nil {
184			return templ_7745c5c3_Err
185		}
186		if r.Cursor {
187			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 10, " data-cursor")
188			if templ_7745c5c3_Err != nil {
189				return templ_7745c5c3_Err
190			}
191		}
192		templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 11, "><td class=\"cur\" aria-hidden=\"true\"></td><td class=\"c-kind\" aria-hidden=\"true\">")
193		if templ_7745c5c3_Err != nil {
194			return templ_7745c5c3_Err
195		}
196		var templ_7745c5c3_Var7 string
197		templ_7745c5c3_Var7, templ_7745c5c3_Err = templ.JoinStringErrs(r.Glyph)
198		if templ_7745c5c3_Err != nil {
199			return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/tree.templ`, Line: 71, Col: 49}
200		}
201		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var7))
202		if templ_7745c5c3_Err != nil {
203			return templ_7745c5c3_Err
204		}
205		templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 12, "</td><td class=\"c-name\">")
206		if templ_7745c5c3_Err != nil {
207			return templ_7745c5c3_Err
208		}
209		if r.Href != "" {
210			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 13, "<a href=\"")
211			if templ_7745c5c3_Err != nil {
212				return templ_7745c5c3_Err
213			}
214			var templ_7745c5c3_Var8 templ.SafeURL
215			templ_7745c5c3_Var8, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(r.Href))
216			if templ_7745c5c3_Err != nil {
217				return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/tree.templ`, Line: 75, Col: 33}
218			}
219			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var8))
220			if templ_7745c5c3_Err != nil {
221				return templ_7745c5c3_Err
222			}
223			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 14, "\"")
224			if templ_7745c5c3_Err != nil {
225				return templ_7745c5c3_Err
226			}
227			if r.Expand != "" {
228				templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 15, " data-expand=\"")
229				if templ_7745c5c3_Err != nil {
230					return templ_7745c5c3_Err
231				}
232				var templ_7745c5c3_Var9 string
233				templ_7745c5c3_Var9, templ_7745c5c3_Err = templ.ResolveAttributeValue(r.Expand)
234				if templ_7745c5c3_Err != nil {
235					return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/tree.templ`, Line: 77, Col: 28}
236				}
237				_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var9)
238				if templ_7745c5c3_Err != nil {
239					return templ_7745c5c3_Err
240				}
241				templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 16, "\" aria-expanded=\"false\"")
242				if templ_7745c5c3_Err != nil {
243					return templ_7745c5c3_Err
244				}
245			}
246			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 17, ">")
247			if templ_7745c5c3_Err != nil {
248				return templ_7745c5c3_Err
249			}
250			var templ_7745c5c3_Var10 string
251			templ_7745c5c3_Var10, templ_7745c5c3_Err = templ.JoinStringErrs(r.Name)
252			if templ_7745c5c3_Err != nil {
253				return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/tree.templ`, Line: 80, Col: 13}
254			}
255			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var10))
256			if templ_7745c5c3_Err != nil {
257				return templ_7745c5c3_Err
258			}
259			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 18, "</a>")
260			if templ_7745c5c3_Err != nil {
261				return templ_7745c5c3_Err
262			}
263		} else {
264			var templ_7745c5c3_Var11 string
265			templ_7745c5c3_Var11, templ_7745c5c3_Err = templ.JoinStringErrs(r.Name)
266			if templ_7745c5c3_Err != nil {
267				return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/tree.templ`, Line: 82, Col: 12}
268			}
269			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var11))
270			if templ_7745c5c3_Err != nil {
271				return templ_7745c5c3_Err
272			}
273		}
274		templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 19, "</td><td class=\"c-size num dim\">")
275		if templ_7745c5c3_Err != nil {
276			return templ_7745c5c3_Err
277		}
278		var templ_7745c5c3_Var12 string
279		templ_7745c5c3_Var12, templ_7745c5c3_Err = templ.JoinStringErrs(r.Size)
280		if templ_7745c5c3_Err != nil {
281			return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/tree.templ`, Line: 85, Col: 37}
282		}
283		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var12))
284		if templ_7745c5c3_Err != nil {
285			return templ_7745c5c3_Err
286		}
287		templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 20, "</td><td class=\"c-sub dim\">")
288		if templ_7745c5c3_Err != nil {
289			return templ_7745c5c3_Err
290		}
291		if r.CHref != "" {
292			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 21, "<a href=\"")
293			if templ_7745c5c3_Err != nil {
294				return templ_7745c5c3_Err
295			}
296			var templ_7745c5c3_Var13 templ.SafeURL
297			templ_7745c5c3_Var13, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(r.CHref))
298			if templ_7745c5c3_Err != nil {
299				return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/tree.templ`, Line: 88, Col: 36}
300			}
301			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var13))
302			if templ_7745c5c3_Err != nil {
303				return templ_7745c5c3_Err
304			}
305			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 22, "\">")
306			if templ_7745c5c3_Err != nil {
307				return templ_7745c5c3_Err
308			}
309			var templ_7745c5c3_Var14 string
310			templ_7745c5c3_Var14, templ_7745c5c3_Err = templ.JoinStringErrs(r.Subject)
311			if templ_7745c5c3_Err != nil {
312				return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/tree.templ`, Line: 88, Col: 50}
313			}
314			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var14))
315			if templ_7745c5c3_Err != nil {
316				return templ_7745c5c3_Err
317			}
318			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 23, "</a>")
319			if templ_7745c5c3_Err != nil {
320				return templ_7745c5c3_Err
321			}
322		}
323		templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 24, "</td><td class=\"c-who dim\">")
324		if templ_7745c5c3_Err != nil {
325			return templ_7745c5c3_Err
326		}
327		var templ_7745c5c3_Var15 string
328		templ_7745c5c3_Var15, templ_7745c5c3_Err = templ.JoinStringErrs(r.Author)
329		if templ_7745c5c3_Err != nil {
330			return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/tree.templ`, Line: 91, Col: 34}
331		}
332		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var15))
333		if templ_7745c5c3_Err != nil {
334			return templ_7745c5c3_Err
335		}
336		templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 25, "</td><td class=\"c-when nowrap dim\">")
337		if templ_7745c5c3_Err != nil {
338			return templ_7745c5c3_Err
339		}
340		if r.WhenAt != "" {
341			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 26, "<time datetime=\"")
342			if templ_7745c5c3_Err != nil {
343				return templ_7745c5c3_Err
344			}
345			var templ_7745c5c3_Var16 string
346			templ_7745c5c3_Var16, templ_7745c5c3_Err = templ.ResolveAttributeValue(r.WhenAt)
347			if templ_7745c5c3_Err != nil {
348				return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/tree.templ`, Line: 94, Col: 29}
349			}
350			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var16)
351			if templ_7745c5c3_Err != nil {
352				return templ_7745c5c3_Err
353			}
354			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 27, "\" title=\"")
355			if templ_7745c5c3_Err != nil {
356				return templ_7745c5c3_Err
357			}
358			var templ_7745c5c3_Var17 string
359			templ_7745c5c3_Var17, templ_7745c5c3_Err = templ.ResolveAttributeValue(r.WhenAt)
360			if templ_7745c5c3_Err != nil {
361				return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/tree.templ`, Line: 94, Col: 48}
362			}
363			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var17)
364			if templ_7745c5c3_Err != nil {
365				return templ_7745c5c3_Err
366			}
367			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 28, "\">")
368			if templ_7745c5c3_Err != nil {
369				return templ_7745c5c3_Err
370			}
371			var templ_7745c5c3_Var18 string
372			templ_7745c5c3_Var18, templ_7745c5c3_Err = templ.JoinStringErrs(r.When)
373			if templ_7745c5c3_Err != nil {
374				return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/tree.templ`, Line: 94, Col: 59}
375			}
376			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var18))
377			if templ_7745c5c3_Err != nil {
378				return templ_7745c5c3_Err
379			}
380			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 29, "</time>")
381			if templ_7745c5c3_Err != nil {
382				return templ_7745c5c3_Err
383			}
384		}
385		templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 30, "</td></tr>")
386		if templ_7745c5c3_Err != nil {
387			return templ_7745c5c3_Err
388		}
389		return nil
390	})
391}
392
393var _ = templruntime.GeneratedTemplate

Keyboard shortcuts

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

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

Branches 4

Tags 45

↑↓ moveenter openesc close