Documentation
¶
Overview ¶
Package shell is the binary's door to every external command that is not git: a tracker CLI, a project's driver, a pager, an editor, the OS opener. gitx stays separate because its reads mirror bin/f10-load-project.sh's git calls; this is everything that script never runs.
Both entry points are variables so tests can substitute them - nothing here should launch a browser or block on a pager during `go test`.
Index ¶
Constants ¶
This section is empty.
Variables ¶
var Capture = func(ctx context.Context, dir, name string, args ...string) (Result, error) { cmd := exec.CommandContext(ctx, name, args...) cmd.Dir = dir var stdout, stderr strings.Builder cmd.Stdout = &stdout cmd.Stderr = &stderr err := cmd.Run() res := Result{ Stdout: strings.TrimRight(stdout.String(), "\n"), Stderr: strings.TrimSpace(stderr.String()), } if exitErr, ok := errors.AsType[*exec.ExitError](err); ok { res.Code = exitErr.ExitCode() return res, nil } return res, err }
Capture runs name in dir and collects its output. A non-zero exit is a Result, not an error: the driver contract reserves an exit code with a meaning, so classifying codes belongs to the caller. Only a command that could not start at all is an error here.
Has reports whether name is on PATH.
var Passthrough = func(ctx context.Context, dir, name string, args ...string) error { cmd := exec.CommandContext(ctx, name, args...) cmd.Dir = dir cmd.Stdin, cmd.Stdout, cmd.Stderr = os.Stdin, os.Stdout, os.Stderr return cmd.Run() }
Passthrough runs name in dir wired straight to this process's streams. A pager, an editor and `gh --web` all want the terminal, not a buffer.
var Pipe = func(ctx context.Context, dir, input, name string, args ...string) error { cmd := exec.CommandContext(ctx, name, args...) cmd.Dir = dir cmd.Stdin = strings.NewReader(input) cmd.Stdout, cmd.Stderr = os.Stdout, os.Stderr return cmd.Run() }
Pipe runs name with input on its stdin and this process's terminal on its output - what a pager needs, and the one case where f10 both holds the text and wants someone else to display it.