From 798ee4510c72cb4ad98bb97d39fea11e51efcf61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vlado=20Paji=C4=87?= Date: Thu, 15 May 2025 10:55:04 +0200 Subject: [PATCH 1/5] improved go mod search --- pkg/testcoverage/coverage/cover.go | 2 +- pkg/testcoverage/coverage/export_test.go | 1 + pkg/testcoverage/coverage/module.go | 53 ++++++++++++++++++++---- pkg/testcoverage/coverage/module_test.go | 16 +++++++ 4 files changed, 64 insertions(+), 8 deletions(-) create mode 100644 pkg/testcoverage/coverage/module_test.go diff --git a/pkg/testcoverage/coverage/cover.go b/pkg/testcoverage/coverage/cover.go index d8083562..9d0566af 100644 --- a/pkg/testcoverage/coverage/cover.go +++ b/pkg/testcoverage/coverage/cover.go @@ -208,7 +208,7 @@ func listAllFiles(rootDir string) []fileInfo { return nil }) if err != nil { // coverage-ignore - logger.L.Error().Err(err).Msg("listing go files") + logger.L.Error().Err(err).Msg("listing files (.go files search)") } return files diff --git a/pkg/testcoverage/coverage/export_test.go b/pkg/testcoverage/coverage/export_test.go index 2fbbdcfb..34be5965 100644 --- a/pkg/testcoverage/coverage/export_test.go +++ b/pkg/testcoverage/coverage/export_test.go @@ -6,6 +6,7 @@ var ( FindFuncsAndBlocks = findFuncsAndBlocks ParseProfiles = parseProfiles SumCoverage = sumCoverage + FindGoModFile = findGoModFile ) type Extent = extent diff --git a/pkg/testcoverage/coverage/module.go b/pkg/testcoverage/coverage/module.go index 696b7ac4..85667038 100644 --- a/pkg/testcoverage/coverage/module.go +++ b/pkg/testcoverage/coverage/module.go @@ -12,10 +12,12 @@ import ( func findModuleDirective(rootDir string) string { goModFile := findGoModFile(rootDir) if goModFile == "" { - logger.L.Warn().Str("dir", rootDir).Msg("could not find go.mod file in root dir") + logger.L.Warn().Str("dir", rootDir).Msg("go.mod file not found in root directory (consider setting up source dir)") return "" } + logger.L.Debug().Str("file", goModFile).Msg("found go.mod file") + module := readModuleDirective(goModFile) if module == "" { // coverage-ignore logger.L.Warn().Msg("`module` directive not found") @@ -27,23 +29,60 @@ func findModuleDirective(rootDir string) string { } func findGoModFile(rootDir string) string { - var goModFile string + goModFile := findGoModFromRoot(rootDir) + if goModFile != "" { + return goModFile + } + + // fallback to find first go mod file wherever it may be + // not really sure if we really need this ??? + return findGoModWithWalk(rootDir) +} + +func findGoModWithWalk(rootDir string) string { // coverage-ignore + var goModFiles []string - //nolint:errcheck // error ignored because there is fallback mechanism for finding files - filepath.Walk(rootDir, func(file string, info os.FileInfo, err error) error { + err := filepath.Walk(rootDir, func(file string, info os.FileInfo, err error) error { if err != nil { // coverage-ignore return err } if info.Name() == "go.mod" { - goModFile = file - return filepath.SkipAll + goModFiles = append(goModFiles, file) } return nil }) + if err != nil { + logger.L.Error().Err(err).Msg("listing files (go.mod search)") + } + + if len(goModFiles) == 0 { + logger.L.Warn().Msg("go.mod file not found via walk method") + return "" + } + if len(goModFiles) > 1 { + logger.L.Warn().Msg("found multiple go.mod files via walk method") + return "" + } + + return goModFiles[0] +} + +func findGoModFromRoot(rootDir string) string { + files, err := os.ReadDir(rootDir) + if err != nil { // coverage-ignore + logger.L.Error().Err(err).Msg("reading directory") + return "" + } + + for _, info := range files { + if info.Name() == "go.mod" { + return filepath.Join(rootDir, info.Name()) + } + } - return goModFile + return "" } func readModuleDirective(filename string) string { diff --git a/pkg/testcoverage/coverage/module_test.go b/pkg/testcoverage/coverage/module_test.go new file mode 100644 index 00000000..99dd00a2 --- /dev/null +++ b/pkg/testcoverage/coverage/module_test.go @@ -0,0 +1,16 @@ +package coverage_test + +import ( + "testing" + + "github.com/stretchr/testify/assert" + + . "github.com/vladopajic/go-test-coverage/v2/pkg/testcoverage/coverage" +) + +func Test_FindGoModFile(t *testing.T) { + t.Parallel() + + assert.Empty(t, FindGoModFile("")) + assert.Equal(t, "../../../go.mod", FindGoModFile("../../../")) +} From fd11af62176e6774213c9b34a5c4363c18c8c713 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vlado=20Paji=C4=87?= Date: Thu, 15 May 2025 10:56:52 +0200 Subject: [PATCH 2/5] lint fix --- pkg/testcoverage/coverage/module.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/pkg/testcoverage/coverage/module.go b/pkg/testcoverage/coverage/module.go index 85667038..5ca0733f 100644 --- a/pkg/testcoverage/coverage/module.go +++ b/pkg/testcoverage/coverage/module.go @@ -12,7 +12,8 @@ import ( func findModuleDirective(rootDir string) string { goModFile := findGoModFile(rootDir) if goModFile == "" { - logger.L.Warn().Str("dir", rootDir).Msg("go.mod file not found in root directory (consider setting up source dir)") + logger.L.Warn().Str("dir", rootDir). + Msg("go.mod file not found in root directory (consider setting up source dir)") return "" } @@ -61,6 +62,7 @@ func findGoModWithWalk(rootDir string) string { // coverage-ignore logger.L.Warn().Msg("go.mod file not found via walk method") return "" } + if len(goModFiles) > 1 { logger.L.Warn().Msg("found multiple go.mod files via walk method") return "" From de75ca8177ad94d064db0e27f54fecad6971d240 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vlado=20Paji=C4=87?= Date: Thu, 15 May 2025 10:59:28 +0200 Subject: [PATCH 3/5] tidy --- pkg/testcoverage/coverage/module.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/testcoverage/coverage/module.go b/pkg/testcoverage/coverage/module.go index 5ca0733f..eeb76665 100644 --- a/pkg/testcoverage/coverage/module.go +++ b/pkg/testcoverage/coverage/module.go @@ -17,7 +17,7 @@ func findModuleDirective(rootDir string) string { return "" } - logger.L.Debug().Str("file", goModFile).Msg("found go.mod file") + logger.L.Debug().Str("file", goModFile).Msg("go.mod file found") module := readModuleDirective(goModFile) if module == "" { // coverage-ignore From 7958f2dd3f19274de73f65905657d2c1406dae06 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vlado=20Paji=C4=87?= Date: Thu, 15 May 2025 11:00:42 +0200 Subject: [PATCH 4/5] fix --- pkg/testcoverage/coverage/module_test.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pkg/testcoverage/coverage/module_test.go b/pkg/testcoverage/coverage/module_test.go index 99dd00a2..dddcf194 100644 --- a/pkg/testcoverage/coverage/module_test.go +++ b/pkg/testcoverage/coverage/module_test.go @@ -6,11 +6,12 @@ import ( "github.com/stretchr/testify/assert" . "github.com/vladopajic/go-test-coverage/v2/pkg/testcoverage/coverage" + "github.com/vladopajic/go-test-coverage/v2/pkg/testcoverage/path" ) func Test_FindGoModFile(t *testing.T) { t.Parallel() assert.Empty(t, FindGoModFile("")) - assert.Equal(t, "../../../go.mod", FindGoModFile("../../../")) + assert.Equal(t, path.NormalizeForTool("../../../go.mod"), FindGoModFile("../../../")) } From 6fd21f7c18a3f616ad37237a45f614c4ab33ad69 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vlado=20Paji=C4=87?= Date: Thu, 15 May 2025 11:05:46 +0200 Subject: [PATCH 5/5] fix --- pkg/testcoverage/coverage/module_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/testcoverage/coverage/module_test.go b/pkg/testcoverage/coverage/module_test.go index dddcf194..91b4a2da 100644 --- a/pkg/testcoverage/coverage/module_test.go +++ b/pkg/testcoverage/coverage/module_test.go @@ -13,5 +13,5 @@ func Test_FindGoModFile(t *testing.T) { t.Parallel() assert.Empty(t, FindGoModFile("")) - assert.Equal(t, path.NormalizeForTool("../../../go.mod"), FindGoModFile("../../../")) + assert.Equal(t, "../../../go.mod", path.NormalizeForTool(FindGoModFile("../../../"))) }