mirror of
https://github.com/go-gitea/gitea.git
synced 2025-07-18 00:02:52 +02:00
fix
This commit is contained in:
parent
6090d70915
commit
659c7d15a0
@ -85,7 +85,7 @@ func (tes Entries) GetCommitsInfo(ctx context.Context, commit *Commit, treePath
|
|||||||
} else if subModule != nil {
|
} else if subModule != nil {
|
||||||
subModuleURL = subModule.URL
|
subModuleURL = subModule.URL
|
||||||
}
|
}
|
||||||
subModuleFile := NewCommitSubmoduleFile(subModuleURL, entry.ID.String())
|
subModuleFile := NewCommitSubmoduleFile(fullPath, subModuleURL, entry.ID.String())
|
||||||
commitsInfo[i].SubmoduleFile = subModuleFile
|
commitsInfo[i].SubmoduleFile = subModuleFile
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -76,7 +76,7 @@ func (tes Entries) GetCommitsInfo(ctx context.Context, commit *Commit, treePath
|
|||||||
} else if subModule != nil {
|
} else if subModule != nil {
|
||||||
subModuleURL = subModule.URL
|
subModuleURL = subModule.URL
|
||||||
}
|
}
|
||||||
subModuleFile := NewCommitSubmoduleFile(subModuleURL, entry.ID.String())
|
subModuleFile := NewCommitSubmoduleFile(fullPath, subModuleURL, entry.ID.String())
|
||||||
commitsInfo[i].SubmoduleFile = subModuleFile
|
commitsInfo[i].SubmoduleFile = subModuleFile
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -6,6 +6,7 @@ package git
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"path"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
giturl "code.gitea.io/gitea/modules/git/url"
|
giturl "code.gitea.io/gitea/modules/git/url"
|
||||||
@ -13,50 +14,48 @@ import (
|
|||||||
|
|
||||||
// CommitSubmoduleFile represents a file with submodule type.
|
// CommitSubmoduleFile represents a file with submodule type.
|
||||||
type CommitSubmoduleFile struct {
|
type CommitSubmoduleFile struct {
|
||||||
refURL string
|
fullPath string
|
||||||
refID string
|
refURL string
|
||||||
|
refID string
|
||||||
|
|
||||||
parsed bool
|
parsed bool
|
||||||
targetRepoLink string
|
parsedTargetLink string
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewCommitSubmoduleFile create a new submodule file
|
// NewCommitSubmoduleFile create a new submodule file
|
||||||
func NewCommitSubmoduleFile(refURL, refID string) *CommitSubmoduleFile {
|
func NewCommitSubmoduleFile(fullPath, refURL, refID string) *CommitSubmoduleFile {
|
||||||
return &CommitSubmoduleFile{refURL: refURL, refID: refID}
|
return &CommitSubmoduleFile{fullPath: fullPath, refURL: refURL, refID: refID}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (sf *CommitSubmoduleFile) RefID() string {
|
func (sf *CommitSubmoduleFile) RefID() string {
|
||||||
return sf.refID // this function is only used in templates
|
return sf.refID
|
||||||
}
|
}
|
||||||
|
|
||||||
// SubmoduleWebLink tries to make some web links for a submodule, it also works on "nil" receiver
|
func (sf *CommitSubmoduleFile) getWebLinkInTargetRepo(ctx context.Context, currentRepoHomeLink, moreLinkPath string) *SubmoduleWebLink {
|
||||||
func (sf *CommitSubmoduleFile) SubmoduleWebLink(ctx context.Context, optCommitID ...string) *SubmoduleWebLink {
|
|
||||||
if sf == nil {
|
if sf == nil {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
if strings.HasPrefix(sf.refURL, "../") {
|
||||||
|
targetLink := path.Join(currentRepoHomeLink, path.Dir(sf.fullPath), sf.refURL)
|
||||||
|
return &SubmoduleWebLink{RepoWebLink: targetLink, CommitWebLink: targetLink + moreLinkPath}
|
||||||
|
}
|
||||||
if !sf.parsed {
|
if !sf.parsed {
|
||||||
sf.parsed = true
|
sf.parsed = true
|
||||||
if strings.HasPrefix(sf.refURL, "../") {
|
parsedURL, err := giturl.ParseRepositoryURL(ctx, sf.refURL)
|
||||||
// FIXME: when handling relative path, this logic is not right. It needs to:
|
if err != nil {
|
||||||
// 1. Remember the submodule's full path and its commit's repo home link
|
return nil
|
||||||
// 2. Resolve the relative path: targetRepoLink = path.Join(repoHomeLink, path.Dir(submoduleFullPath), refURL)
|
|
||||||
// Not an easy task and need to refactor related code a lot.
|
|
||||||
sf.targetRepoLink = sf.refURL
|
|
||||||
} else {
|
|
||||||
parsedURL, err := giturl.ParseRepositoryURL(ctx, sf.refURL)
|
|
||||||
if err != nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
sf.targetRepoLink = giturl.MakeRepositoryWebLink(parsedURL)
|
|
||||||
}
|
}
|
||||||
|
sf.parsedTargetLink = giturl.MakeRepositoryWebLink(parsedURL)
|
||||||
}
|
}
|
||||||
var commitLink string
|
return &SubmoduleWebLink{RepoWebLink: sf.parsedTargetLink, CommitWebLink: sf.parsedTargetLink + moreLinkPath}
|
||||||
if len(optCommitID) == 2 {
|
}
|
||||||
commitLink = sf.targetRepoLink + "/compare/" + optCommitID[0] + "..." + optCommitID[1]
|
|
||||||
} else if len(optCommitID) == 1 {
|
// SubmoduleWebLinkTree tries to make the submodule's tree link in its own repo, it also works on "nil" receiver
|
||||||
commitLink = sf.targetRepoLink + "/tree/" + optCommitID[0]
|
func (sf *CommitSubmoduleFile) SubmoduleWebLinkTree(ctx context.Context, currentRepoHomeLink, refCommitID string) *SubmoduleWebLink {
|
||||||
} else {
|
return sf.getWebLinkInTargetRepo(ctx, currentRepoHomeLink, "/tree/"+refCommitID)
|
||||||
commitLink = sf.targetRepoLink + "/tree/" + sf.refID
|
}
|
||||||
}
|
|
||||||
return &SubmoduleWebLink{RepoWebLink: sf.targetRepoLink, CommitWebLink: commitLink}
|
// SubmoduleWebLinkCompare tries to make the submodule's compare link in its own repo, it also works on "nil" receiver
|
||||||
|
func (sf *CommitSubmoduleFile) SubmoduleWebLinkCompare(ctx context.Context, currentRepoHomeLink, commitID1, commitID2 string) *SubmoduleWebLink {
|
||||||
|
return sf.getWebLinkInTargetRepo(ctx, currentRepoHomeLink, "/compare/"+commitID1+"..."+commitID2)
|
||||||
}
|
}
|
||||||
|
@ -10,29 +10,31 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func TestCommitSubmoduleLink(t *testing.T) {
|
func TestCommitSubmoduleLink(t *testing.T) {
|
||||||
wl := (*CommitSubmoduleFile)(nil).SubmoduleWebLink(t.Context())
|
assert.Nil(t, (*CommitSubmoduleFile)(nil).SubmoduleWebLinkTree(t.Context(), "", ""))
|
||||||
assert.Nil(t, wl)
|
assert.Nil(t, (*CommitSubmoduleFile)(nil).SubmoduleWebLinkCompare(t.Context(), "", "", ""))
|
||||||
|
|
||||||
t.Run("GitHubRepo", func(t *testing.T) {
|
t.Run("GitHubRepo", func(t *testing.T) {
|
||||||
sf := NewCommitSubmoduleFile("git@github.com:user/repo.git", "aaaa")
|
curRepoLink := "/any/repo-home-link"
|
||||||
|
sf := NewCommitSubmoduleFile("full-path", "git@github.com:user/repo.git", "aaaa")
|
||||||
wl := sf.SubmoduleWebLink(t.Context())
|
wl := sf.SubmoduleWebLinkTree(t.Context(), curRepoLink, sf.RefID())
|
||||||
assert.Equal(t, "https://github.com/user/repo", wl.RepoWebLink)
|
assert.Equal(t, "https://github.com/user/repo", wl.RepoWebLink)
|
||||||
assert.Equal(t, "https://github.com/user/repo/tree/aaaa", wl.CommitWebLink)
|
assert.Equal(t, "https://github.com/user/repo/tree/aaaa", wl.CommitWebLink)
|
||||||
|
|
||||||
wl = sf.SubmoduleWebLink(t.Context(), "1111")
|
wl = sf.SubmoduleWebLinkCompare(t.Context(), curRepoLink, "1111", "2222")
|
||||||
assert.Equal(t, "https://github.com/user/repo", wl.RepoWebLink)
|
|
||||||
assert.Equal(t, "https://github.com/user/repo/tree/1111", wl.CommitWebLink)
|
|
||||||
|
|
||||||
wl = sf.SubmoduleWebLink(t.Context(), "1111", "2222")
|
|
||||||
assert.Equal(t, "https://github.com/user/repo", wl.RepoWebLink)
|
assert.Equal(t, "https://github.com/user/repo", wl.RepoWebLink)
|
||||||
assert.Equal(t, "https://github.com/user/repo/compare/1111...2222", wl.CommitWebLink)
|
assert.Equal(t, "https://github.com/user/repo/compare/1111...2222", wl.CommitWebLink)
|
||||||
})
|
})
|
||||||
|
|
||||||
t.Run("RelativePath", func(t *testing.T) {
|
t.Run("RelativePath", func(t *testing.T) {
|
||||||
sf := NewCommitSubmoduleFile("../../user/repo", "aaaa")
|
curRepoLink := "/subpath/any/repo-home-link"
|
||||||
wl := sf.SubmoduleWebLink(t.Context())
|
sf := NewCommitSubmoduleFile("full-path", "../../user/repo", "aaaa")
|
||||||
assert.Equal(t, "../../user/repo", wl.RepoWebLink)
|
wl := sf.SubmoduleWebLinkTree(t.Context(), curRepoLink, sf.RefID())
|
||||||
assert.Equal(t, "../../user/repo/tree/aaaa", wl.CommitWebLink)
|
assert.Equal(t, "/subpath/user/repo", wl.RepoWebLink)
|
||||||
|
assert.Equal(t, "/subpath/user/repo/tree/aaaa", wl.CommitWebLink)
|
||||||
|
|
||||||
|
sf = NewCommitSubmoduleFile("dir/submodule", "../../../user/repo", "aaaa")
|
||||||
|
wl = sf.SubmoduleWebLinkCompare(t.Context(), curRepoLink, "1111", "2222")
|
||||||
|
assert.Equal(t, "/subpath/user/repo", wl.RepoWebLink)
|
||||||
|
assert.Equal(t, "/subpath/user/repo/compare/1111...2222", wl.CommitWebLink)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -311,7 +311,7 @@ func Diff(ctx *context.Context) {
|
|||||||
maxLines, maxFiles = -1, -1
|
maxLines, maxFiles = -1, -1
|
||||||
}
|
}
|
||||||
|
|
||||||
diff, err := gitdiff.GetDiffForRender(ctx, gitRepo, &gitdiff.DiffOptions{
|
diff, err := gitdiff.GetDiffForRender(ctx, ctx.Repo.RepoLink, gitRepo, &gitdiff.DiffOptions{
|
||||||
AfterCommitID: commitID,
|
AfterCommitID: commitID,
|
||||||
SkipTo: ctx.FormString("skip-to"),
|
SkipTo: ctx.FormString("skip-to"),
|
||||||
MaxLines: maxLines,
|
MaxLines: maxLines,
|
||||||
|
@ -614,7 +614,7 @@ func PrepareCompareDiff(
|
|||||||
|
|
||||||
fileOnly := ctx.FormBool("file-only")
|
fileOnly := ctx.FormBool("file-only")
|
||||||
|
|
||||||
diff, err := gitdiff.GetDiffForRender(ctx, ci.HeadGitRepo,
|
diff, err := gitdiff.GetDiffForRender(ctx, ci.HeadRepo.Link(), ci.HeadGitRepo,
|
||||||
&gitdiff.DiffOptions{
|
&gitdiff.DiffOptions{
|
||||||
BeforeCommitID: beforeCommitID,
|
BeforeCommitID: beforeCommitID,
|
||||||
AfterCommitID: headCommitID,
|
AfterCommitID: headCommitID,
|
||||||
|
@ -750,7 +750,7 @@ func viewPullFiles(ctx *context.Context, specifiedStartCommit, specifiedEndCommi
|
|||||||
diffOptions.BeforeCommitID = startCommitID
|
diffOptions.BeforeCommitID = startCommitID
|
||||||
}
|
}
|
||||||
|
|
||||||
diff, err := gitdiff.GetDiffForRender(ctx, gitRepo, diffOptions, files...)
|
diff, err := gitdiff.GetDiffForRender(ctx, ctx.Repo.RepoLink, gitRepo, diffOptions, files...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
ctx.ServerError("GetDiff", err)
|
ctx.ServerError("GetDiff", err)
|
||||||
return
|
return
|
||||||
|
@ -144,7 +144,7 @@ func transformDiffTreeForWeb(renderedIconPool *fileicon.RenderedIconPool, diffTr
|
|||||||
|
|
||||||
func TreeViewNodes(ctx *context.Context) {
|
func TreeViewNodes(ctx *context.Context) {
|
||||||
renderedIconPool := fileicon.NewRenderedIconPool()
|
renderedIconPool := fileicon.NewRenderedIconPool()
|
||||||
results, err := files_service.GetTreeViewNodes(ctx, renderedIconPool, ctx.Repo.Commit, ctx.Repo.TreePath, ctx.FormString("sub_path"))
|
results, err := files_service.GetTreeViewNodes(ctx, ctx.Repo.RepoLink, renderedIconPool, ctx.Repo.Commit, ctx.Repo.TreePath, ctx.FormString("sub_path"))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
ctx.ServerError("GetTreeViewNodes", err)
|
ctx.ServerError("GetTreeViewNodes", err)
|
||||||
return
|
return
|
||||||
|
@ -1185,7 +1185,7 @@ func GetDiffForAPI(ctx context.Context, gitRepo *git.Repository, opts *DiffOptio
|
|||||||
return diff, err
|
return diff, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func GetDiffForRender(ctx context.Context, gitRepo *git.Repository, opts *DiffOptions, files ...string) (*Diff, error) {
|
func GetDiffForRender(ctx context.Context, repoHomeLink string, gitRepo *git.Repository, opts *DiffOptions, files ...string) (*Diff, error) {
|
||||||
diff, beforeCommit, afterCommit, err := getDiffBasic(ctx, gitRepo, opts, files...)
|
diff, beforeCommit, afterCommit, err := getDiffBasic(ctx, gitRepo, opts, files...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
@ -1211,7 +1211,7 @@ func GetDiffForRender(ctx context.Context, gitRepo *git.Repository, opts *DiffOp
|
|||||||
|
|
||||||
// Populate Submodule URLs
|
// Populate Submodule URLs
|
||||||
if diffFile.SubmoduleDiffInfo != nil {
|
if diffFile.SubmoduleDiffInfo != nil {
|
||||||
diffFile.SubmoduleDiffInfo.PopulateURL(diffFile, beforeCommit, afterCommit)
|
diffFile.SubmoduleDiffInfo.PopulateURL(repoHomeLink, diffFile, beforeCommit, afterCommit)
|
||||||
}
|
}
|
||||||
|
|
||||||
if !isVendored.Has() {
|
if !isVendored.Has() {
|
||||||
|
@ -14,14 +14,15 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type SubmoduleDiffInfo struct {
|
type SubmoduleDiffInfo struct {
|
||||||
|
RepoHomeLink string
|
||||||
SubmoduleName string
|
SubmoduleName string
|
||||||
SubmoduleFile *git.CommitSubmoduleFile // it might be nil if the submodule is not found or unable to parse
|
SubmoduleFile *git.CommitSubmoduleFile // it might be nil if the submodule is not found or unable to parse
|
||||||
NewRefID string
|
NewRefID string
|
||||||
PreviousRefID string
|
PreviousRefID string
|
||||||
}
|
}
|
||||||
|
|
||||||
func (si *SubmoduleDiffInfo) PopulateURL(diffFile *DiffFile, leftCommit, rightCommit *git.Commit) {
|
func (si *SubmoduleDiffInfo) PopulateURL(repoHomeLink string, diffFile *DiffFile, leftCommit, rightCommit *git.Commit) {
|
||||||
si.SubmoduleName = diffFile.Name
|
si.RepoHomeLink, si.SubmoduleName = repoHomeLink, diffFile.Name
|
||||||
submoduleCommit := rightCommit // If the submodule is added or updated, check at the right commit
|
submoduleCommit := rightCommit // If the submodule is added or updated, check at the right commit
|
||||||
if diffFile.IsDeleted {
|
if diffFile.IsDeleted {
|
||||||
submoduleCommit = leftCommit // If the submodule is deleted, check at the left commit
|
submoduleCommit = leftCommit // If the submodule is deleted, check at the left commit
|
||||||
@ -30,18 +31,19 @@ func (si *SubmoduleDiffInfo) PopulateURL(diffFile *DiffFile, leftCommit, rightCo
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
submodule, err := submoduleCommit.GetSubModule(diffFile.GetDiffFileName())
|
submoduleFullPath := diffFile.GetDiffFileName()
|
||||||
|
submodule, err := submoduleCommit.GetSubModule(submoduleFullPath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Error("Unable to PopulateURL for submodule %q: GetSubModule: %v", diffFile.GetDiffFileName(), err)
|
log.Error("Unable to PopulateURL for submodule %q: GetSubModule: %v", submoduleFullPath, err)
|
||||||
return // ignore the error, do not cause 500 errors for end users
|
return // ignore the error, do not cause 500 errors for end users
|
||||||
}
|
}
|
||||||
if submodule != nil {
|
if submodule != nil {
|
||||||
si.SubmoduleFile = git.NewCommitSubmoduleFile(submodule.URL, submoduleCommit.ID.String())
|
si.SubmoduleFile = git.NewCommitSubmoduleFile(submoduleFullPath, submodule.URL, submoduleCommit.ID.String())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (si *SubmoduleDiffInfo) CommitRefIDLinkHTML(ctx context.Context, commitID string) template.HTML {
|
func (si *SubmoduleDiffInfo) CommitRefIDLinkHTML(ctx context.Context, commitID string) template.HTML {
|
||||||
webLink := si.SubmoduleFile.SubmoduleWebLink(ctx, commitID)
|
webLink := si.SubmoduleFile.SubmoduleWebLinkTree(ctx, si.RepoHomeLink, commitID)
|
||||||
if webLink == nil {
|
if webLink == nil {
|
||||||
return htmlutil.HTMLFormat("%s", base.ShortSha(commitID))
|
return htmlutil.HTMLFormat("%s", base.ShortSha(commitID))
|
||||||
}
|
}
|
||||||
@ -49,7 +51,7 @@ func (si *SubmoduleDiffInfo) CommitRefIDLinkHTML(ctx context.Context, commitID s
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (si *SubmoduleDiffInfo) CompareRefIDLinkHTML(ctx context.Context) template.HTML {
|
func (si *SubmoduleDiffInfo) CompareRefIDLinkHTML(ctx context.Context) template.HTML {
|
||||||
webLink := si.SubmoduleFile.SubmoduleWebLink(ctx, si.PreviousRefID, si.NewRefID)
|
webLink := si.SubmoduleFile.SubmoduleWebLinkCompare(ctx, si.RepoHomeLink, si.PreviousRefID, si.NewRefID)
|
||||||
if webLink == nil {
|
if webLink == nil {
|
||||||
return htmlutil.HTMLFormat("%s...%s", base.ShortSha(si.PreviousRefID), base.ShortSha(si.NewRefID))
|
return htmlutil.HTMLFormat("%s...%s", base.ShortSha(si.PreviousRefID), base.ShortSha(si.NewRefID))
|
||||||
}
|
}
|
||||||
@ -57,7 +59,7 @@ func (si *SubmoduleDiffInfo) CompareRefIDLinkHTML(ctx context.Context) template.
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (si *SubmoduleDiffInfo) SubmoduleRepoLinkHTML(ctx context.Context) template.HTML {
|
func (si *SubmoduleDiffInfo) SubmoduleRepoLinkHTML(ctx context.Context) template.HTML {
|
||||||
webLink := si.SubmoduleFile.SubmoduleWebLink(ctx)
|
webLink := si.SubmoduleFile.SubmoduleWebLinkTree(ctx, si.RepoHomeLink, si.SubmoduleFile.RefID())
|
||||||
if webLink == nil {
|
if webLink == nil {
|
||||||
return htmlutil.HTMLFormat("%s", si.SubmoduleName)
|
return htmlutil.HTMLFormat("%s", si.SubmoduleName)
|
||||||
}
|
}
|
||||||
|
@ -227,7 +227,7 @@ func TestSubmoduleInfo(t *testing.T) {
|
|||||||
assert.EqualValues(t, "aaaa...bbbb", sdi.CompareRefIDLinkHTML(ctx))
|
assert.EqualValues(t, "aaaa...bbbb", sdi.CompareRefIDLinkHTML(ctx))
|
||||||
assert.EqualValues(t, "name", sdi.SubmoduleRepoLinkHTML(ctx))
|
assert.EqualValues(t, "name", sdi.SubmoduleRepoLinkHTML(ctx))
|
||||||
|
|
||||||
sdi.SubmoduleFile = git.NewCommitSubmoduleFile("https://github.com/owner/repo", "1234")
|
sdi.SubmoduleFile = git.NewCommitSubmoduleFile("fullpath", "https://github.com/owner/repo", "1234")
|
||||||
assert.EqualValues(t, `<a href="https://github.com/owner/repo/tree/1111">1111</a>`, sdi.CommitRefIDLinkHTML(ctx, "1111"))
|
assert.EqualValues(t, `<a href="https://github.com/owner/repo/tree/1111">1111</a>`, sdi.CommitRefIDLinkHTML(ctx, "1111"))
|
||||||
assert.EqualValues(t, `<a href="https://github.com/owner/repo/compare/aaaa...bbbb">aaaa...bbbb</a>`, sdi.CompareRefIDLinkHTML(ctx))
|
assert.EqualValues(t, `<a href="https://github.com/owner/repo/compare/aaaa...bbbb">aaaa...bbbb</a>`, sdi.CompareRefIDLinkHTML(ctx))
|
||||||
assert.EqualValues(t, `<a href="https://github.com/owner/repo">name</a>`, sdi.SubmoduleRepoLinkHTML(ctx))
|
assert.EqualValues(t, `<a href="https://github.com/owner/repo">name</a>`, sdi.SubmoduleRepoLinkHTML(ctx))
|
||||||
|
@ -154,7 +154,7 @@ func (node *TreeViewNode) sortLevel() int {
|
|||||||
return util.Iif(node.EntryMode == "tree" || node.EntryMode == "commit", 0, 1)
|
return util.Iif(node.EntryMode == "tree" || node.EntryMode == "commit", 0, 1)
|
||||||
}
|
}
|
||||||
|
|
||||||
func newTreeViewNodeFromEntry(ctx context.Context, renderedIconPool *fileicon.RenderedIconPool, commit *git.Commit, parentDir string, entry *git.TreeEntry) *TreeViewNode {
|
func newTreeViewNodeFromEntry(ctx context.Context, repoHomeLink string, renderedIconPool *fileicon.RenderedIconPool, commit *git.Commit, parentDir string, entry *git.TreeEntry) *TreeViewNode {
|
||||||
node := &TreeViewNode{
|
node := &TreeViewNode{
|
||||||
EntryName: entry.Name(),
|
EntryName: entry.Name(),
|
||||||
EntryMode: entryModeString(entry.Mode()),
|
EntryMode: entryModeString(entry.Mode()),
|
||||||
@ -172,8 +172,8 @@ func newTreeViewNodeFromEntry(ctx context.Context, renderedIconPool *fileicon.Re
|
|||||||
if subModule, err := commit.GetSubModule(node.FullPath); err != nil {
|
if subModule, err := commit.GetSubModule(node.FullPath); err != nil {
|
||||||
log.Error("GetSubModule: %v", err)
|
log.Error("GetSubModule: %v", err)
|
||||||
} else if subModule != nil {
|
} else if subModule != nil {
|
||||||
submoduleFile := git.NewCommitSubmoduleFile(subModule.URL, entry.ID.String())
|
submoduleFile := git.NewCommitSubmoduleFile(node.FullPath, subModule.URL, entry.ID.String())
|
||||||
webLink := submoduleFile.SubmoduleWebLink(ctx)
|
webLink := submoduleFile.SubmoduleWebLinkTree(ctx, repoHomeLink, submoduleFile.RefID())
|
||||||
node.SubmoduleURL = webLink.CommitWebLink
|
node.SubmoduleURL = webLink.CommitWebLink
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -192,7 +192,7 @@ func sortTreeViewNodes(nodes []*TreeViewNode) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func listTreeNodes(ctx context.Context, renderedIconPool *fileicon.RenderedIconPool, commit *git.Commit, tree *git.Tree, treePath, subPath string) ([]*TreeViewNode, error) {
|
func listTreeNodes(ctx context.Context, repoHomeLink string, renderedIconPool *fileicon.RenderedIconPool, commit *git.Commit, tree *git.Tree, treePath, subPath string) ([]*TreeViewNode, error) {
|
||||||
entries, err := tree.ListEntries()
|
entries, err := tree.ListEntries()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
@ -201,14 +201,14 @@ func listTreeNodes(ctx context.Context, renderedIconPool *fileicon.RenderedIconP
|
|||||||
subPathDirName, subPathRemaining, _ := strings.Cut(subPath, "/")
|
subPathDirName, subPathRemaining, _ := strings.Cut(subPath, "/")
|
||||||
nodes := make([]*TreeViewNode, 0, len(entries))
|
nodes := make([]*TreeViewNode, 0, len(entries))
|
||||||
for _, entry := range entries {
|
for _, entry := range entries {
|
||||||
node := newTreeViewNodeFromEntry(ctx, renderedIconPool, commit, treePath, entry)
|
node := newTreeViewNodeFromEntry(ctx, repoHomeLink, renderedIconPool, commit, treePath, entry)
|
||||||
nodes = append(nodes, node)
|
nodes = append(nodes, node)
|
||||||
if entry.IsDir() && subPathDirName == entry.Name() {
|
if entry.IsDir() && subPathDirName == entry.Name() {
|
||||||
subTreePath := treePath + "/" + node.EntryName
|
subTreePath := treePath + "/" + node.EntryName
|
||||||
if subTreePath[0] == '/' {
|
if subTreePath[0] == '/' {
|
||||||
subTreePath = subTreePath[1:]
|
subTreePath = subTreePath[1:]
|
||||||
}
|
}
|
||||||
subNodes, err := listTreeNodes(ctx, renderedIconPool, commit, entry.Tree(), subTreePath, subPathRemaining)
|
subNodes, err := listTreeNodes(ctx, repoHomeLink, renderedIconPool, commit, entry.Tree(), subTreePath, subPathRemaining)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Error("listTreeNodes: %v", err)
|
log.Error("listTreeNodes: %v", err)
|
||||||
} else {
|
} else {
|
||||||
@ -220,10 +220,10 @@ func listTreeNodes(ctx context.Context, renderedIconPool *fileicon.RenderedIconP
|
|||||||
return nodes, nil
|
return nodes, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func GetTreeViewNodes(ctx context.Context, renderedIconPool *fileicon.RenderedIconPool, commit *git.Commit, treePath, subPath string) ([]*TreeViewNode, error) {
|
func GetTreeViewNodes(ctx context.Context, repoHomeLink string, renderedIconPool *fileicon.RenderedIconPool, commit *git.Commit, treePath, subPath string) ([]*TreeViewNode, error) {
|
||||||
entry, err := commit.GetTreeEntryByPath(treePath)
|
entry, err := commit.GetTreeEntryByPath(treePath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return listTreeNodes(ctx, renderedIconPool, commit, entry.Tree(), treePath, subPath)
|
return listTreeNodes(ctx, repoHomeLink, renderedIconPool, commit, entry.Tree(), treePath, subPath)
|
||||||
}
|
}
|
||||||
|
@ -64,6 +64,7 @@ func TestGetTreeViewNodes(t *testing.T) {
|
|||||||
contexttest.LoadGitRepo(t, ctx)
|
contexttest.LoadGitRepo(t, ctx)
|
||||||
defer ctx.Repo.GitRepo.Close()
|
defer ctx.Repo.GitRepo.Close()
|
||||||
|
|
||||||
|
curRepoLink := "/any/repo-home-link"
|
||||||
renderedIconPool := fileicon.NewRenderedIconPool()
|
renderedIconPool := fileicon.NewRenderedIconPool()
|
||||||
mockIconForFile := func(id string) template.HTML {
|
mockIconForFile := func(id string) template.HTML {
|
||||||
return template.HTML(`<svg class="svg git-entry-icon octicon-file" width="16" height="16" aria-hidden="true"><use xlink:href="#` + id + `"></use></svg>`)
|
return template.HTML(`<svg class="svg git-entry-icon octicon-file" width="16" height="16" aria-hidden="true"><use xlink:href="#` + id + `"></use></svg>`)
|
||||||
@ -74,7 +75,7 @@ func TestGetTreeViewNodes(t *testing.T) {
|
|||||||
mockOpenIconForFolder := func(id string) template.HTML {
|
mockOpenIconForFolder := func(id string) template.HTML {
|
||||||
return template.HTML(`<svg class="svg git-entry-icon octicon-file-directory-open-fill" width="16" height="16" aria-hidden="true"><use xlink:href="#` + id + `"></use></svg>`)
|
return template.HTML(`<svg class="svg git-entry-icon octicon-file-directory-open-fill" width="16" height="16" aria-hidden="true"><use xlink:href="#` + id + `"></use></svg>`)
|
||||||
}
|
}
|
||||||
treeNodes, err := GetTreeViewNodes(ctx, renderedIconPool, ctx.Repo.Commit, "", "")
|
treeNodes, err := GetTreeViewNodes(ctx, curRepoLink, renderedIconPool, ctx.Repo.Commit, "", "")
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.Equal(t, []*TreeViewNode{
|
assert.Equal(t, []*TreeViewNode{
|
||||||
{
|
{
|
||||||
@ -86,7 +87,7 @@ func TestGetTreeViewNodes(t *testing.T) {
|
|||||||
},
|
},
|
||||||
}, treeNodes)
|
}, treeNodes)
|
||||||
|
|
||||||
treeNodes, err = GetTreeViewNodes(ctx, renderedIconPool, ctx.Repo.Commit, "", "docs/README.md")
|
treeNodes, err = GetTreeViewNodes(ctx, curRepoLink, renderedIconPool, ctx.Repo.Commit, "", "docs/README.md")
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.Equal(t, []*TreeViewNode{
|
assert.Equal(t, []*TreeViewNode{
|
||||||
{
|
{
|
||||||
@ -106,7 +107,7 @@ func TestGetTreeViewNodes(t *testing.T) {
|
|||||||
},
|
},
|
||||||
}, treeNodes)
|
}, treeNodes)
|
||||||
|
|
||||||
treeNodes, err = GetTreeViewNodes(ctx, renderedIconPool, ctx.Repo.Commit, "docs", "README.md")
|
treeNodes, err = GetTreeViewNodes(ctx, curRepoLink, renderedIconPool, ctx.Repo.Commit, "docs", "README.md")
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.Equal(t, []*TreeViewNode{
|
assert.Equal(t, []*TreeViewNode{
|
||||||
{
|
{
|
||||||
|
@ -18,7 +18,7 @@
|
|||||||
<div class="repo-file-cell name muted-links {{if not $commit}}notready{{end}}">
|
<div class="repo-file-cell name muted-links {{if not $commit}}notready{{end}}">
|
||||||
{{index $.FileIcons $entry.Name}}
|
{{index $.FileIcons $entry.Name}}
|
||||||
{{if $entry.IsSubModule}}
|
{{if $entry.IsSubModule}}
|
||||||
{{$submoduleLink := $submoduleFile.SubmoduleWebLink ctx}}
|
{{$submoduleLink := $submoduleFile.SubmoduleWebLinkTree ctx $.RepoLink $submoduleFile.RefID}}
|
||||||
{{if $submoduleLink}}
|
{{if $submoduleLink}}
|
||||||
<a class="entry-name" href="{{$submoduleLink.RepoWebLink}}" title="{{$entry.Name}}">{{$entry.Name}}</a>
|
<a class="entry-name" href="{{$submoduleLink.RepoWebLink}}" title="{{$entry.Name}}">{{$entry.Name}}</a>
|
||||||
@ <a class="text primary" href="{{$submoduleLink.CommitWebLink}}">{{ShortSha $submoduleFile.RefID}}</a>
|
@ <a class="text primary" href="{{$submoduleLink.CommitWebLink}}">{{ShortSha $submoduleFile.RefID}}</a>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user