-
Notifications
You must be signed in to change notification settings - Fork 288
/
config.go
137 lines (113 loc) · 3.29 KB
/
config.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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
package config
import (
"fmt"
"path/filepath"
"github.com/pkg/errors"
"go.starlark.net/starlark"
"github.com/tilt-dev/tilt/internal/tiltfile/io"
"github.com/tilt-dev/tilt/internal/tiltfile/starkit"
"github.com/tilt-dev/tilt/pkg/model"
)
const UserConfigFileName = "tilt_config.json"
type Settings struct {
enabledResources []model.ManifestName
configDef ConfigDef
configParseCalled bool
userConfigState model.UserConfigState
// if parse has been called, the directory containing the Tiltfile that called it
seenWorkingDirectory string
}
type Extension struct {
UserConfigState model.UserConfigState
TiltSubcommand model.TiltSubcommand
}
func NewExtension(tiltSubcommand model.TiltSubcommand) *Extension {
return &Extension{TiltSubcommand: tiltSubcommand}
}
func (e *Extension) NewState() interface{} {
return Settings{
configDef: ConfigDef{configSettings: make(map[string]configSetting)},
userConfigState: e.UserConfigState,
}
}
var _ starkit.StatefulExtension = &Extension{}
func MustState(model starkit.Model) Settings {
state, err := GetState(model)
if err != nil {
panic(err)
}
return state
}
func GetState(m starkit.Model) (Settings, error) {
var state Settings
err := m.Load(&state)
return state, err
}
func (e *Extension) OnStart(env *starkit.Environment) error {
for _, b := range []struct {
name string
f starkit.Function
}{
{"config.set_enabled_resources", setEnabledResources},
{"config.parse", e.parse},
{"config.define_string_list", configSettingDefinitionBuiltin(func() configValue {
return &stringList{}
})},
{"config.define_string", configSettingDefinitionBuiltin(func() configValue {
return &stringSetting{}
})},
{"config.define_bool", configSettingDefinitionBuiltin(func() configValue {
return &boolSetting{}
})},
} {
err := env.AddBuiltin(b.name, b.f)
if err != nil {
return errors.Wrap(err, b.name)
}
}
err := env.AddValue("config.tilt_subcommand", starlark.String(e.TiltSubcommand))
return err
}
func (e *Extension) parse(thread *starlark.Thread, fn *starlark.Builtin, args starlark.Tuple, kwargs []starlark.Tuple) (starlark.Value, error) {
err := starkit.UnpackArgs(thread, fn.Name(), args, kwargs)
if err != nil {
return starlark.None, err
}
wd := starkit.AbsWorkingDir(thread)
err = starkit.SetState(thread, func(settings Settings) (Settings, error) {
if settings.seenWorkingDirectory != "" && settings.seenWorkingDirectory != wd {
return settings, fmt.Errorf(
"%s can only be called from one Tiltfile working directory per run. It was called from %s and %s",
fn.Name(),
settings.seenWorkingDirectory,
wd)
}
settings.seenWorkingDirectory = wd
settings.configParseCalled = true
return settings, nil
})
if err != nil {
return starlark.None, err
}
m, err := starkit.ModelFromThread(thread)
if err != nil {
return starlark.None, err
}
settings, err := GetState(m)
if err != nil {
return starlark.None, err
}
userConfigPath := filepath.Join(wd, UserConfigFileName)
err = io.RecordReadPath(thread, io.WatchFileOnly, userConfigPath)
if err != nil {
return starlark.None, err
}
ret, out, err := settings.configDef.parse(userConfigPath, e.UserConfigState.Args)
if out != "" {
thread.Print(thread, out)
}
if err != nil {
return starlark.None, err
}
return ret, nil
}