v0.1.0 602baa7

xerror.go RawHistoryFolder

1package xturbo
2
3import (
4	"encoding/binary"
5	"fmt"
6)
7
8// XError is an X protocol error, passed by value (no interface on the hot path).
9type XError struct {
10	Seq   Seq
11	Code  uint8  // wire error code
12	Ext   ExtID  // ExtCore for codes < 128 or unknown
13	Rel   uint8  // Code - FirstError of Ext
14	Bad   uint32 // bad resource/value
15	Minor uint16
16	Major uint8
17	Kind  uint16 // ring slot kind, 0 when the request was not registered
18	Args  [4]uint32
19	Raw   [32]byte
20}
21
22// Error formats the error. It allocates: use it for logging only.
23func (e *XError) Error() string {
24	ext := "core"
25	if e.Ext != ExtCore && e.Ext < extCount {
26		ext = ExtXName[e.Ext]
27	}
28	return fmt.Sprintf("xturbo: X error code %d (%s rel %d) seq %d major %d minor %d bad 0x%x kind %d",
29		e.Code, ext, e.Rel, e.Seq, e.Major, e.Minor, e.Bad, e.Kind)
30}
31
32// decodeError fills e from a 32-byte error packet (raw[0] == 0). Seq is the
33// 16-bit wire value; Kind/Args are left for the reply ring. Extension codes
34// resolve through ext; a nil ext or unknown code leaves Ext=ExtCore, Rel=Code.
35func decodeError(raw []byte, ext *ExtTable, e *XError) bool {
36	if len(raw) < 32 || raw[0] != 0 {
37		return false
38	}
39	*e = XError{
40		Seq:   Seq(binary.LittleEndian.Uint16(raw[2:])),
41		Code:  raw[1],
42		Rel:   raw[1],
43		Bad:   binary.LittleEndian.Uint32(raw[4:]),
44		Minor: binary.LittleEndian.Uint16(raw[8:]),
45		Major: raw[10],
46	}
47	copy(e.Raw[:], raw[:32])
48	if ext != nil && e.Code >= 128 {
49		if id, rel, ok := ext.ByError(e.Code); ok {
50			e.Ext, e.Rel = id, rel
51		}
52	}
53	return true
54}

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 1

Tags 1

↑↓ moveenter openesc close