Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion pkg/testcoverage/coverage/cover.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
1 change: 1 addition & 0 deletions pkg/testcoverage/coverage/export_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ var (
FindFuncsAndBlocks = findFuncsAndBlocks
ParseProfiles = parseProfiles
SumCoverage = sumCoverage
FindGoModFile = findGoModFile
)

type Extent = extent
55 changes: 48 additions & 7 deletions pkg/testcoverage/coverage/module.go
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand All @@ -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 {
Expand Down
17 changes: 17 additions & 0 deletions pkg/testcoverage/coverage/module_test.go
Original file line number Diff line number Diff line change
@@ -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("../../../")))
}
Loading