-
Notifications
You must be signed in to change notification settings - Fork 38
/
Copy pathscript.go
70 lines (60 loc) · 1.58 KB
/
script.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
package script
import (
"context"
"fmt"
"path/filepath"
"github.com/pkg/errors"
"github.com/spf13/afero"
"go.uber.org/zap"
"github.com/izumin5210/clig/pkg/clib"
"github.com/izumin5210/execx"
"github.com/izumin5210/grapi/pkg/grapicmd/util/fs"
)
type script struct {
fs afero.Fs
io *clib.IO
exec *execx.Executor
rootDir string
name, binPath string
srcPaths []string
}
func (s *script) Name() string {
return s.name
}
func (s *script) Build(ctx context.Context, args ...string) error {
zap.L().Debug("build script", zap.String("name", s.name), zap.String("bin", s.binPath), zap.Strings("srcs", s.srcPaths))
err := fs.CreateDirIfNotExists(s.fs, filepath.Dir(s.binPath))
if err != nil {
return errors.WithStack(err)
}
cmd := s.exec.CommandContext(ctx, "go", s.buildArgs(args)...)
cmd.Dir = s.rootDir
cmd.Stdout = s.io.Out
cmd.Stderr = s.io.Err
cmd.Stdin = s.io.In
err = cmd.Run()
if err != nil {
return errors.Wrapf(err, "failed to build %v", s.srcPaths)
}
return nil
}
func (s *script) Run(ctx context.Context, args ...string) error {
cmd := s.exec.CommandContext(ctx, s.binPath, args...)
cmd.Dir = s.rootDir
cmd.Stdout = s.io.Out
cmd.Stderr = s.io.Err
cmd.Stdin = s.io.In
err := cmd.Run()
fmt.Println(err)
if err == context.Canceled {
return nil
}
return errors.WithStack(err)
}
func (s *script) buildArgs(args []string) []string {
built := make([]string, 0, 3+len(args)+len(s.srcPaths))
built = append(built, "build", "-o="+s.binPath)
built = append(built, args...)
built = append(built, s.srcPaths...)
return built
}