v0.3.0 9fdf386

export_test.go RawHistoryFolder

1// SPDX-License-Identifier: AGPL-3.0-or-later
2
3package gitcli
4
5import "sort"
6
7// CatFilePIDs returns the process ids of the live long-lived cat-file
8// processes, for the tests of the pool.
9func (g *Git) CatFilePIDs() []int {
10	g.cat.mu.Lock()
11	defer g.cat.mu.Unlock()
12	var pids []int
13	for _, cp := range g.cat.procs {
14		pids = append(pids, cp.cmd.Process.Pid)
15	}
16	sort.Ints(pids)
17	return pids
18}
19
20// BlobStreams returns the number of blob streams that are open.
21func (g *Git) BlobStreams() int {
22	g.cat.mu.Lock()
23	defer g.cat.mu.Unlock()
24	return len(g.cat.streams)
25}
26
27// BlobStreamPIDs returns the process ids of the open blob streams.
28func (g *Git) BlobStreamPIDs() []int {
29	g.cat.mu.Lock()
30	defer g.cat.mu.Unlock()
31	var pids []int
32	for s := range g.cat.streams {
33		pids = append(pids, s.cmd.Process.Pid)
34	}
35	return pids
36}
37
38// FireIdleTimers runs, for every idle cat-file process, what its idle timer
39// would do now, so that tests do not wait for real time.
40func (g *Git) FireIdleTimers() {
41	g.cat.mu.Lock()
42	type armed struct {
43		cp  *catProc
44		gen uint64
45	}
46	var all []armed
47	for _, cp := range g.cat.procs {
48		all = append(all, armed{cp, cp.gen})
49	}
50	g.cat.mu.Unlock()
51	for _, a := range all {
52		g.cat.expire(a.cp, a.gen)
53	}
54}
55
56// FireStaleIdleTimers runs what the idle timers armed before the last use of
57// each process would do: nothing, since the process was used since.
58func (g *Git) FireStaleIdleTimers() {
59	g.cat.mu.Lock()
60	type armed struct {
61		cp  *catProc
62		gen uint64
63	}
64	var all []armed
65	for _, cp := range g.cat.procs {
66		all = append(all, armed{cp, cp.gen - 1})
67	}
68	g.cat.mu.Unlock()
69	for _, a := range all {
70		g.cat.expire(a.cp, a.gen)
71	}
72}
73
74// ExecSlots returns the size of the one-shot process semaphore and how many
75// slots are taken.
76func (g *Git) ExecSlots() (size, taken int) { return cap(g.exec), len(g.exec) }

Keyboard shortcuts

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

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

Branches 2

Tags 45

↑↓ moveenter openesc close