coalescer.go RawHistoryFolder

1package mainloop
2
3import "sync"
4
5// Coalescer merges bursts of same-key main-loop tasks.
6type Coalescer struct {
7	mu        sync.Mutex
8	pending   map[string]bool
9	callbacks map[string]func()
10	post      func(func())
11	destroyed bool
12}
13
14func NewCoalescer(post func(func())) *Coalescer {
15	if post == nil {
16		panic("mainloop.NewCoalescer: post function cannot be nil")
17	}
18
19	return &Coalescer{
20		pending:   make(map[string]bool),
21		callbacks: make(map[string]func()),
22		post:      post,
23	}
24}
25
26func (c *Coalescer) Post(key string, fn func()) {
27	if fn == nil || key == "" {
28		return
29	}
30
31	c.mu.Lock()
32	if c.destroyed {
33		c.mu.Unlock()
34		return
35	}
36	c.callbacks[key] = fn
37	if c.pending[key] {
38		c.mu.Unlock()
39		return
40	}
41	c.pending[key] = true
42	post := c.post
43	c.mu.Unlock()
44
45	post(func() {
46		c.mu.Lock()
47		if c.destroyed {
48			delete(c.pending, key)
49			delete(c.callbacks, key)
50			c.mu.Unlock()
51			return
52		}
53		fn := c.callbacks[key]
54		delete(c.pending, key)
55		delete(c.callbacks, key)
56		c.mu.Unlock()
57
58		if fn != nil {
59			fn()
60		}
61	})
62}
63
64func (c *Coalescer) Destroy() {
65	c.mu.Lock()
66	c.destroyed = true
67	c.pending = map[string]bool{}
68	c.callbacks = map[string]func(){}
69	c.mu.Unlock()
70}

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 8

Tags 42

↑↓ moveenter openesc close