github.com/grahambrereton-form3/tilt@v0.10.18/internal/ignore/path_matcher.go (about)

     1  package ignore
     2  
     3  import (
     4  	"context"
     5  	"path/filepath"
     6  
     7  	"github.com/pkg/errors"
     8  
     9  	"github.com/windmilleng/tilt/internal/dockerignore"
    10  	"github.com/windmilleng/tilt/internal/git"
    11  	"github.com/windmilleng/tilt/internal/ospath"
    12  	"github.com/windmilleng/tilt/pkg/model"
    13  )
    14  
    15  type repoTarget interface {
    16  	LocalRepos() []model.LocalGitRepo
    17  	Dockerignores() []model.Dockerignore
    18  	TiltFilename() string
    19  }
    20  
    21  // Filter out files that should not be included in the build context.
    22  func CreateBuildContextFilter(m repoTarget) model.PathMatcher {
    23  	matchers := []model.PathMatcher{}
    24  	if m.TiltFilename() != "" {
    25  		m, err := model.NewSimpleFileMatcher(m.TiltFilename())
    26  		if err == nil {
    27  			matchers = append(matchers, m)
    28  		}
    29  	}
    30  	for _, r := range m.LocalRepos() {
    31  		matchers = append(matchers, git.NewRepoIgnoreTester(context.Background(), r.LocalPath))
    32  	}
    33  	for _, r := range m.Dockerignores() {
    34  		dim, err := dockerignore.DockerIgnoreTesterFromContents(r.LocalPath, r.Contents)
    35  		if err == nil {
    36  			matchers = append(matchers, dim)
    37  		}
    38  	}
    39  
    40  	return model.NewCompositeMatcher(matchers)
    41  }
    42  
    43  type IgnorableTarget interface {
    44  	LocalRepos() []model.LocalGitRepo
    45  	Dockerignores() []model.Dockerignore
    46  
    47  	// These directories and their children will not trigger file change events
    48  	IgnoredLocalDirectories() []string
    49  }
    50  
    51  // Filter out files that should not trigger new builds.
    52  func CreateFileChangeFilter(m IgnorableTarget) (model.PathMatcher, error) {
    53  	matchers := []model.PathMatcher{}
    54  	for _, r := range m.LocalRepos() {
    55  		matchers = append(matchers, git.NewRepoIgnoreTester(context.Background(), r.LocalPath))
    56  	}
    57  	for _, di := range m.Dockerignores() {
    58  		dim, err := dockerignore.DockerIgnoreTesterFromContents(di.LocalPath, di.Contents)
    59  		if err == nil {
    60  			matchers = append(matchers, dim)
    61  		}
    62  	}
    63  	for _, p := range m.IgnoredLocalDirectories() {
    64  		dm, err := newDirectoryMatcher(p)
    65  		if err != nil {
    66  			return nil, errors.Wrap(err, "creating directory matcher")
    67  		}
    68  		matchers = append(matchers, dm)
    69  	}
    70  
    71  	matchers = append(matchers, ephemeralPathMatcher)
    72  
    73  	return model.NewCompositeMatcher(matchers), nil
    74  }
    75  
    76  func CreateRunMatcher(r model.Run) (model.PathMatcher, error) {
    77  	dim, err := dockerignore.NewDockerPatternMatcher(r.Triggers.BaseDirectory, r.Triggers.Paths)
    78  	if err != nil {
    79  		return nil, err
    80  	}
    81  
    82  	return dim, nil
    83  }
    84  
    85  type directoryMatcher struct {
    86  	dir string
    87  }
    88  
    89  var _ model.PathMatcher = directoryMatcher{}
    90  
    91  func newDirectoryMatcher(dir string) (directoryMatcher, error) {
    92  	dir, err := filepath.Abs(dir)
    93  	if err != nil {
    94  		return directoryMatcher{}, errors.Wrapf(err, "failed to get abs path of '%s'", dir)
    95  	}
    96  	return directoryMatcher{dir}, nil
    97  }
    98  
    99  func (d directoryMatcher) Matches(p string) (bool, error) {
   100  	return ospath.IsChild(d.dir, p), nil
   101  }
   102  
   103  func (d directoryMatcher) MatchesEntireDir(p string) (bool, error) {
   104  	return d.Matches(p)
   105  }