Make submodule link work with relative path (#35034)

Fix #35033
This commit is contained in:
wxiaoguang 2025-07-11 00:38:42 +08:00 committed by GitHub
parent 36a19f2569
commit f35dcfd489
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 47 additions and 30 deletions

View File

@ -6,17 +6,18 @@ package git
import ( import (
"context" "context"
"strings"
giturl "code.gitea.io/gitea/modules/git/url" giturl "code.gitea.io/gitea/modules/git/url"
) )
// CommitSubmoduleFile represents a file with submodule type. // CommitSubmoduleFile represents a file with submodule type.
type CommitSubmoduleFile struct { type CommitSubmoduleFile struct {
refURL string refURL string
parsedURL *giturl.RepositoryURL refID string
parsed bool
refID string parsed bool
repoLink string targetRepoLink string
} }
// NewCommitSubmoduleFile create a new submodule file // NewCommitSubmoduleFile create a new submodule file
@ -35,20 +36,27 @@ func (sf *CommitSubmoduleFile) SubmoduleWebLink(ctx context.Context, optCommitID
} }
if !sf.parsed { if !sf.parsed {
sf.parsed = true sf.parsed = true
parsedURL, err := giturl.ParseRepositoryURL(ctx, sf.refURL) if strings.HasPrefix(sf.refURL, "../") {
if err != nil { // FIXME: when handling relative path, this logic is not right. It needs to:
return nil // 1. Remember the submodule's full path and its commit's repo home link
// 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.parsedURL = parsedURL
sf.repoLink = giturl.MakeRepositoryWebLink(sf.parsedURL)
} }
var commitLink string var commitLink string
if len(optCommitID) == 2 { if len(optCommitID) == 2 {
commitLink = sf.repoLink + "/compare/" + optCommitID[0] + "..." + optCommitID[1] commitLink = sf.targetRepoLink + "/compare/" + optCommitID[0] + "..." + optCommitID[1]
} else if len(optCommitID) == 1 { } else if len(optCommitID) == 1 {
commitLink = sf.repoLink + "/tree/" + optCommitID[0] commitLink = sf.targetRepoLink + "/tree/" + optCommitID[0]
} else { } else {
commitLink = sf.repoLink + "/tree/" + sf.refID commitLink = sf.targetRepoLink + "/tree/" + sf.refID
} }
return &SubmoduleWebLink{RepoWebLink: sf.repoLink, CommitWebLink: commitLink} return &SubmoduleWebLink{RepoWebLink: sf.targetRepoLink, CommitWebLink: commitLink}
} }

View File

@ -10,20 +10,29 @@ import (
) )
func TestCommitSubmoduleLink(t *testing.T) { func TestCommitSubmoduleLink(t *testing.T) {
sf := NewCommitSubmoduleFile("git@github.com:user/repo.git", "aaaa") wl := (*CommitSubmoduleFile)(nil).SubmoduleWebLink(t.Context())
wl := sf.SubmoduleWebLink(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.SubmoduleWebLink(t.Context(), "1111")
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/compare/1111...2222", wl.CommitWebLink)
wl = (*CommitSubmoduleFile)(nil).SubmoduleWebLink(t.Context())
assert.Nil(t, wl) assert.Nil(t, wl)
t.Run("GitHubRepo", func(t *testing.T) {
sf := NewCommitSubmoduleFile("git@github.com:user/repo.git", "aaaa")
wl := sf.SubmoduleWebLink(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.SubmoduleWebLink(t.Context(), "1111")
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/compare/1111...2222", wl.CommitWebLink)
})
t.Run("RelativePath", func(t *testing.T) {
sf := NewCommitSubmoduleFile("../../user/repo", "aaaa")
wl := sf.SubmoduleWebLink(t.Context())
assert.Equal(t, "../../user/repo", wl.RepoWebLink)
assert.Equal(t, "../../user/repo/tree/aaaa", wl.CommitWebLink)
})
} }

View File

@ -71,7 +71,7 @@
#repo-files-table .repo-file-cell.name .entry-name { #repo-files-table .repo-file-cell.name .entry-name {
flex-shrink: 1; flex-shrink: 1;
min-width: 3em; min-width: 1ch; /* leave about one letter space when shrinking, need to fine tune the "shrinks" in this grid in the future */
} }
@media (max-width: 767.98px) { @media (max-width: 767.98px) {