github.com/tilt-dev/tilt@v0.33.15-0.20240515162809-0a22ed45d8a0/pkg/model/local_target.go (about)

     1  package model
     2  
     3  import (
     4  	"fmt"
     5  
     6  	"github.com/tilt-dev/tilt/internal/sliceutils"
     7  	"github.com/tilt-dev/tilt/pkg/apis"
     8  	"github.com/tilt-dev/tilt/pkg/apis/core/v1alpha1"
     9  )
    10  
    11  type LocalTarget struct {
    12  	UpdateCmdSpec *v1alpha1.CmdSpec
    13  
    14  	Name     TargetName
    15  	ServeCmd Cmd      // e.g. `python main.py`
    16  	Links    []Link   // zero+ links assoc'd with this resource (to be displayed in UIs)
    17  	Deps     []string // a list of ABSOLUTE file paths that are dependencies of this target
    18  
    19  	FileWatchIgnores []v1alpha1.IgnoreDef
    20  
    21  	// Indicates that we should allow this to run in parallel with other
    22  	// resources  (by default, this is presumed unsafe and is not allowed).
    23  	AllowParallel bool
    24  
    25  	ReadinessProbe *v1alpha1.Probe
    26  
    27  	// Move this to CmdServerSpec when we move CmdServer to API
    28  	ServeCmdDisableSource *v1alpha1.DisableSource
    29  }
    30  
    31  var _ TargetSpec = LocalTarget{}
    32  
    33  func NewLocalTarget(name TargetName, updateCmd Cmd, serveCmd Cmd, deps []string) LocalTarget {
    34  	var updateCmdSpec *v1alpha1.CmdSpec
    35  	if !updateCmd.Empty() {
    36  		updateCmdSpec = &v1alpha1.CmdSpec{
    37  			Args: updateCmd.Argv,
    38  			Dir:  updateCmd.Dir,
    39  			Env:  updateCmd.Env,
    40  		}
    41  	}
    42  
    43  	return LocalTarget{
    44  		Name:          name,
    45  		UpdateCmdSpec: updateCmdSpec,
    46  		Deps:          deps,
    47  		ServeCmd:      serveCmd,
    48  	}
    49  }
    50  
    51  func (lt LocalTarget) WithIgnores(ignores []v1alpha1.IgnoreDef) LocalTarget {
    52  	lt.FileWatchIgnores = ignores
    53  	return lt
    54  }
    55  
    56  func (lt LocalTarget) GetFileWatchIgnores() []v1alpha1.IgnoreDef {
    57  	return lt.FileWatchIgnores
    58  }
    59  
    60  func (lt LocalTarget) UpdateCmdName() string {
    61  	if lt.UpdateCmdSpec == nil {
    62  		return ""
    63  	}
    64  	return apis.SanitizeName(fmt.Sprintf("%s:update", lt.ID().Name))
    65  }
    66  
    67  func (lt LocalTarget) Empty() bool {
    68  	return lt.UpdateCmdSpec == nil && lt.ServeCmd.Empty()
    69  }
    70  
    71  func (lt LocalTarget) WithAllowParallel(val bool) LocalTarget {
    72  	lt.AllowParallel = val
    73  	return lt
    74  }
    75  
    76  func (lt LocalTarget) WithLinks(links []Link) LocalTarget {
    77  	lt.Links = links
    78  	return lt
    79  }
    80  
    81  func (lt LocalTarget) WithReadinessProbe(probeSpec *v1alpha1.Probe) LocalTarget {
    82  	lt.ReadinessProbe = probeSpec
    83  	return lt
    84  }
    85  
    86  func (lt LocalTarget) ID() TargetID {
    87  	return TargetID{
    88  		Name: lt.Name,
    89  		Type: TargetTypeLocal,
    90  	}
    91  }
    92  
    93  func (lt LocalTarget) DependencyIDs() []TargetID {
    94  	return nil
    95  }
    96  
    97  func (lt LocalTarget) Validate() error {
    98  	if lt.UpdateCmdSpec != nil && lt.UpdateCmdSpec.Dir == "" {
    99  		return fmt.Errorf("[Validate] LocalTarget cmd missing workdir")
   100  	}
   101  	if !lt.ServeCmd.Empty() && lt.ServeCmd.Dir == "" {
   102  		return fmt.Errorf("[Validate] LocalTarget serve_cmd missing workdir")
   103  	}
   104  	return nil
   105  }
   106  
   107  // Implements: engine.WatchableManifest
   108  func (lt LocalTarget) Dependencies() []string {
   109  	return sliceutils.DedupedAndSorted(lt.Deps)
   110  }