all repos

viye @ cf8a742f3ff269228ce7c0baf23fc0ea5b628cc7

my shot at reimplementing xiki

viye/internal/plumbing/gocli/gobin.go (view raw)

Oleksandr Smirnov Oleksandr Smirnov
olexsmir@gmail.com
rename gobin to gocli, 1 month ago
1
package gocli
2
3
import (
4
	"context"
5
	"os/exec"
6
7
	"github.com/olexsmir/viye/internal/viye"
8
)
9
10
const menu = `- build
11
- test
12
- run
13
- generate
14
- doc
15
+ mod/
16
`
17
18
const modMenu = `- tidy
19
- download
20
- verify
21
- init`
22
23
type Tool struct{}
24
25
func (Tool) Name() string               { return "go" }
26
func (Tool) Match(c *viye.Context) bool { return c.Cmd == "go" }
27
func (Tool) Execute(c *viye.Context) (string, error) {
28
	if len(c.Args) == 0 {
29
		return menu, nil
30
	}
31
32
	args := c.Args[1:]
33
	switch c.Args[0] {
34
	case "mod":
35
		if len(args) == 0 {
36
			return modMenu, nil
37
		}
38
	case "build", "test", "generate", "doc", "install", "run", "fmt", "vet", "clean", "env", "fix", "list", "tool", "version":
39
	default:
40
		return menu, nil
41
	}
42
43
	return runGo(c.Dir, c.Args[0], args...)
44
}
45
46
func runGo(dir, subcmd string, args ...string) (string, error) {
47
	ctx, cancel := context.WithTimeout(context.Background(), viye.Timeout)
48
	defer cancel()
49
50
	cmd := exec.CommandContext(ctx, "go", append([]string{subcmd}, args...)...)
51
	cmd.Dir = dir
52
	out, err := cmd.CombinedOutput()
53
	if err != nil && ctx.Err() == context.DeadlineExceeded {
54
		return "", viye.ErrTimeout
55
	}
56
	return viye.FormatOutput(out), nil
57
}