From 4113314f3715e8b4fded549e79ffe52fe75d8790 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Steffen=20Schr=C3=B6ter?= Date: Mon, 5 Jul 2021 19:43:05 +0200 Subject: [PATCH] Use pipeline for GetSubmoduleCommits MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Steffen Schröter --- modules/git/submodule.go | 37 +++++++++++++++++++++++++++---------- 1 file changed, 27 insertions(+), 10 deletions(-) diff --git a/modules/git/submodule.go b/modules/git/submodule.go index e8cbb81180..566dfb281b 100644 --- a/modules/git/submodule.go +++ b/modules/git/submodule.go @@ -6,7 +6,9 @@ package git import ( + "bufio" "fmt" + "io" "net" "net/url" "path" @@ -133,25 +135,40 @@ func (sf *SubModuleFile) RefID() string { // GetSubmoduleCommits Returns a list of active submodules in the repository func GetSubmoduleCommits(repoPath string) []SubModuleCommit { + stdoutReader, stdoutWriter := io.Pipe() + defer func() { + _ = stdoutReader.Close() + _ = stdoutWriter.Close() + }() + + go func() { + stderrBuilder := &strings.Builder{} + err := NewCommand("config", "-f", ".gitmodules", "--list", "--name-only").RunInDirPipeline(repoPath, stdoutWriter, stderrBuilder) + if err != nil { + _ = stdoutWriter.CloseWithError(ConcatenateError(err, stderrBuilder.String())) + } else { + _ = stdoutWriter.Close() + } + }() + var submodules []SubModuleCommit + bufReader := bufio.NewReader(stdoutReader) - submoduleOut, err := NewCommand("config", "-f", ".gitmodules", "--list", "--name-only"). - RunInDir(repoPath) + for { + line, err := bufReader.ReadString('\n') - if err != nil { - // Command fails if there are no or invalid submodules, just return an empty list - return submodules - } + if err != nil { + break + } - for _, line := range strings.Split(strings.TrimSuffix(submoduleOut, "\n"), "\n") { - if len(line) < len("submodule.x.url") || + if len(line) < len("submodule.x.url\n") || !strings.HasPrefix(line, "submodule.") || - !strings.HasSuffix(line, ".url") { + !strings.HasSuffix(line, ".url\n") { continue } - name := line[len("submodule.") : len(line)-len(".url")] + name := line[len("submodule.") : len(line)-len(".url\n")] name = strings.TrimSpace(name) if len(name) == 0 {