From 4130b545796839903bc72a83e045d167f06096b6 Mon Sep 17 00:00:00 2001 From: loyalsoldier <10487845+Loyalsoldier@users.noreply.github.com> Date: Sun, 4 Oct 2020 12:38:25 +0800 Subject: [PATCH] Support to read go.mod recursively to get module path --- common/common.go | 44 ++++++++++++++++++++++++++------------------ 1 file changed, 26 insertions(+), 18 deletions(-) diff --git a/common/common.go b/common/common.go index 4156a7b1..52b65285 100644 --- a/common/common.go +++ b/common/common.go @@ -126,25 +126,33 @@ func GetGOPATH() string { // GetModuleName returns the value of module in `go.mod` file. func GetModuleName(pathToProjectRoot string) (string, error) { - gomodPath := filepath.Join(pathToProjectRoot, "go.mod") - gomodBytes, err := ioutil.ReadFile(gomodPath) - if err != nil { - return "", err - } - gomodContent := string(gomodBytes) - moduleIdx := strings.Index(gomodContent, "module ") - newLineIdx := strings.Index(gomodContent, "\n") - var moduleName string - if moduleIdx >= 0 { - if newLineIdx >= 0 { - moduleName = strings.TrimSpace(gomodContent[moduleIdx+6 : newLineIdx]) - moduleName = strings.TrimSuffix(moduleName, "\r") - } else { - moduleName = strings.TrimSpace(gomodContent[moduleIdx+6:]) + loopPath := pathToProjectRoot + for { + if idx := strings.LastIndex(loopPath, string(filepath.Separator)); idx >= 0 { + gomodPath := filepath.Join(loopPath, "go.mod") + gomodBytes, err := ioutil.ReadFile(gomodPath) + if err != nil { + loopPath = loopPath[:idx] + continue + } + + gomodContent := string(gomodBytes) + moduleIdx := strings.Index(gomodContent, "module ") + newLineIdx := strings.Index(gomodContent, "\n") + + if moduleIdx >= 0 { + if newLineIdx >= 0 { + moduleName = strings.TrimSpace(gomodContent[moduleIdx+6 : newLineIdx]) + moduleName = strings.TrimSuffix(moduleName, "\r") + } else { + moduleName = strings.TrimSpace(gomodContent[moduleIdx+6:]) + } + return moduleName, nil + } + return "", fmt.Errorf("can not get module path in `%s`", gomodPath) } - } else { - return "", fmt.Errorf("can not get module path in `%s`", gomodPath) + break } - return moduleName, nil + return moduleName, fmt.Errorf("no `go.mod` file in every parent directory of `%s`", pathToProjectRoot) }