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 }