aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorwxiaoguang <wxiaoguang@gmail.com>2025-07-11 00:38:42 +0800
committerGitHub <noreply@github.com>2025-07-10 16:38:42 +0000
commitf35dcfd489490ec9ad552bb38afc237ad94ed5a2 (patch)
tree01bcbfe5ff87d25e97753d5856bffc502f14ad33
parent36a19f2569493163d76ea95a5a3060fd1daae6de (diff)
downloadgitea-f35dcfd489490ec9ad552bb38afc237ad94ed5a2.tar.gz
gitea-f35dcfd489490ec9ad552bb38afc237ad94ed5a2.zip
Make submodule link work with relative path (#35034)
Fix #35033
-rw-r--r--modules/git/commit_submodule_file.go36
-rw-r--r--modules/git/commit_submodule_file_test.go33
-rw-r--r--web_src/css/repo/home-file-list.css2
3 files changed, 44 insertions, 27 deletions
diff --git a/modules/git/commit_submodule_file.go b/modules/git/commit_submodule_file.go
index 729401f752..5def80f3bd 100644
--- a/modules/git/commit_submodule_file.go
+++ b/modules/git/commit_submodule_file.go
@@ -6,17 +6,18 @@ package git
import (
"context"
+ "strings"
giturl "code.gitea.io/gitea/modules/git/url"
)
// CommitSubmoduleFile represents a file with submodule type.
type CommitSubmoduleFile struct {
- refURL string
- parsedURL *giturl.RepositoryURL
- parsed bool
- refID string
- repoLink string
+ refURL string
+ refID string
+
+ parsed bool
+ targetRepoLink string
}
// NewCommitSubmoduleFile create a new submodule file
@@ -35,20 +36,27 @@ func (sf *CommitSubmoduleFile) SubmoduleWebLink(ctx context.Context, optCommitID
}
if !sf.parsed {
sf.parsed = true
- parsedURL, err := giturl.ParseRepositoryURL(ctx, sf.refURL)
- if err != nil {
- return nil
+ if strings.HasPrefix(sf.refURL, "../") {
+ // FIXME: when handling relative path, this logic is not right. It needs to:
+ // 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
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 {
- commitLink = sf.repoLink + "/tree/" + optCommitID[0]
+ commitLink = sf.targetRepoLink + "/tree/" + optCommitID[0]
} 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}
}
diff --git a/modules/git/commit_submodule_file_test.go b/modules/git/commit_submodule_file_test.go
index 6581fa8712..103e55e920 100644
--- a/modules/git/commit_submodule_file_test.go
+++ b/modules/git/commit_submodule_file_test.go
@@ -10,20 +10,29 @@ import (
)
func TestCommitSubmoduleLink(t *testing.T) {
- sf := NewCommitSubmoduleFile("git@github.com:user/repo.git", "aaaa")
+ wl := (*CommitSubmoduleFile)(nil).SubmoduleWebLink(t.Context())
+ assert.Nil(t, wl)
- 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)
+ t.Run("GitHubRepo", func(t *testing.T) {
+ sf := NewCommitSubmoduleFile("git@github.com:user/repo.git", "aaaa")
- 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())
+ 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", "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 = 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 = (*CommitSubmoduleFile)(nil).SubmoduleWebLink(t.Context())
- assert.Nil(t, wl)
+ 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)
+ })
}
diff --git a/web_src/css/repo/home-file-list.css b/web_src/css/repo/home-file-list.css
index f2ab052a54..6aa9e4bca3 100644
--- a/web_src/css/repo/home-file-list.css
+++ b/web_src/css/repo/home-file-list.css
@@ -71,7 +71,7 @@
#repo-files-table .repo-file-cell.name .entry-name {
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) {