v0.5.1 25d29f5

gate.go RawHistoryFolder

1// SPDX-License-Identifier: MIT
2
3package sandbox
4
5import (
6	"context"
7	"errors"
8	"sync"
9)
10
11// BootGate lets Stop abort a Start in progress. Start holds the sandbox's own
12// mutex for the whole boot (up to the boot timeout), so Stop could otherwise
13// only wait for it; with a gate, Stop first calls Abort, which cancels the
14// context Start runs its boot with, and then takes the mutex.
15type BootGate struct {
16	mu      sync.Mutex
17	cancel  context.CancelFunc
18	aborted bool
19}
20
21// ErrAborted is the cause of a boot cancelled by Stop.
22var ErrAborted = errors.New("sandbox: start aborted by Stop")
23
24// Begin returns the context to boot with: parent, cancelled by Abort. It fails
25// when Abort was already called (Stop before Start).
26func (g *BootGate) Begin(parent context.Context) (context.Context, error) {
27	g.mu.Lock()
28	defer g.mu.Unlock()
29	if g.aborted {
30		return nil, ErrAborted
31	}
32	ctx, cancel := context.WithCancelCause(parent)
33	g.cancel = func() { cancel(ErrAborted) }
34	return ctx, nil
35}
36
37// End must be called when the boot finished, successfully or not.
38func (g *BootGate) End() {
39	g.mu.Lock()
40	defer g.mu.Unlock()
41	if g.cancel != nil {
42		g.cancel()
43		g.cancel = nil
44	}
45}
46
47// Abort cancels a boot in progress and forbids a later Begin. It never blocks.
48func (g *BootGate) Abort() {
49	g.mu.Lock()
50	defer g.mu.Unlock()
51	g.aborted = true
52	if g.cancel != nil {
53		g.cancel()
54	}
55}

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 11

↑↓ moveenter openesc close