diff --git a/modules/git/commit.go b/modules/git/commit.go index af09697018261..323a35394aefd 100644 --- a/modules/git/commit.go +++ b/modules/git/commit.go @@ -25,8 +25,7 @@ type Commit struct { CommitMessage string Signature *CommitSignature - Parents []ObjectID // ID strings - submoduleCache *ObjectCache[*SubModule] + Parents []ObjectID // ID strings } // CommitSignature represents a git commit signature part. diff --git a/modules/git/commit_info.go b/modules/git/commit_info.go index 4f76a28f31c0b..6c7e7b7a31801 100644 --- a/modules/git/commit_info.go +++ b/modules/git/commit_info.go @@ -7,17 +7,17 @@ package git type CommitInfo struct { Entry *TreeEntry Commit *Commit - SubmoduleFile *CommitSubmoduleFile + SubmoduleFile *SubmoduleFile } -func GetCommitInfoSubmoduleFile(repoLink, fullPath string, commit *Commit, refCommitID ObjectID) (*CommitSubmoduleFile, error) { +func GetCommitInfoSubmoduleFile(repoLink, fullPath string, commit *Commit, refCommitID ObjectID) (*SubmoduleFile, error) { submodule, err := commit.GetSubModule(fullPath) if err != nil { return nil, err } if submodule == nil { // unable to find submodule from ".gitmodules" file - return NewCommitSubmoduleFile(repoLink, fullPath, "", refCommitID.String()), nil + return NewSubmoduleFile(repoLink, fullPath, "", refCommitID.String()), nil } - return NewCommitSubmoduleFile(repoLink, fullPath, submodule.URL, refCommitID.String()), nil + return NewSubmoduleFile(repoLink, fullPath, submodule.URL, refCommitID.String()), nil } diff --git a/modules/git/commit_info_test.go b/modules/git/commit_info_test.go index 14a41745447b1..97f3f9bf04b38 100644 --- a/modules/git/commit_info_test.go +++ b/modules/git/commit_info_test.go @@ -129,7 +129,7 @@ func TestEntries_GetCommitsInfo(t *testing.T) { require.NoError(t, err) cisf, err := GetCommitInfoSubmoduleFile("/any/repo-link", "file1.txt", commit, treeEntry.ID) require.NoError(t, err) - assert.Equal(t, &CommitSubmoduleFile{ + assert.Equal(t, &SubmoduleFile{ repoLink: "/any/repo-link", fullPath: "file1.txt", refURL: "", diff --git a/modules/git/commit_submodule_file.go b/modules/git/commit_submodule_file.go deleted file mode 100644 index efcf53b07c867..0000000000000 --- a/modules/git/commit_submodule_file.go +++ /dev/null @@ -1,69 +0,0 @@ -// Copyright 2019 The Gitea Authors. All rights reserved. -// Copyright 2015 The Gogs Authors. All rights reserved. -// SPDX-License-Identifier: MIT - -package git - -import ( - "context" - "path" - "strings" - - giturl "code.gitea.io/gitea/modules/git/url" - "code.gitea.io/gitea/modules/util" -) - -// CommitSubmoduleFile represents a file with submodule type. -type CommitSubmoduleFile struct { - repoLink string - fullPath string - refURL string - refID string - - parsed bool - parsedTargetLink string -} - -// NewCommitSubmoduleFile create a new submodule file -func NewCommitSubmoduleFile(repoLink, fullPath, refURL, refID string) *CommitSubmoduleFile { - return &CommitSubmoduleFile{repoLink: repoLink, fullPath: fullPath, refURL: refURL, refID: refID} -} - -// RefID returns the commit ID of the submodule, it returns empty string for nil receiver -func (sf *CommitSubmoduleFile) RefID() string { - if sf == nil { - return "" - } - return sf.refID -} - -func (sf *CommitSubmoduleFile) getWebLinkInTargetRepo(ctx context.Context, moreLinkPath string) *SubmoduleWebLink { - if sf == nil || sf.refURL == "" { - return nil - } - if strings.HasPrefix(sf.refURL, "../") { - targetLink := path.Join(sf.repoLink, sf.refURL) - return &SubmoduleWebLink{RepoWebLink: targetLink, CommitWebLink: targetLink + moreLinkPath} - } - if !sf.parsed { - sf.parsed = true - parsedURL, err := giturl.ParseRepositoryURL(ctx, sf.refURL) - if err != nil { - return nil - } - sf.parsedTargetLink = giturl.MakeRepositoryWebLink(parsedURL) - } - return &SubmoduleWebLink{RepoWebLink: sf.parsedTargetLink, CommitWebLink: sf.parsedTargetLink + moreLinkPath} -} - -// SubmoduleWebLinkTree tries to make the submodule's tree link in its own repo, it also works on "nil" receiver -// It returns nil if the submodule does not have a valid URL or is nil -func (sf *CommitSubmoduleFile) SubmoduleWebLinkTree(ctx context.Context, optCommitID ...string) *SubmoduleWebLink { - return sf.getWebLinkInTargetRepo(ctx, "/tree/"+util.OptionalArg(optCommitID, sf.RefID())) -} - -// SubmoduleWebLinkCompare tries to make the submodule's compare link in its own repo, it also works on "nil" receiver -// It returns nil if the submodule does not have a valid URL or is nil -func (sf *CommitSubmoduleFile) SubmoduleWebLinkCompare(ctx context.Context, commitID1, commitID2 string) *SubmoduleWebLink { - return sf.getWebLinkInTargetRepo(ctx, "/compare/"+commitID1+"..."+commitID2) -} diff --git a/modules/git/commit_submodule_file_test.go b/modules/git/commit_submodule_file_test.go deleted file mode 100644 index 33fe1464446c6..0000000000000 --- a/modules/git/commit_submodule_file_test.go +++ /dev/null @@ -1,40 +0,0 @@ -// Copyright 2024 The Gitea Authors. All rights reserved. -// SPDX-License-Identifier: MIT - -package git - -import ( - "testing" - - "github.com/stretchr/testify/assert" -) - -func TestCommitSubmoduleLink(t *testing.T) { - assert.Nil(t, (*CommitSubmoduleFile)(nil).SubmoduleWebLinkTree(t.Context())) - assert.Nil(t, (*CommitSubmoduleFile)(nil).SubmoduleWebLinkCompare(t.Context(), "", "")) - assert.Nil(t, (&CommitSubmoduleFile{}).SubmoduleWebLinkTree(t.Context())) - assert.Nil(t, (&CommitSubmoduleFile{}).SubmoduleWebLinkCompare(t.Context(), "", "")) - - t.Run("GitHubRepo", func(t *testing.T) { - sf := NewCommitSubmoduleFile("/any/repo-link", "full-path", "git@github.com:user/repo.git", "aaaa") - wl := sf.SubmoduleWebLinkTree(t.Context()) - assert.Equal(t, "https://github.com/user/repo", wl.RepoWebLink) - assert.Equal(t, "https://github.com/user/repo/tree/aaaa", wl.CommitWebLink) - - wl = sf.SubmoduleWebLinkCompare(t.Context(), "1111", "2222") - assert.Equal(t, "https://github.com/user/repo", wl.RepoWebLink) - assert.Equal(t, "https://github.com/user/repo/compare/1111...2222", wl.CommitWebLink) - }) - - t.Run("RelativePath", func(t *testing.T) { - sf := NewCommitSubmoduleFile("/subpath/any/repo-home-link", "full-path", "../../user/repo", "aaaa") - wl := sf.SubmoduleWebLinkTree(t.Context()) - assert.Equal(t, "/subpath/user/repo", wl.RepoWebLink) - assert.Equal(t, "/subpath/user/repo/tree/aaaa", wl.CommitWebLink) - - sf = NewCommitSubmoduleFile("/subpath/any/repo-home-link", "dir/submodule", "../../user/repo", "aaaa") - wl = sf.SubmoduleWebLinkCompare(t.Context(), "1111", "2222") - assert.Equal(t, "/subpath/user/repo", wl.RepoWebLink) - assert.Equal(t, "/subpath/user/repo/compare/1111...2222", wl.CommitWebLink) - }) -} diff --git a/modules/git/submodule.go b/modules/git/submodule.go deleted file mode 100644 index 45059eae77695..0000000000000 --- a/modules/git/submodule.go +++ /dev/null @@ -1,67 +0,0 @@ -// Copyright 2024 The Gitea Authors. All rights reserved. -// SPDX-License-Identifier: MIT - -package git - -import ( - "bufio" - "context" - "fmt" - "os" - - "code.gitea.io/gitea/modules/git/gitcmd" - "code.gitea.io/gitea/modules/log" -) - -type TemplateSubmoduleCommit struct { - Path string - Commit string -} - -// GetTemplateSubmoduleCommits returns a list of submodules paths and their commits from a repository -// This function is only for generating new repos based on existing template, the template couldn't be too large. -func GetTemplateSubmoduleCommits(ctx context.Context, repoPath string) (submoduleCommits []TemplateSubmoduleCommit, _ error) { - stdoutReader, stdoutWriter, err := os.Pipe() - if err != nil { - return nil, err - } - - err = gitcmd.NewCommand("ls-tree", "-r", "--", "HEAD"). - WithDir(repoPath). - WithStdout(stdoutWriter). - WithPipelineFunc(func(ctx context.Context, cancel context.CancelFunc) error { - _ = stdoutWriter.Close() - defer stdoutReader.Close() - - scanner := bufio.NewScanner(stdoutReader) - for scanner.Scan() { - entry, err := parseLsTreeLine(scanner.Bytes()) - if err != nil { - cancel() - return err - } - if entry.EntryMode == EntryModeCommit { - submoduleCommits = append(submoduleCommits, TemplateSubmoduleCommit{Path: entry.Name, Commit: entry.ID.String()}) - } - } - return scanner.Err() - }). - Run(ctx) - if err != nil { - return nil, fmt.Errorf("GetTemplateSubmoduleCommits: error running git ls-tree: %v", err) - } - return submoduleCommits, nil -} - -// AddTemplateSubmoduleIndexes Adds the given submodules to the git index. -// It is only for generating new repos based on existing template, requires the .gitmodules file to be already present in the work dir. -func AddTemplateSubmoduleIndexes(ctx context.Context, repoPath string, submodules []TemplateSubmoduleCommit) error { - for _, submodule := range submodules { - cmd := gitcmd.NewCommand("update-index", "--add", "--cacheinfo", "160000").AddDynamicArguments(submodule.Commit, submodule.Path) - if stdout, _, err := cmd.WithDir(repoPath).RunStdString(ctx); err != nil { - log.Error("Unable to add %s as submodule to repo %s: stdout %s\nError: %v", submodule.Path, repoPath, stdout, err) - return err - } - } - return nil -} diff --git a/modules/git/submodule_file.go b/modules/git/submodule_file.go new file mode 100644 index 0000000000000..f1d528b72e277 --- /dev/null +++ b/modules/git/submodule_file.go @@ -0,0 +1,131 @@ +// Copyright 2019 The Gitea Authors. All rights reserved. +// Copyright 2015 The Gogs Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package git + +import ( + "bufio" + "context" + "fmt" + "os" + "path" + "strings" + + "code.gitea.io/gitea/modules/git/gitcmd" + giturl "code.gitea.io/gitea/modules/git/url" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/util" +) + +// SubmoduleFile represents a file with submodule type. +type SubmoduleFile struct { + repoLink string + fullPath string + refURL string + refID string + + parsed bool + parsedTargetLink string +} + +// NewSubmoduleFile create a new submodule file +func NewSubmoduleFile(repoLink, fullPath, refURL, refID string) *SubmoduleFile { + return &SubmoduleFile{repoLink: repoLink, fullPath: fullPath, refURL: refURL, refID: refID} +} + +// RefID returns the commit ID of the submodule, it returns empty string for nil receiver +func (sf *SubmoduleFile) RefID() string { + if sf == nil { + return "" + } + return sf.refID +} + +func (sf *SubmoduleFile) FullPath() string { + return sf.fullPath +} + +type SubmoduleWebLink struct { + RepoWebLink, CommitWebLink string +} + +func (sf *SubmoduleFile) getWebLinkInTargetRepo(ctx context.Context, moreLinkPath string) *SubmoduleWebLink { + if sf == nil || sf.refURL == "" { + return nil + } + if strings.HasPrefix(sf.refURL, "../") { + targetLink := path.Join(sf.repoLink, sf.refURL) + return &SubmoduleWebLink{RepoWebLink: targetLink, CommitWebLink: targetLink + moreLinkPath} + } + if !sf.parsed { + sf.parsed = true + parsedURL, err := giturl.ParseRepositoryURL(ctx, sf.refURL) + if err != nil { + return nil + } + sf.parsedTargetLink = giturl.MakeRepositoryWebLink(parsedURL) + } + return &SubmoduleWebLink{RepoWebLink: sf.parsedTargetLink, CommitWebLink: sf.parsedTargetLink + moreLinkPath} +} + +// SubmoduleWebLinkTree tries to make the submodule's tree link in its own repo, it also works on "nil" receiver +// It returns nil if the submodule does not have a valid URL or is nil +func (sf *SubmoduleFile) SubmoduleWebLinkTree(ctx context.Context, optCommitID ...string) *SubmoduleWebLink { + return sf.getWebLinkInTargetRepo(ctx, "/tree/"+util.OptionalArg(optCommitID, sf.RefID())) +} + +// SubmoduleWebLinkCompare tries to make the submodule's compare link in its own repo, it also works on "nil" receiver +// It returns nil if the submodule does not have a valid URL or is nil +func (sf *SubmoduleFile) SubmoduleWebLinkCompare(ctx context.Context, commitID1, commitID2 string) *SubmoduleWebLink { + return sf.getWebLinkInTargetRepo(ctx, "/compare/"+commitID1+"..."+commitID2) +} + +// GetRepoSubmoduleFiles returns a list of submodules paths and their commits from a repository +// This function is only for generating new repos based on existing template, the template couldn't be too large. +func GetRepoSubmoduleFiles(ctx context.Context, repoPath, refName string) (submoduleFiles []SubmoduleFile, _ error) { + stdoutReader, stdoutWriter, err := os.Pipe() + if err != nil { + return nil, err + } + + err = gitcmd.NewCommand("ls-tree", "-r", "--"). + AddDynamicArguments(refName). + WithDir(repoPath). + WithStdout(stdoutWriter). + WithPipelineFunc(func(ctx context.Context, cancel context.CancelFunc) error { + _ = stdoutWriter.Close() + defer stdoutReader.Close() + + scanner := bufio.NewScanner(stdoutReader) + for scanner.Scan() { + entry, err := parseLsTreeLine(scanner.Bytes()) + if err != nil { + cancel() + return err + } + if entry.EntryMode == EntryModeCommit { + submoduleFiles = append(submoduleFiles, SubmoduleFile{fullPath: entry.Name, refID: entry.ID.String()}) + } + } + return scanner.Err() + }). + Run(ctx) + if err != nil { + return nil, fmt.Errorf("GetTemplateSubmoduleCommits: error running git ls-tree: %v", err) + } + return submoduleFiles, nil +} + +// AddSubmodulesToRepoIndex Adds the given submodules to the git index. +// It is only for generating new repos based on existing template, requires the .gitmodules file to be already present in the work dir. +func AddSubmodulesToRepoIndex(ctx context.Context, repoPath string, submodules []SubmoduleFile) error { + for _, submodule := range submodules { + cmd := gitcmd.NewCommand("update-index", "--add", "--cacheinfo", "160000").AddDynamicArguments(submodule.RefID(), submodule.fullPath) + if stdout, _, err := cmd.WithDir(repoPath).RunStdString(ctx); err != nil { + log.Error("Unable to add %s as submodule to repo %s: stdout %s\nError: %v", submodule.fullPath, repoPath, stdout, err) + return err + } + } + return nil +} diff --git a/modules/git/submodule_file_test.go b/modules/git/submodule_file_test.go new file mode 100644 index 0000000000000..a14655ce97245 --- /dev/null +++ b/modules/git/submodule_file_test.go @@ -0,0 +1,79 @@ +// Copyright 2024 The Gitea Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package git + +import ( + "os" + "path/filepath" + "testing" + + "code.gitea.io/gitea/modules/git/gitcmd" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestSubmoduleFile(t *testing.T) { + assert.Nil(t, (*SubmoduleFile)(nil).SubmoduleWebLinkTree(t.Context())) + assert.Nil(t, (*SubmoduleFile)(nil).SubmoduleWebLinkCompare(t.Context(), "", "")) + assert.Nil(t, (&SubmoduleFile{}).SubmoduleWebLinkTree(t.Context())) + assert.Nil(t, (&SubmoduleFile{}).SubmoduleWebLinkCompare(t.Context(), "", "")) + + t.Run("GitHubRepo", func(t *testing.T) { + sf := NewSubmoduleFile("/any/repo-link", "full-path", "git@github.com:user/repo.git", "aaaa") + wl := sf.SubmoduleWebLinkTree(t.Context()) + assert.Equal(t, "https://github.com/user/repo", wl.RepoWebLink) + assert.Equal(t, "https://github.com/user/repo/tree/aaaa", wl.CommitWebLink) + + wl = sf.SubmoduleWebLinkCompare(t.Context(), "1111", "2222") + assert.Equal(t, "https://github.com/user/repo", wl.RepoWebLink) + assert.Equal(t, "https://github.com/user/repo/compare/1111...2222", wl.CommitWebLink) + }) + + t.Run("RelativePath", func(t *testing.T) { + sf := NewSubmoduleFile("/subpath/any/repo-home-link", "full-path", "../../user/repo", "aaaa") + wl := sf.SubmoduleWebLinkTree(t.Context()) + assert.Equal(t, "/subpath/user/repo", wl.RepoWebLink) + assert.Equal(t, "/subpath/user/repo/tree/aaaa", wl.CommitWebLink) + + sf = NewSubmoduleFile("/subpath/any/repo-home-link", "dir/submodule", "../../user/repo", "aaaa") + wl = sf.SubmoduleWebLinkCompare(t.Context(), "1111", "2222") + assert.Equal(t, "/subpath/user/repo", wl.RepoWebLink) + assert.Equal(t, "/subpath/user/repo/compare/1111...2222", wl.CommitWebLink) + }) +} + +func TestGetRepoSubmoduleFiles(t *testing.T) { + testRepoPath := filepath.Join(testReposDir, "repo4_submodules") + submodules, err := GetRepoSubmoduleFiles(t.Context(), testRepoPath, "HEAD") + require.NoError(t, err) + + assert.Len(t, submodules, 2) + + assert.Equal(t, "<°)))><", submodules[0].FullPath()) + assert.Equal(t, "d2932de67963f23d43e1c7ecf20173e92ee6c43c", submodules[0].RefID()) + + assert.Equal(t, "libtest", submodules[1].FullPath()) + assert.Equal(t, "1234567890123456789012345678901234567890", submodules[1].RefID()) +} + +func TestAddTemplateSubmoduleIndexes(t *testing.T) { + ctx := t.Context() + tmpDir := t.TempDir() + var err error + _, _, err = gitcmd.NewCommand("init").WithDir(tmpDir).RunStdString(ctx) + require.NoError(t, err) + _ = os.Mkdir(filepath.Join(tmpDir, "new-dir"), 0o755) + err = AddSubmodulesToRepoIndex(ctx, tmpDir, []SubmoduleFile{{fullPath: "new-dir", refID: "1234567890123456789012345678901234567890"}}) + require.NoError(t, err) + _, _, err = gitcmd.NewCommand("add", "--all").WithDir(tmpDir).RunStdString(ctx) + require.NoError(t, err) + _, _, err = gitcmd.NewCommand("-c", "user.name=a", "-c", "user.email=b", "commit", "-m=test").WithDir(tmpDir).RunStdString(ctx) + require.NoError(t, err) + submodules, err := GetRepoSubmoduleFiles(t.Context(), tmpDir, "HEAD") + require.NoError(t, err) + assert.Len(t, submodules, 1) + assert.Equal(t, "new-dir", submodules[0].FullPath()) + assert.Equal(t, "1234567890123456789012345678901234567890", submodules[0].RefID()) +} diff --git a/modules/git/submodule_test.go b/modules/git/submodule_test.go deleted file mode 100644 index 22bd5bf71e5f9..0000000000000 --- a/modules/git/submodule_test.go +++ /dev/null @@ -1,49 +0,0 @@ -// Copyright 2024 The Gitea Authors. All rights reserved. -// SPDX-License-Identifier: MIT - -package git - -import ( - "os" - "path/filepath" - "testing" - - "code.gitea.io/gitea/modules/git/gitcmd" - - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" -) - -func TestGetTemplateSubmoduleCommits(t *testing.T) { - testRepoPath := filepath.Join(testReposDir, "repo4_submodules") - submodules, err := GetTemplateSubmoduleCommits(t.Context(), testRepoPath) - require.NoError(t, err) - - assert.Len(t, submodules, 2) - - assert.Equal(t, "<°)))><", submodules[0].Path) - assert.Equal(t, "d2932de67963f23d43e1c7ecf20173e92ee6c43c", submodules[0].Commit) - - assert.Equal(t, "libtest", submodules[1].Path) - assert.Equal(t, "1234567890123456789012345678901234567890", submodules[1].Commit) -} - -func TestAddTemplateSubmoduleIndexes(t *testing.T) { - ctx := t.Context() - tmpDir := t.TempDir() - var err error - _, _, err = gitcmd.NewCommand("init").WithDir(tmpDir).RunStdString(ctx) - require.NoError(t, err) - _ = os.Mkdir(filepath.Join(tmpDir, "new-dir"), 0o755) - err = AddTemplateSubmoduleIndexes(ctx, tmpDir, []TemplateSubmoduleCommit{{Path: "new-dir", Commit: "1234567890123456789012345678901234567890"}}) - require.NoError(t, err) - _, _, err = gitcmd.NewCommand("add", "--all").WithDir(tmpDir).RunStdString(ctx) - require.NoError(t, err) - _, _, err = gitcmd.NewCommand("-c", "user.name=a", "-c", "user.email=b", "commit", "-m=test").WithDir(tmpDir).RunStdString(ctx) - require.NoError(t, err) - submodules, err := GetTemplateSubmoduleCommits(t.Context(), tmpDir) - require.NoError(t, err) - assert.Len(t, submodules, 1) - assert.Equal(t, "new-dir", submodules[0].Path) - assert.Equal(t, "1234567890123456789012345678901234567890", submodules[0].Commit) -} diff --git a/modules/git/tree.go b/modules/git/tree.go index c1898b20cbe03..8c9f525c52bfc 100644 --- a/modules/git/tree.go +++ b/modules/git/tree.go @@ -15,8 +15,9 @@ type TreeCommon struct { ID ObjectID ResolvedID ObjectID - repo *Repository - ptree *Tree // parent tree + repo *Repository + ptree *Tree // parent tree + submoduleCache *ObjectCache[*SubModule] } // NewTree create a new tree according the repository and tree id diff --git a/modules/git/commit_submodule.go b/modules/git/tree_submodule.go similarity index 66% rename from modules/git/commit_submodule.go rename to modules/git/tree_submodule.go index ff253b7ecab22..9fcc60b41a2ca 100644 --- a/modules/git/commit_submodule.go +++ b/modules/git/tree_submodule.go @@ -3,17 +3,13 @@ package git -type SubmoduleWebLink struct { - RepoWebLink, CommitWebLink string -} - // GetSubModules get all the submodules of current revision git tree -func (c *Commit) GetSubModules() (*ObjectCache[*SubModule], error) { - if c.submoduleCache != nil { - return c.submoduleCache, nil +func (t *Tree) GetSubModules() (*ObjectCache[*SubModule], error) { + if t.submoduleCache != nil { + return t.submoduleCache, nil } - entry, err := c.GetTreeEntryByPath(".gitmodules") + entry, err := t.GetTreeEntryByPath(".gitmodules") if err != nil { if _, ok := err.(ErrNotExist); ok { return nil, nil @@ -28,17 +24,17 @@ func (c *Commit) GetSubModules() (*ObjectCache[*SubModule], error) { defer rd.Close() // at the moment we do not strictly limit the size of the .gitmodules file because some users would have huge .gitmodules files (>1MB) - c.submoduleCache, err = configParseSubModules(rd) + t.submoduleCache, err = configParseSubModules(rd) if err != nil { return nil, err } - return c.submoduleCache, nil + return t.submoduleCache, nil } // GetSubModule gets the submodule by the entry name. // It returns "nil, nil" if the submodule does not exist, caller should always remember to check the "nil" -func (c *Commit) GetSubModule(entryName string) (*SubModule, error) { - modules, err := c.GetSubModules() +func (t *Tree) GetSubModule(entryName string) (*SubModule, error) { + modules, err := t.GetSubModules() if err != nil { return nil, err } diff --git a/routers/web/repo/view_home.go b/routers/web/repo/view_home.go index 00d30bedef5ed..70f3eb109ff68 100644 --- a/routers/web/repo/view_home.go +++ b/routers/web/repo/view_home.go @@ -268,7 +268,7 @@ func isViewHomeOnlyContent(ctx *context.Context) bool { return ctx.FormBool("only_content") } -func handleRepoViewSubmodule(ctx *context.Context, commitSubmoduleFile *git.CommitSubmoduleFile) { +func handleRepoViewSubmodule(ctx *context.Context, commitSubmoduleFile *git.SubmoduleFile) { submoduleWebLink := commitSubmoduleFile.SubmoduleWebLinkTree(ctx) if submoduleWebLink == nil { ctx.Data["NotFoundPrompt"] = ctx.Repo.TreePath diff --git a/routers/web/repo/view_home_test.go b/routers/web/repo/view_home_test.go index dd74ae560b4d4..9b3495d4f0f11 100644 --- a/routers/web/repo/view_home_test.go +++ b/routers/web/repo/view_home_test.go @@ -18,19 +18,19 @@ func TestViewHomeSubmoduleRedirect(t *testing.T) { unittest.PrepareTestEnv(t) ctx, _ := contexttest.MockContext(t, "/user2/repo1/src/branch/master/test-submodule") - submodule := git_module.NewCommitSubmoduleFile("/user2/repo1", "test-submodule", "../repo-other", "any-ref-id") + submodule := git_module.NewSubmoduleFile("/user2/repo1", "test-submodule", "../repo-other", "any-ref-id") handleRepoViewSubmodule(ctx, submodule) assert.Equal(t, http.StatusSeeOther, ctx.Resp.WrittenStatus()) assert.Equal(t, "/user2/repo-other/tree/any-ref-id", ctx.Resp.Header().Get("Location")) ctx, _ = contexttest.MockContext(t, "/user2/repo1/src/branch/master/test-submodule") - submodule = git_module.NewCommitSubmoduleFile("/user2/repo1", "test-submodule", "https://other/user2/repo-other.git", "any-ref-id") + submodule = git_module.NewSubmoduleFile("/user2/repo1", "test-submodule", "https://other/user2/repo-other.git", "any-ref-id") handleRepoViewSubmodule(ctx, submodule) // do not auto-redirect for external URLs, to avoid open redirect or phishing assert.Equal(t, http.StatusNotFound, ctx.Resp.WrittenStatus()) ctx, respWriter := contexttest.MockContext(t, "/user2/repo1/src/branch/master/test-submodule?only_content=true") - submodule = git_module.NewCommitSubmoduleFile("/user2/repo1", "test-submodule", "../repo-other", "any-ref-id") + submodule = git_module.NewSubmoduleFile("/user2/repo1", "test-submodule", "../repo-other", "any-ref-id") handleRepoViewSubmodule(ctx, submodule) assert.Equal(t, http.StatusOK, ctx.Resp.WrittenStatus()) assert.Equal(t, `/user2/repo-other/tree/any-ref-id`, respWriter.Body.String()) diff --git a/services/gitdiff/submodule.go b/services/gitdiff/submodule.go index 4347743e3d0b0..3c7be8df91685 100644 --- a/services/gitdiff/submodule.go +++ b/services/gitdiff/submodule.go @@ -15,7 +15,7 @@ import ( type SubmoduleDiffInfo struct { SubmoduleName string - SubmoduleFile *git.CommitSubmoduleFile // it might be nil if the submodule is not found or unable to parse + SubmoduleFile *git.SubmoduleFile // it might be nil if the submodule is not found or unable to parse NewRefID string PreviousRefID string } @@ -37,7 +37,7 @@ func (si *SubmoduleDiffInfo) PopulateURL(repoLink string, diffFile *DiffFile, le return // ignore the error, do not cause 500 errors for end users } if submodule != nil { - si.SubmoduleFile = git.NewCommitSubmoduleFile(repoLink, submoduleFullPath, submodule.URL, submoduleCommit.ID.String()) + si.SubmoduleFile = git.NewSubmoduleFile(repoLink, submoduleFullPath, submodule.URL, submoduleCommit.ID.String()) } } diff --git a/services/gitdiff/submodule_test.go b/services/gitdiff/submodule_test.go index 9f2cf1d1c6040..81f1185bd1d8a 100644 --- a/services/gitdiff/submodule_test.go +++ b/services/gitdiff/submodule_test.go @@ -226,7 +226,7 @@ func TestSubmoduleInfo(t *testing.T) { assert.EqualValues(t, "aaaa...bbbb", sdi.CompareRefIDLinkHTML(ctx)) assert.EqualValues(t, "name", sdi.SubmoduleRepoLinkHTML(ctx)) - sdi.SubmoduleFile = git.NewCommitSubmoduleFile("/any/repo-link", "fullpath", "https://github.com/owner/repo", "1234") + sdi.SubmoduleFile = git.NewSubmoduleFile("/any/repo-link", "fullpath", "https://github.com/owner/repo", "1234") assert.EqualValues(t, `1111`, sdi.CommitRefIDLinkHTML(ctx, "1111")) assert.EqualValues(t, `aaaa...bbbb`, sdi.CompareRefIDLinkHTML(ctx)) assert.EqualValues(t, `name`, sdi.SubmoduleRepoLinkHTML(ctx)) diff --git a/services/repository/files/tree.go b/services/repository/files/tree.go index e481a3e7d2672..3d412ecd6807a 100644 --- a/services/repository/files/tree.go +++ b/services/repository/files/tree.go @@ -169,7 +169,7 @@ func newTreeViewNodeFromEntry(ctx context.Context, repoLink string, renderedIcon if subModule, err := commit.GetSubModule(node.FullPath); err != nil { log.Error("GetSubModule: %v", err) } else if subModule != nil { - submoduleFile := git.NewCommitSubmoduleFile(repoLink, node.FullPath, subModule.URL, entry.ID.String()) + submoduleFile := git.NewSubmoduleFile(repoLink, node.FullPath, subModule.URL, entry.ID.String()) webLink := submoduleFile.SubmoduleWebLinkTree(ctx) if webLink != nil { node.SubmoduleURL = webLink.CommitWebLink diff --git a/services/repository/generate.go b/services/repository/generate.go index caf15265a00a0..bc967b4915e79 100644 --- a/services/repository/generate.go +++ b/services/repository/generate.go @@ -239,7 +239,7 @@ func generateRepoCommit(ctx context.Context, repo, templateRepo, generateRepo *r } // Get active submodules from the template - submodules, err := git.GetTemplateSubmoduleCommits(ctx, tmpDir) + submodules, err := git.GetRepoSubmoduleFiles(ctx, tmpDir, "HEAD") if err != nil { return fmt.Errorf("GetTemplateSubmoduleCommits: %w", err) } @@ -274,7 +274,7 @@ func generateRepoCommit(ctx context.Context, repo, templateRepo, generateRepo *r return fmt.Errorf("git remote add: %w", err) } - if err = git.AddTemplateSubmoduleIndexes(ctx, tmpDir, submodules); err != nil { + if err = git.AddSubmodulesToRepoIndex(ctx, tmpDir, submodules); err != nil { return fmt.Errorf("failed to add submodules: %v", err) }