Skip to content

Commit 659c7d1

Browse files
committed
fix
1 parent 6090d70 commit 659c7d1

File tree

14 files changed

+77
-73
lines changed

14 files changed

+77
-73
lines changed

modules/git/commit_info_gogit.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ func (tes Entries) GetCommitsInfo(ctx context.Context, commit *Commit, treePath
8585
} else if subModule != nil {
8686
subModuleURL = subModule.URL
8787
}
88-
subModuleFile := NewCommitSubmoduleFile(subModuleURL, entry.ID.String())
88+
subModuleFile := NewCommitSubmoduleFile(fullPath, subModuleURL, entry.ID.String())
8989
commitsInfo[i].SubmoduleFile = subModuleFile
9090
}
9191
}

modules/git/commit_info_nogogit.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ func (tes Entries) GetCommitsInfo(ctx context.Context, commit *Commit, treePath
7676
} else if subModule != nil {
7777
subModuleURL = subModule.URL
7878
}
79-
subModuleFile := NewCommitSubmoduleFile(subModuleURL, entry.ID.String())
79+
subModuleFile := NewCommitSubmoduleFile(fullPath, subModuleURL, entry.ID.String())
8080
commitsInfo[i].SubmoduleFile = subModuleFile
8181
}
8282
}

modules/git/commit_submodule_file.go

Lines changed: 29 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -6,57 +6,56 @@ package git
66

77
import (
88
"context"
9+
"path"
910
"strings"
1011

1112
giturl "code.gitea.io/gitea/modules/git/url"
1213
)
1314

1415
// CommitSubmoduleFile represents a file with submodule type.
1516
type CommitSubmoduleFile struct {
16-
refURL string
17-
refID string
17+
fullPath string
18+
refURL string
19+
refID string
1820

19-
parsed bool
20-
targetRepoLink string
21+
parsed bool
22+
parsedTargetLink string
2123
}
2224

2325
// NewCommitSubmoduleFile create a new submodule file
24-
func NewCommitSubmoduleFile(refURL, refID string) *CommitSubmoduleFile {
25-
return &CommitSubmoduleFile{refURL: refURL, refID: refID}
26+
func NewCommitSubmoduleFile(fullPath, refURL, refID string) *CommitSubmoduleFile {
27+
return &CommitSubmoduleFile{fullPath: fullPath, refURL: refURL, refID: refID}
2628
}
2729

2830
func (sf *CommitSubmoduleFile) RefID() string {
29-
return sf.refID // this function is only used in templates
31+
return sf.refID
3032
}
3133

32-
// SubmoduleWebLink tries to make some web links for a submodule, it also works on "nil" receiver
33-
func (sf *CommitSubmoduleFile) SubmoduleWebLink(ctx context.Context, optCommitID ...string) *SubmoduleWebLink {
34+
func (sf *CommitSubmoduleFile) getWebLinkInTargetRepo(ctx context.Context, currentRepoHomeLink, moreLinkPath string) *SubmoduleWebLink {
3435
if sf == nil {
3536
return nil
3637
}
38+
if strings.HasPrefix(sf.refURL, "../") {
39+
targetLink := path.Join(currentRepoHomeLink, path.Dir(sf.fullPath), sf.refURL)
40+
return &SubmoduleWebLink{RepoWebLink: targetLink, CommitWebLink: targetLink + moreLinkPath}
41+
}
3742
if !sf.parsed {
3843
sf.parsed = true
39-
if strings.HasPrefix(sf.refURL, "../") {
40-
// FIXME: when handling relative path, this logic is not right. It needs to:
41-
// 1. Remember the submodule's full path and its commit's repo home link
42-
// 2. Resolve the relative path: targetRepoLink = path.Join(repoHomeLink, path.Dir(submoduleFullPath), refURL)
43-
// Not an easy task and need to refactor related code a lot.
44-
sf.targetRepoLink = sf.refURL
45-
} else {
46-
parsedURL, err := giturl.ParseRepositoryURL(ctx, sf.refURL)
47-
if err != nil {
48-
return nil
49-
}
50-
sf.targetRepoLink = giturl.MakeRepositoryWebLink(parsedURL)
44+
parsedURL, err := giturl.ParseRepositoryURL(ctx, sf.refURL)
45+
if err != nil {
46+
return nil
5147
}
48+
sf.parsedTargetLink = giturl.MakeRepositoryWebLink(parsedURL)
5249
}
53-
var commitLink string
54-
if len(optCommitID) == 2 {
55-
commitLink = sf.targetRepoLink + "/compare/" + optCommitID[0] + "..." + optCommitID[1]
56-
} else if len(optCommitID) == 1 {
57-
commitLink = sf.targetRepoLink + "/tree/" + optCommitID[0]
58-
} else {
59-
commitLink = sf.targetRepoLink + "/tree/" + sf.refID
60-
}
61-
return &SubmoduleWebLink{RepoWebLink: sf.targetRepoLink, CommitWebLink: commitLink}
50+
return &SubmoduleWebLink{RepoWebLink: sf.parsedTargetLink, CommitWebLink: sf.parsedTargetLink + moreLinkPath}
51+
}
52+
53+
// SubmoduleWebLinkTree tries to make the submodule's tree link in its own repo, it also works on "nil" receiver
54+
func (sf *CommitSubmoduleFile) SubmoduleWebLinkTree(ctx context.Context, currentRepoHomeLink, refCommitID string) *SubmoduleWebLink {
55+
return sf.getWebLinkInTargetRepo(ctx, currentRepoHomeLink, "/tree/"+refCommitID)
56+
}
57+
58+
// SubmoduleWebLinkCompare tries to make the submodule's compare link in its own repo, it also works on "nil" receiver
59+
func (sf *CommitSubmoduleFile) SubmoduleWebLinkCompare(ctx context.Context, currentRepoHomeLink, commitID1, commitID2 string) *SubmoduleWebLink {
60+
return sf.getWebLinkInTargetRepo(ctx, currentRepoHomeLink, "/compare/"+commitID1+"..."+commitID2)
6261
}

modules/git/commit_submodule_file_test.go

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -10,29 +10,31 @@ import (
1010
)
1111

1212
func TestCommitSubmoduleLink(t *testing.T) {
13-
wl := (*CommitSubmoduleFile)(nil).SubmoduleWebLink(t.Context())
14-
assert.Nil(t, wl)
13+
assert.Nil(t, (*CommitSubmoduleFile)(nil).SubmoduleWebLinkTree(t.Context(), "", ""))
14+
assert.Nil(t, (*CommitSubmoduleFile)(nil).SubmoduleWebLinkCompare(t.Context(), "", "", ""))
1515

1616
t.Run("GitHubRepo", func(t *testing.T) {
17-
sf := NewCommitSubmoduleFile("[email protected]:user/repo.git", "aaaa")
18-
19-
wl := sf.SubmoduleWebLink(t.Context())
17+
curRepoLink := "/any/repo-home-link"
18+
sf := NewCommitSubmoduleFile("full-path", "[email protected]:user/repo.git", "aaaa")
19+
wl := sf.SubmoduleWebLinkTree(t.Context(), curRepoLink, sf.RefID())
2020
assert.Equal(t, "https://github.com/user/repo", wl.RepoWebLink)
2121
assert.Equal(t, "https://github.com/user/repo/tree/aaaa", wl.CommitWebLink)
2222

23-
wl = sf.SubmoduleWebLink(t.Context(), "1111")
24-
assert.Equal(t, "https://github.com/user/repo", wl.RepoWebLink)
25-
assert.Equal(t, "https://github.com/user/repo/tree/1111", wl.CommitWebLink)
26-
27-
wl = sf.SubmoduleWebLink(t.Context(), "1111", "2222")
23+
wl = sf.SubmoduleWebLinkCompare(t.Context(), curRepoLink, "1111", "2222")
2824
assert.Equal(t, "https://github.com/user/repo", wl.RepoWebLink)
2925
assert.Equal(t, "https://github.com/user/repo/compare/1111...2222", wl.CommitWebLink)
3026
})
3127

3228
t.Run("RelativePath", func(t *testing.T) {
33-
sf := NewCommitSubmoduleFile("../../user/repo", "aaaa")
34-
wl := sf.SubmoduleWebLink(t.Context())
35-
assert.Equal(t, "../../user/repo", wl.RepoWebLink)
36-
assert.Equal(t, "../../user/repo/tree/aaaa", wl.CommitWebLink)
29+
curRepoLink := "/subpath/any/repo-home-link"
30+
sf := NewCommitSubmoduleFile("full-path", "../../user/repo", "aaaa")
31+
wl := sf.SubmoduleWebLinkTree(t.Context(), curRepoLink, sf.RefID())
32+
assert.Equal(t, "/subpath/user/repo", wl.RepoWebLink)
33+
assert.Equal(t, "/subpath/user/repo/tree/aaaa", wl.CommitWebLink)
34+
35+
sf = NewCommitSubmoduleFile("dir/submodule", "../../../user/repo", "aaaa")
36+
wl = sf.SubmoduleWebLinkCompare(t.Context(), curRepoLink, "1111", "2222")
37+
assert.Equal(t, "/subpath/user/repo", wl.RepoWebLink)
38+
assert.Equal(t, "/subpath/user/repo/compare/1111...2222", wl.CommitWebLink)
3739
})
3840
}

routers/web/repo/commit.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -311,7 +311,7 @@ func Diff(ctx *context.Context) {
311311
maxLines, maxFiles = -1, -1
312312
}
313313

314-
diff, err := gitdiff.GetDiffForRender(ctx, gitRepo, &gitdiff.DiffOptions{
314+
diff, err := gitdiff.GetDiffForRender(ctx, ctx.Repo.RepoLink, gitRepo, &gitdiff.DiffOptions{
315315
AfterCommitID: commitID,
316316
SkipTo: ctx.FormString("skip-to"),
317317
MaxLines: maxLines,

routers/web/repo/compare.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -614,7 +614,7 @@ func PrepareCompareDiff(
614614

615615
fileOnly := ctx.FormBool("file-only")
616616

617-
diff, err := gitdiff.GetDiffForRender(ctx, ci.HeadGitRepo,
617+
diff, err := gitdiff.GetDiffForRender(ctx, ci.HeadRepo.Link(), ci.HeadGitRepo,
618618
&gitdiff.DiffOptions{
619619
BeforeCommitID: beforeCommitID,
620620
AfterCommitID: headCommitID,

routers/web/repo/pull.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -750,7 +750,7 @@ func viewPullFiles(ctx *context.Context, specifiedStartCommit, specifiedEndCommi
750750
diffOptions.BeforeCommitID = startCommitID
751751
}
752752

753-
diff, err := gitdiff.GetDiffForRender(ctx, gitRepo, diffOptions, files...)
753+
diff, err := gitdiff.GetDiffForRender(ctx, ctx.Repo.RepoLink, gitRepo, diffOptions, files...)
754754
if err != nil {
755755
ctx.ServerError("GetDiff", err)
756756
return

routers/web/repo/treelist.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ func transformDiffTreeForWeb(renderedIconPool *fileicon.RenderedIconPool, diffTr
144144

145145
func TreeViewNodes(ctx *context.Context) {
146146
renderedIconPool := fileicon.NewRenderedIconPool()
147-
results, err := files_service.GetTreeViewNodes(ctx, renderedIconPool, ctx.Repo.Commit, ctx.Repo.TreePath, ctx.FormString("sub_path"))
147+
results, err := files_service.GetTreeViewNodes(ctx, ctx.Repo.RepoLink, renderedIconPool, ctx.Repo.Commit, ctx.Repo.TreePath, ctx.FormString("sub_path"))
148148
if err != nil {
149149
ctx.ServerError("GetTreeViewNodes", err)
150150
return

services/gitdiff/gitdiff.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1185,7 +1185,7 @@ func GetDiffForAPI(ctx context.Context, gitRepo *git.Repository, opts *DiffOptio
11851185
return diff, err
11861186
}
11871187

1188-
func GetDiffForRender(ctx context.Context, gitRepo *git.Repository, opts *DiffOptions, files ...string) (*Diff, error) {
1188+
func GetDiffForRender(ctx context.Context, repoHomeLink string, gitRepo *git.Repository, opts *DiffOptions, files ...string) (*Diff, error) {
11891189
diff, beforeCommit, afterCommit, err := getDiffBasic(ctx, gitRepo, opts, files...)
11901190
if err != nil {
11911191
return nil, err
@@ -1211,7 +1211,7 @@ func GetDiffForRender(ctx context.Context, gitRepo *git.Repository, opts *DiffOp
12111211

12121212
// Populate Submodule URLs
12131213
if diffFile.SubmoduleDiffInfo != nil {
1214-
diffFile.SubmoduleDiffInfo.PopulateURL(diffFile, beforeCommit, afterCommit)
1214+
diffFile.SubmoduleDiffInfo.PopulateURL(repoHomeLink, diffFile, beforeCommit, afterCommit)
12151215
}
12161216

12171217
if !isVendored.Has() {

services/gitdiff/submodule.go

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,15 @@ import (
1414
)
1515

1616
type SubmoduleDiffInfo struct {
17+
RepoHomeLink string
1718
SubmoduleName string
1819
SubmoduleFile *git.CommitSubmoduleFile // it might be nil if the submodule is not found or unable to parse
1920
NewRefID string
2021
PreviousRefID string
2122
}
2223

23-
func (si *SubmoduleDiffInfo) PopulateURL(diffFile *DiffFile, leftCommit, rightCommit *git.Commit) {
24-
si.SubmoduleName = diffFile.Name
24+
func (si *SubmoduleDiffInfo) PopulateURL(repoHomeLink string, diffFile *DiffFile, leftCommit, rightCommit *git.Commit) {
25+
si.RepoHomeLink, si.SubmoduleName = repoHomeLink, diffFile.Name
2526
submoduleCommit := rightCommit // If the submodule is added or updated, check at the right commit
2627
if diffFile.IsDeleted {
2728
submoduleCommit = leftCommit // If the submodule is deleted, check at the left commit
@@ -30,34 +31,35 @@ func (si *SubmoduleDiffInfo) PopulateURL(diffFile *DiffFile, leftCommit, rightCo
3031
return
3132
}
3233

33-
submodule, err := submoduleCommit.GetSubModule(diffFile.GetDiffFileName())
34+
submoduleFullPath := diffFile.GetDiffFileName()
35+
submodule, err := submoduleCommit.GetSubModule(submoduleFullPath)
3436
if err != nil {
35-
log.Error("Unable to PopulateURL for submodule %q: GetSubModule: %v", diffFile.GetDiffFileName(), err)
37+
log.Error("Unable to PopulateURL for submodule %q: GetSubModule: %v", submoduleFullPath, err)
3638
return // ignore the error, do not cause 500 errors for end users
3739
}
3840
if submodule != nil {
39-
si.SubmoduleFile = git.NewCommitSubmoduleFile(submodule.URL, submoduleCommit.ID.String())
41+
si.SubmoduleFile = git.NewCommitSubmoduleFile(submoduleFullPath, submodule.URL, submoduleCommit.ID.String())
4042
}
4143
}
4244

4345
func (si *SubmoduleDiffInfo) CommitRefIDLinkHTML(ctx context.Context, commitID string) template.HTML {
44-
webLink := si.SubmoduleFile.SubmoduleWebLink(ctx, commitID)
46+
webLink := si.SubmoduleFile.SubmoduleWebLinkTree(ctx, si.RepoHomeLink, commitID)
4547
if webLink == nil {
4648
return htmlutil.HTMLFormat("%s", base.ShortSha(commitID))
4749
}
4850
return htmlutil.HTMLFormat(`<a href="%s">%s</a>`, webLink.CommitWebLink, base.ShortSha(commitID))
4951
}
5052

5153
func (si *SubmoduleDiffInfo) CompareRefIDLinkHTML(ctx context.Context) template.HTML {
52-
webLink := si.SubmoduleFile.SubmoduleWebLink(ctx, si.PreviousRefID, si.NewRefID)
54+
webLink := si.SubmoduleFile.SubmoduleWebLinkCompare(ctx, si.RepoHomeLink, si.PreviousRefID, si.NewRefID)
5355
if webLink == nil {
5456
return htmlutil.HTMLFormat("%s...%s", base.ShortSha(si.PreviousRefID), base.ShortSha(si.NewRefID))
5557
}
5658
return htmlutil.HTMLFormat(`<a href="%s">%s...%s</a>`, webLink.CommitWebLink, base.ShortSha(si.PreviousRefID), base.ShortSha(si.NewRefID))
5759
}
5860

5961
func (si *SubmoduleDiffInfo) SubmoduleRepoLinkHTML(ctx context.Context) template.HTML {
60-
webLink := si.SubmoduleFile.SubmoduleWebLink(ctx)
62+
webLink := si.SubmoduleFile.SubmoduleWebLinkTree(ctx, si.RepoHomeLink, si.SubmoduleFile.RefID())
6163
if webLink == nil {
6264
return htmlutil.HTMLFormat("%s", si.SubmoduleName)
6365
}

0 commit comments

Comments
 (0)