From ac2d97cb610d53d512545a6d0195173a5a690919 Mon Sep 17 00:00:00 2001 From: Rowan Bohde Date: Wed, 29 Jan 2025 18:09:52 -0600 Subject: [PATCH] Link to tree views of submodules if possible (#33424) This is a follow-up to https://github.com/go-gitea/gitea/pull/33097. When linking a submodule at a commit in either the repo view, or a diff when adding a new submodule, link to the tree view of that submodules intead of the individual commit. This shows the user the full tree, instead of the diff of the commit. This makes the assumption that the tree for a given SHA is at `/tree/`. This URL format is supported by both Github & Gitlab, but not Gitea. To fix this, add a redirect from `//tree/` to `//src/`, so that Gitea can support this URL structure. --- modules/git/commit_submodule_file.go | 4 ++-- modules/git/commit_submodule_file_test.go | 4 ++-- routers/web/repo/view_home.go | 6 ++++++ routers/web/web.go | 7 +++++++ services/gitdiff/submodule_test.go | 2 +- 5 files changed, 18 insertions(+), 5 deletions(-) diff --git a/modules/git/commit_submodule_file.go b/modules/git/commit_submodule_file.go index 2ac744fbf61..729401f7521 100644 --- a/modules/git/commit_submodule_file.go +++ b/modules/git/commit_submodule_file.go @@ -46,9 +46,9 @@ func (sf *CommitSubmoduleFile) SubmoduleWebLink(ctx context.Context, optCommitID if len(optCommitID) == 2 { commitLink = sf.repoLink + "/compare/" + optCommitID[0] + "..." + optCommitID[1] } else if len(optCommitID) == 1 { - commitLink = sf.repoLink + "/commit/" + optCommitID[0] + commitLink = sf.repoLink + "/tree/" + optCommitID[0] } else { - commitLink = sf.repoLink + "/commit/" + sf.refID + commitLink = sf.repoLink + "/tree/" + sf.refID } return &SubmoduleWebLink{RepoWebLink: sf.repoLink, CommitWebLink: commitLink} } diff --git a/modules/git/commit_submodule_file_test.go b/modules/git/commit_submodule_file_test.go index 4b5b7676126..98342aa9e97 100644 --- a/modules/git/commit_submodule_file_test.go +++ b/modules/git/commit_submodule_file_test.go @@ -15,11 +15,11 @@ func TestCommitSubmoduleLink(t *testing.T) { wl := sf.SubmoduleWebLink(context.Background()) assert.Equal(t, "https://github.com/user/repo", wl.RepoWebLink) - assert.Equal(t, "https://github.com/user/repo/commit/aaaa", wl.CommitWebLink) + assert.Equal(t, "https://github.com/user/repo/tree/aaaa", wl.CommitWebLink) wl = sf.SubmoduleWebLink(context.Background(), "1111") assert.Equal(t, "https://github.com/user/repo", wl.RepoWebLink) - assert.Equal(t, "https://github.com/user/repo/commit/1111", wl.CommitWebLink) + assert.Equal(t, "https://github.com/user/repo/tree/1111", wl.CommitWebLink) wl = sf.SubmoduleWebLink(context.Background(), "1111", "2222") assert.Equal(t, "https://github.com/user/repo", wl.RepoWebLink) diff --git a/routers/web/repo/view_home.go b/routers/web/repo/view_home.go index 456efb96f6e..6c6e007b50c 100644 --- a/routers/web/repo/view_home.go +++ b/routers/web/repo/view_home.go @@ -412,3 +412,9 @@ func Home(ctx *context.Context) { ctx.HTML(http.StatusOK, tplRepoHome) } + +// HomeRedirect redirects from /tree/* to /src/* in order to maintain a similar URL structure. +func HomeRedirect(ctx *context.Context) { + remainder := ctx.PathParam("*") + ctx.Redirect(ctx.Repo.RepoLink + "/src/" + util.PathEscapeSegments(remainder)) +} diff --git a/routers/web/web.go b/routers/web/web.go index fc01d81b509..096f1e6bbeb 100644 --- a/routers/web/web.go +++ b/routers/web/web.go @@ -1584,6 +1584,13 @@ func registerRoutes(m *web.Router) { m.Get("/*", context.RepoRefByType(""), repo.Home) // "/*" route is deprecated, and kept for backward compatibility }, repo.SetEditorconfigIfExists) + // Add a /tree/* path to redirect to the /src/* path, which + // will redirect to the canonical URL for that ref. This is + // included so that Gitea's repo URL structure matches what + // other forges provide, allowing clients to construct URLs + // that work across forges. + m.Get("/tree/*", repo.HomeRedirect) + m.Get("/forks", context.RepoRef(), repo.Forks) m.Get("/commit/{sha:([a-f0-9]{7,64})}.{ext:patch|diff}", repo.MustBeNotEmpty, repo.RawDiff) m.Post("/lastcommit/*", context.RepoRefByType(git.RefTypeCommit), repo.LastCommit) diff --git a/services/gitdiff/submodule_test.go b/services/gitdiff/submodule_test.go index 89f32c0e0c8..f0eab5557cf 100644 --- a/services/gitdiff/submodule_test.go +++ b/services/gitdiff/submodule_test.go @@ -230,7 +230,7 @@ func TestSubmoduleInfo(t *testing.T) { assert.EqualValues(t, "name", sdi.SubmoduleRepoLinkHTML(ctx)) sdi.SubmoduleFile = git.NewCommitSubmoduleFile("https://github.com/owner/repo", "1234") - assert.EqualValues(t, `1111`, sdi.CommitRefIDLinkHTML(ctx, "1111")) + assert.EqualValues(t, `1111`, sdi.CommitRefIDLinkHTML(ctx, "1111")) assert.EqualValues(t, `aaaa...bbbb`, sdi.CompareRefIDLinkHTML(ctx)) assert.EqualValues(t, `name`, sdi.SubmoduleRepoLinkHTML(ctx)) }