From 81ec66c257fb45aba1c3b5c61719ac83bd52a811 Mon Sep 17 00:00:00 2001 From: wxiaoguang Date: Thu, 21 Nov 2024 10:32:19 +0800 Subject: [PATCH] Fix submodule parsing (#32571) (#32577) A quick fix for #32568 Partially backport from #32571 --- modules/git/commit.go | 36 +++++++++++++++++++++----------- modules/git/commit_test.go | 42 ++++++++++++++++++++++++++++++++++++-- 2 files changed, 64 insertions(+), 14 deletions(-) diff --git a/modules/git/commit.go b/modules/git/commit.go index 86adaa79a66..5f52a9d1ab3 100644 --- a/modules/git/commit.go +++ b/modules/git/commit.go @@ -377,31 +377,43 @@ func (c *Commit) GetSubModules() (*ObjectCache, error) { } defer rd.Close() + return configParseSubModules(rd) +} + +func configParseSubModules(rd io.Reader) (*ObjectCache, error) { scanner := bufio.NewScanner(rd) - c.submoduleCache = newObjectCache() - var ismodule bool - var path string + submoduleCache := newObjectCache() + var subModule *SubModule for scanner.Scan() { - if strings.HasPrefix(scanner.Text(), "[submodule") { - ismodule = true + line := strings.TrimSpace(scanner.Text()) + if strings.HasPrefix(line, "[") { + if subModule != nil { + submoduleCache.Set(subModule.Name, subModule) + subModule = nil + } + if strings.HasPrefix(line, "[submodule") { + subModule = &SubModule{} + } continue } - if ismodule { - fields := strings.Split(scanner.Text(), "=") + if subModule != nil { + fields := strings.Split(line, "=") k := strings.TrimSpace(fields[0]) if k == "path" { - path = strings.TrimSpace(fields[1]) + subModule.Name = strings.TrimSpace(fields[1]) } else if k == "url" { - c.submoduleCache.Set(path, &SubModule{path, strings.TrimSpace(fields[1])}) - ismodule = false + subModule.URL = strings.TrimSpace(fields[1]) } } } - if err = scanner.Err(); err != nil { + if subModule != nil { + submoduleCache.Set(subModule.Name, subModule) + } + if err := scanner.Err(); err != nil { return nil, fmt.Errorf("GetSubModules scan: %w", err) } - return c.submoduleCache, nil + return submoduleCache, nil } // GetSubModule get the sub module according entryname diff --git a/modules/git/commit_test.go b/modules/git/commit_test.go index 0ddeb182ef8..8ed30262f70 100644 --- a/modules/git/commit_test.go +++ b/modules/git/commit_test.go @@ -135,7 +135,7 @@ author KN4CK3R 1711702962 +0100 committer KN4CK3R 1711702962 +0100 encoding ISO-8859-1 gpgsig -----BEGIN PGP SIGNATURE----- - + iQGzBAABCgAdFiEE9HRrbqvYxPT8PXbefPSEkrowAa8FAmYGg7IACgkQfPSEkrow Aa9olwv+P0HhtCM6CRvlUmPaqswRsDPNR4i66xyXGiSxdI9V5oJL7HLiQIM7KrFR gizKa2COiGtugv8fE+TKqXKaJx6uJUJEjaBd8E9Af9PrAzjWj+A84lU6/PgPS8hq @@ -150,7 +150,7 @@ gpgsig -----BEGIN PGP SIGNATURE----- -----END PGP SIGNATURE----- ISO-8859-1` - + commitString = strings.ReplaceAll(commitString, "", " ") sha := &Sha1Hash{0xfe, 0xaf, 0x4b, 0xa6, 0xbc, 0x63, 0x5f, 0xec, 0x44, 0x2f, 0x46, 0xdd, 0xd4, 0x51, 0x24, 0x16, 0xec, 0x43, 0xc2, 0xc2} gitRepo, err := openRepositoryWithDefaultContext(filepath.Join(testReposDir, "repo1_bare")) assert.NoError(t, err) @@ -362,3 +362,41 @@ func Test_GetCommitBranchStart(t *testing.T) { assert.NotEmpty(t, startCommitID) assert.EqualValues(t, "9c9aef8dd84e02bc7ec12641deb4c930a7c30185", startCommitID) } + +func TestConfigSubModule(t *testing.T) { + input := ` +[core] +path = test + +[submodule "submodule1"] + path = path1 + url = https://gitea.io/foo/foo + #branch = b1 + +[other1] +branch = master + +[submodule "submodule2"] + path = path2 + url = https://gitea.io/bar/bar + branch = b2 + +[other2] +branch = main + +[submodule "submodule3"] + path = path3 + url = https://gitea.io/xxx/xxx +` + + subModules, err := configParseSubModules(strings.NewReader(input)) + assert.NoError(t, err) + assert.Len(t, subModules.cache, 3) + + sm1, _ := subModules.Get("path1") + assert.Equal(t, &SubModule{Name: "path1", URL: "https://gitea.io/foo/foo"}, sm1) + sm2, _ := subModules.Get("path2") + assert.Equal(t, &SubModule{Name: "path2", URL: "https://gitea.io/bar/bar"}, sm2) + sm3, _ := subModules.Get("path3") + assert.Equal(t, &SubModule{Name: "path3", URL: "https://gitea.io/xxx/xxx"}, sm3) +}