github.com/tilt-dev/tilt@v0.33.15-0.20240515162809-0a22ed45d8a0/internal/tiltfile/version/version.go (about) 1 package version 2 3 import ( 4 "fmt" 5 6 "github.com/blang/semver" 7 "github.com/pkg/errors" 8 "go.starlark.net/starlark" 9 10 "github.com/tilt-dev/tilt/internal/tiltfile/starkit" 11 "github.com/tilt-dev/tilt/pkg/model" 12 ) 13 14 type Plugin struct { 15 tiltVersion string 16 } 17 18 func NewPlugin(tiltBuild model.TiltBuild) Plugin { 19 return Plugin{ 20 tiltVersion: tiltBuild.Version, 21 } 22 } 23 24 func (e Plugin) NewState() interface{} { 25 return model.VersionSettings{ 26 CheckUpdates: true, 27 } 28 } 29 30 func (e Plugin) OnStart(env *starkit.Environment) error { 31 return env.AddBuiltin("version_settings", e.setVersionSettings) 32 } 33 34 func (e Plugin) setVersionSettings(thread *starlark.Thread, fn *starlark.Builtin, args starlark.Tuple, kwargs []starlark.Tuple) (starlark.Value, error) { 35 var constraint string 36 37 err := starkit.SetState(thread, func(settings model.VersionSettings) (model.VersionSettings, error) { 38 if err := starkit.UnpackArgs(thread, fn.Name(), args, kwargs, 39 "check_updates?", &settings.CheckUpdates, 40 "constraint?", &constraint, 41 ); err != nil { 42 return settings, err 43 } 44 return settings, nil 45 }) 46 47 if constraint != "" { 48 ver, err := semver.Parse(e.tiltVersion) 49 if err != nil { 50 return nil, errors.Wrapf(err, "internal error parsing tilt version '%s'", e.tiltVersion) 51 } 52 rng, err := semver.ParseRange(constraint) 53 if err != nil { 54 return nil, errors.Wrapf(err, "error parsing version constraint") 55 } 56 if !rng(ver) { 57 return nil, fmt.Errorf("you are running Tilt version %s, which doesn't match the version constraint specified in your Tiltfile: '%s'", e.tiltVersion, constraint) 58 } 59 } 60 61 return starlark.None, err 62 } 63 64 var _ starkit.StatefulPlugin = Plugin{} 65 66 func MustState(model starkit.Model) model.VersionSettings { 67 state, err := GetState(model) 68 if err != nil { 69 panic(err) 70 } 71 return state 72 } 73 74 func GetState(m starkit.Model) (model.VersionSettings, error) { 75 var state model.VersionSettings 76 err := m.Load(&state) 77 return state, err 78 }