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  }