fix/exec-umask 2cd66dc

resolver.go RawHistoryFolder

1// SPDX-License-Identifier: MIT
2
3package guest
4
5import (
6	"context"
7	"errors"
8	"sync"
9
10	"bnema.dev/ermite-runner/internal/execstream"
11	"bnema.dev/ermite-runner/internal/execstream/execpb"
12	"bnema.dev/ermite-runner/internal/executor"
13)
14
15// resolver sends ResolveRequest frames to the host and matches the
16// ResolveResponse frames that come back (the job token stays in the host).
17type resolver struct {
18	conn *execstream.Conn
19	mu   sync.Mutex
20	next int64
21	wait map[int64]chan *execpb.ResolveResponse
22}
23
24func newResolver(conn *execstream.Conn) *resolver {
25	return &resolver{conn: conn, wait: map[int64]chan *execpb.ResolveResponse{}}
26}
27
28func (r *resolver) deliver(resp *execpb.ResolveResponse) {
29	r.mu.Lock()
30	ch := r.wait[resp.Id]
31	delete(r.wait, resp.Id)
32	r.mu.Unlock()
33	if ch != nil {
34		ch <- resp
35	}
36}
37
38// resolve is executor.Config.Resolver.
39func (r *resolver) resolve(ctx context.Context, uses []string) ([]executor.ResolvedAction, error) {
40	ch := make(chan *execpb.ResolveResponse, 1)
41	r.mu.Lock()
42	r.next++
43	id := r.next
44	r.wait[id] = ch
45	r.mu.Unlock()
46	forget := func() { r.mu.Lock(); delete(r.wait, id); r.mu.Unlock() }
47	req := &execpb.ResolveRequest{Id: id, Uses: uses}
48	if err := r.conn.Send(&execpb.Frame{Body: &execpb.Frame_ResolveRequest{ResolveRequest: req}}); err != nil {
49		forget()
50		return nil, err
51	}
52	select {
53	case resp := <-ch:
54		if resp.Error != "" {
55			return nil, errors.New(resp.Error)
56		}
57		out := make([]executor.ResolvedAction, len(resp.Actions))
58		for i, a := range resp.Actions {
59			out[i] = executor.ResolvedAction{
60				Ref: a.Ref, NameWithOwner: a.NameWithOwner, Path: a.Path, ResolvedSHA: a.ResolvedSha,
61				TarballURL: a.TarballUrl, Token: a.Token, AuthOrigin: a.AuthOrigin, Error: a.Error,
62			}
63		}
64		return out, nil
65	case <-ctx.Done():
66		forget()
67		return nil, ctx.Err()
68	}
69}

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