diff --git a/pkg/testcoverage/coverage/cover.go b/pkg/testcoverage/coverage/cover.go index d808356..9d0566a 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 2fbbdcf..34be596 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 696b7ac..eeb7666 100644 --- a/pkg/testcoverage/coverage/module.go +++ b/pkg/testcoverage/coverage/module.go @@ -12,10 +12,13 @@ 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("go.mod file found") + module := readModuleDirective(goModFile) if module == "" { // coverage-ignore logger.L.Warn().Msg("`module` directive not found") @@ -27,23 +30,61 @@ 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 0000000..91b4a2d --- /dev/null +++ b/pkg/testcoverage/coverage/module_test.go @@ -0,0 +1,17 @@ +package coverage_test + +import ( + "testing" + + "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", path.NormalizeForTool(FindGoModFile("../../../"))) +}