v0.3.0 99dc266

recent_route_snapshot.go RawHistoryFolder

1package daemon
2
3import "github.com/bnema/vev/internal/ports"
4
5func recentRoutePresentationsFromSnapshot(snapshot ports.RecentRouteSnapshot) []recentRoutePresentation {
6	if snapshot.Entries == nil {
7		return nil
8	}
9	out := make([]recentRoutePresentation, len(snapshot.Entries))
10	for i, entry := range snapshot.Entries {
11		kind := recentRouteLocal
12		if entry.Kind == ports.RouteKindRemote {
13			kind = recentRouteRemote
14		}
15		out[i] = recentRoutePresentation{
16			name:      entry.Name,
17			hostLabel: entry.HostLabel,
18			kind:      kind,
19			ephemeral: entry.Ephemeral,
20			attention: entry.Attention,
21		}
22	}
23	return out
24}
25
26func formatRecentRouteSnapshot(snapshot ports.RecentRouteSnapshot) []recentRouteDisplay {
27	return formatRecentRoutePresentations(recentRoutePresentationsFromSnapshot(snapshot))
28}
29
30// formatRecentRouteSnapshotForAttachment resolves attention against this
31// daemon's live sessions. The client retains route ordering and presentation;
32// it subscribes only the exact routes this daemon serves.
33func (d *Daemon) formatRecentRouteSnapshotForAttachment(ac *attachedClient, snapshot ports.RecentRouteSnapshot) []recentRouteDisplay {
34	presentations := recentRoutePresentationsFromSnapshot(snapshot)
35	if d == nil || ac == nil {
36		return formatRecentRoutePresentations(presentations)
37	}
38	for i, entry := range snapshot.Entries {
39		target, ok := ac.routeAttentionTarget(ports.RouteRef{Key: entry.Key, Generation: entry.Generation})
40		if ok {
41			presentations[i].attention = d.routeHasAttention(target)
42		}
43	}
44	return formatRecentRoutePresentations(presentations)
45}
46
47func (d *Daemon) routeHasAttention(target ports.ExactSessionTarget) bool {
48	d.mu.Lock()
49	sess := d.findByNameLocked(target.SessionName)
50	d.mu.Unlock()
51	if sess == nil {
52		return false
53	}
54	sess.mu.Lock()
55	defer sess.mu.Unlock()
56	if sess.incarnation != target.LifecycleID {
57		return false
58	}
59	for _, tb := range sess.tabs {
60		if tb.attention {
61			return true
62		}
63	}
64	return false
65}

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 12

Tags 11

↑↓ moveenter openesc close