From b2484925496a4146c484637882120b9aa70ca90d Mon Sep 17 00:00:00 2001 From: LandonTClipp Date: Tue, 19 Dec 2023 13:43:10 -0600 Subject: [PATCH] Don't recurse into submodules on `recursive: true` This PR changes mockery to not recurse into paths that contain a `go.mod` submodule. This is to help support monorepos that contain many modules. In this case, mockery should not be recursing into these because it causes issues, like in issue #706. fix deprecations in mkdocs remove explicit lint step --- .github/workflows/golangci-lint.yml | 27 ------------------- .github/workflows/testing.yml | 2 +- go.mod | 6 +++-- go.sum | 5 ++-- go.work | 5 +++- mkdocs.yml | 4 +-- pkg/config/config.go | 27 ++++++++++++++----- pkg/config/config_test.go | 21 +++++++++++++++ .../pkg_with_submodules/go.mod | 3 +++ .../pkg_with_submodules/string.go | 5 ++++ .../pkg_with_submodules/submodule/go.mod | 3 +++ .../pkg_with_submodules/submodule/string.go | 5 ++++ .../pkg_with_submodules/subpkg/string.go | 5 ++++ .../subpkg/submodule/go.mod | 3 +++ .../subpkg/submodule/string.go | 5 ++++ 15 files changed, 85 insertions(+), 41 deletions(-) delete mode 100644 .github/workflows/golangci-lint.yml create mode 100644 pkg/fixtures/example_project/pkg_with_submodules/go.mod create mode 100644 pkg/fixtures/example_project/pkg_with_submodules/string.go create mode 100644 pkg/fixtures/example_project/pkg_with_submodules/submodule/go.mod create mode 100644 pkg/fixtures/example_project/pkg_with_submodules/submodule/string.go create mode 100644 pkg/fixtures/example_project/pkg_with_submodules/subpkg/string.go create mode 100644 pkg/fixtures/example_project/pkg_with_submodules/subpkg/submodule/go.mod create mode 100644 pkg/fixtures/example_project/pkg_with_submodules/subpkg/submodule/string.go diff --git a/.github/workflows/golangci-lint.yml b/.github/workflows/golangci-lint.yml deleted file mode 100644 index aaf774d9..00000000 --- a/.github/workflows/golangci-lint.yml +++ /dev/null @@ -1,27 +0,0 @@ -name: golangci-lint -on: - push: - tags: - - v* - branches: - - master - - main - pull_request: -permissions: - contents: read - # Optional: allow read access to pull request. Use with `only-new-issues` option. - # pull-requests: read -jobs: - golangci: - name: lint - runs-on: ubuntu-latest - steps: - - uses: actions/setup-go@v4 - with: - go-version: '1.19' - cache: false - - uses: actions/checkout@v3 - - name: golangci-lint - uses: golangci/golangci-lint-action@v3 - with: - version: v1.52.2 \ No newline at end of file diff --git a/.github/workflows/testing.yml b/.github/workflows/testing.yml index 8941560a..0be67713 100644 --- a/.github/workflows/testing.yml +++ b/.github/workflows/testing.yml @@ -12,7 +12,7 @@ jobs: strategy: matrix: os: [ macos-latest, ubuntu-latest] - go_vers: ['1.20'] + go_vers: ['1.21'] steps: - uses: actions/checkout@v2 with: diff --git a/go.mod b/go.mod index 0a52d015..dfff32d1 100644 --- a/go.mod +++ b/go.mod @@ -1,9 +1,11 @@ module github.com/vektra/mockery/v2 -go 1.19 +go 1.21 + +toolchain go1.21.0 require ( - github.com/chigopher/pathlib v0.15.0 + github.com/chigopher/pathlib v0.19.1 github.com/davecgh/go-spew v1.1.1 github.com/huandu/xstrings v1.4.0 github.com/iancoleman/strcase v0.2.0 diff --git a/go.sum b/go.sum index e6962530..83f27ae0 100644 --- a/go.sum +++ b/go.sum @@ -39,8 +39,8 @@ dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7 github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/chigopher/pathlib v0.15.0 h1:1pg96WL3iC1/YyWV4UJSl3E0GBf4B+h5amBtsbAAieY= -github.com/chigopher/pathlib v0.15.0/go.mod h1:3+YPPV21mU9vyw8Mjp+F33CyCfE6iOzinpiqBcccv7I= +github.com/chigopher/pathlib v0.19.1 h1:RoLlUJc0CqBGwq239cilyhxPNLXTK+HXoASGyGznx5A= +github.com/chigopher/pathlib v0.19.1/go.mod h1:tzC1dZLW8o33UQpWkNkhvPwL5n4yyFRFm/jL1YGWFvY= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= @@ -310,6 +310,7 @@ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= diff --git a/go.work b/go.work index 74637646..59b494ce 100644 --- a/go.work +++ b/go.work @@ -1,6 +1,9 @@ -go 1.19 +go 1.21 + +toolchain go1.21.0 use ( . + ./pkg/fixtures/example_project/pkg_with_submodules ./tools ) diff --git a/mkdocs.yml b/mkdocs.yml index b614a716..c63323e4 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -40,8 +40,8 @@ markdown_extensions: - attr_list - md_in_html - pymdownx.emoji: - emoji_index: !!python/name:materialx.emoji.twemoji - emoji_generator: !!python/name:materialx.emoji.to_svg + emoji_index: !!python/name:material.extensions.emoji.twemoji + emoji_generator: !!python/name:material.extensions.emoji.to_svg - pymdownx.details - pymdownx.highlight: anchor_linenums: true diff --git a/pkg/config/config.go b/pkg/config/config.go index c709f4ba..2152d662 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -558,7 +558,7 @@ func (c *Config) subPackages( walker, err := pathlib.NewWalk( searchRoot, - pathlib.WalkAlgorithm(pathlib.AlgorithmBasic), + pathlib.WalkAlgorithm(pathlib.AlgorithmPreOrderDepthFirst), pathlib.WalkFollowSymlinks(false), pathlib.WalkVisitDirs(false), pathlib.WalkVisitFiles(true), @@ -575,12 +575,28 @@ func (c *Config) subPackages( visitedDirs[searchRoot.String()] = nil // Walk the filesystem path, starting at the root of the package we've - // been given. Note that this will always work because Golang downloads + // been given. Note that this will always work because Go downloads // the package when we call `packages.Load` walkErr := walker.Walk(func(path *pathlib.Path, info os.FileInfo, err error) error { + pathLog := log.With().Stringer("path", path).Logger() if err != nil { return err } + if path.Name() == "go.mod" { + pathLog.Debug().Msg("path contains go.mod file") + // Check if our current depth is 0. We do this to skip sub-modules, but not + // the root module. + relative, err := path.RelativeTo(searchRoot) + if err != nil { + return stackerr.NewStackErrf(err, "determining distance from search root") + } + + if len(relative.Parts()) != 1 { + pathLog.Debug().Msg("skipping sub-module") + return pathlib.ErrWalkSkipSubtree + } + pathLog.Debug().Int("parts_len", len(relative.Parts())).Str("parts", fmt.Sprintf("%v", relative.Parts())).Msg("not skipping module as this is the root path") + } _, haveVisitedDir := visitedDirs[path.Parent().String()] if !haveVisitedDir && strings.HasSuffix(path.Name(), ".go") { @@ -588,17 +604,16 @@ func (c *Config) subPackages( if !c.IncludeAutoGenerated { autoGenerated, err := isAutoGenerated(path) if err != nil { - log.Err(err).Stringer("path", path).Msg("failed to determine if file is auto-generated") + pathLog.Err(err).Msg("failed to determine if file is auto-generated") return err } if autoGenerated { - log.Debug().Stringer("path", path).Msg("skipping file as auto-generated") + pathLog.Debug().Msg("skipping file as auto-generated") return nil } } - l := log.With().Stringer("path", path.Parent()).Logger() - l.Debug().Msg("subdirectory has a .go file, adding this path to packages config") + pathLog.Debug().Msg("subdirectory has a .go file, adding this path to packages config") subdirectoriesWithGoFiles = append(subdirectoriesWithGoFiles, path.Parent()) visitedDirs[path.Parent().String()] = nil } diff --git a/pkg/config/config_test.go b/pkg/config/config_test.go index ce5cad6b..94ff3fa7 100644 --- a/pkg/config/config_test.go +++ b/pkg/config/config_test.go @@ -1231,6 +1231,27 @@ packages: recursive: true with-expecter: true with-expecter: false +`, + }, + { + name: "package with submodule that should be excluded", + cfgYaml: ` +all: true +packages: + github.com/vektra/mockery/v2/pkg/fixtures/example_project/pkg_with_submodules: + config: + recursive: True +`, + wantCfgMap: `all: true +packages: + github.com/vektra/mockery/v2/pkg/fixtures/example_project/pkg_with_submodules: + config: + all: true + recursive: true + github.com/vektra/mockery/v2/pkg/fixtures/example_project/pkg_with_submodules/subpkg: + config: + all: true + recursive: true `, }, } diff --git a/pkg/fixtures/example_project/pkg_with_submodules/go.mod b/pkg/fixtures/example_project/pkg_with_submodules/go.mod new file mode 100644 index 00000000..f4e7eb87 --- /dev/null +++ b/pkg/fixtures/example_project/pkg_with_submodules/go.mod @@ -0,0 +1,3 @@ +module github.com/vektra/mockery/v2/pkg/fixtures/example_project/pkg_with_submodules + +go 1.19 diff --git a/pkg/fixtures/example_project/pkg_with_submodules/string.go b/pkg/fixtures/example_project/pkg_with_submodules/string.go new file mode 100644 index 00000000..a8be0749 --- /dev/null +++ b/pkg/fixtures/example_project/pkg_with_submodules/string.go @@ -0,0 +1,5 @@ +package pkg_with_submodules + +type Stringer interface { + String() string +} diff --git a/pkg/fixtures/example_project/pkg_with_submodules/submodule/go.mod b/pkg/fixtures/example_project/pkg_with_submodules/submodule/go.mod new file mode 100644 index 00000000..6f511b21 --- /dev/null +++ b/pkg/fixtures/example_project/pkg_with_submodules/submodule/go.mod @@ -0,0 +1,3 @@ +module github.com/vektra/mockery/v2/pkg/fixtures/example_project/submodule + +go 1.21.0 diff --git a/pkg/fixtures/example_project/pkg_with_submodules/submodule/string.go b/pkg/fixtures/example_project/pkg_with_submodules/submodule/string.go new file mode 100644 index 00000000..97664f8e --- /dev/null +++ b/pkg/fixtures/example_project/pkg_with_submodules/submodule/string.go @@ -0,0 +1,5 @@ +package submodule + +type Stringer interface { + String() string +} diff --git a/pkg/fixtures/example_project/pkg_with_submodules/subpkg/string.go b/pkg/fixtures/example_project/pkg_with_submodules/subpkg/string.go new file mode 100644 index 00000000..e9fcf3e0 --- /dev/null +++ b/pkg/fixtures/example_project/pkg_with_submodules/subpkg/string.go @@ -0,0 +1,5 @@ +package subpkg + +type Stringer interface { + String() string +} diff --git a/pkg/fixtures/example_project/pkg_with_submodules/subpkg/submodule/go.mod b/pkg/fixtures/example_project/pkg_with_submodules/subpkg/submodule/go.mod new file mode 100644 index 00000000..9d879cdb --- /dev/null +++ b/pkg/fixtures/example_project/pkg_with_submodules/subpkg/submodule/go.mod @@ -0,0 +1,3 @@ +module github.com/vektra/mockery/v2/pkg/fixtures/example_project/pkg_with_submodules/subpkg/submodule + +go 1.19 diff --git a/pkg/fixtures/example_project/pkg_with_submodules/subpkg/submodule/string.go b/pkg/fixtures/example_project/pkg_with_submodules/subpkg/submodule/string.go new file mode 100644 index 00000000..97664f8e --- /dev/null +++ b/pkg/fixtures/example_project/pkg_with_submodules/subpkg/submodule/string.go @@ -0,0 +1,5 @@ +package submodule + +type Stringer interface { + String() string +}