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)
}