diff --git a/pkg/fsutils/path_resolver.go b/pkg/fsutils/path_resolver.go index 3e826bfdb07f..c5a8669f0758 100644 --- a/pkg/fsutils/path_resolver.go +++ b/pkg/fsutils/path_resolver.go @@ -184,5 +184,21 @@ func (pr PathResolver) Resolve(paths ...string) (*PathResolveResult, error) { state.addFile(path) } + state.excludeDirsWithoutGoFiles() + return state.toResult(), nil } + +func (s *pathResolveState) excludeDirsWithoutGoFiles() { + dirToFiles := map[string]bool{} + for f := range s.files { + dir := filepath.Dir(f) + dirToFiles[dir] = true + } + + for dir := range s.dirs { + if !dirToFiles[dir] { // no go files in this dir + delete(s.dirs, dir) + } + } +} diff --git a/pkg/fsutils/path_resolver_test.go b/pkg/fsutils/path_resolver_test.go index e8cb4c5157cf..bd8e5c22ff23 100644 --- a/pkg/fsutils/path_resolver_test.go +++ b/pkg/fsutils/path_resolver_test.go @@ -84,30 +84,27 @@ func TestPathResolverCommonCases(t *testing.T) { { name: "empty root recursively", resolve: []string{"./..."}, - expDirs: []string{"."}, }, { name: "empty root", resolve: []string{"./"}, - expDirs: []string{"."}, }, { name: "vendor is excluded recursively", - prepare: []string{"vendor/a/"}, + prepare: []string{"vendor/a/b.go"}, resolve: []string{"./..."}, - expDirs: []string{"."}, }, { name: "vendor is excluded", - prepare: []string{"vendor/"}, + prepare: []string{"vendor/a.go"}, resolve: []string{"./..."}, - expDirs: []string{"."}, }, { - name: "vendor implicitely resolved", - prepare: []string{"vendor/"}, - resolve: []string{"./vendor"}, - expDirs: []string{"vendor"}, + name: "vendor implicitely resolved", + prepare: []string{"vendor/a.go"}, + resolve: []string{"./vendor"}, + expDirs: []string{"vendor"}, + expFiles: []string{"vendor/a.go"}, }, { name: "extensions filter recursively", @@ -125,7 +122,7 @@ func TestPathResolverCommonCases(t *testing.T) { }, { name: "one level dirs exclusion", - prepare: []string{"a/b/", "a/c.go"}, + prepare: []string{"a/b/d.go", "a/c.go"}, resolve: []string{"./a"}, expDirs: []string{"a"}, expFiles: []string{"a/c.go"}, @@ -138,28 +135,27 @@ func TestPathResolverCommonCases(t *testing.T) { expFiles: []string{"a/b/c.go", "a/d.txt"}, }, { - name: ".* is always ignored", + name: ".* dotfiles are always ignored", prepare: []string{".git/a.go", ".circleci/b.go"}, resolve: []string{"./..."}, - expDirs: []string{"."}, }, { - name: "exclude dirs on any depth level", - prepare: []string{"ok/.git/a.go"}, - resolve: []string{"./..."}, - expDirs: []string{".", "ok"}, + name: "exclude dirs on any depth level", + prepare: []string{"ok/.git/a.go", "ok/b.go"}, + resolve: []string{"./..."}, + expDirs: []string{"ok"}, + expFiles: []string{"ok/b.go"}, }, { name: "ignore _*", prepare: []string{"_any/a.go"}, resolve: []string{"./..."}, - expDirs: []string{"."}, }, { name: "include tests", prepare: []string{"a/b.go", "a/b_test.go"}, resolve: []string{"./..."}, - expDirs: []string{".", "a"}, + expDirs: []string{"a"}, expFiles: []string{"a/b.go", "a/b_test.go"}, includeTests: true, }, @@ -167,16 +163,30 @@ func TestPathResolverCommonCases(t *testing.T) { name: "exclude tests", prepare: []string{"a/b.go", "a/b_test.go"}, resolve: []string{"./..."}, - expDirs: []string{".", "a"}, + expDirs: []string{"a"}, expFiles: []string{"a/b.go"}, }, { name: "exclude tests except explicitly set", prepare: []string{"a/b.go", "a/b_test.go", "a/c_test.go"}, resolve: []string{"./...", "a/c_test.go"}, - expDirs: []string{".", "a"}, + expDirs: []string{"a"}, expFiles: []string{"a/b.go", "a/c_test.go"}, }, + { + name: "exclude dirs with no go files", + prepare: []string{"a/b.txt", "a/c/d.go"}, + resolve: []string{"./..."}, + expDirs: []string{"a/c"}, + expFiles: []string{"a/c/d.go"}, + }, + { + name: "exclude dirs with no go files with root dir", + prepare: []string{"a/b.txt", "a/c/d.go", "e.go"}, + resolve: []string{"./..."}, + expDirs: []string{".", "a/c"}, + expFiles: []string{"a/c/d.go", "e.go"}, + }, } for _, tc := range testCases {