diff options
Diffstat (limited to 'routers/web/repo/view_home.go')
-rw-r--r-- | routers/web/repo/view_home.go | 42 |
1 files changed, 24 insertions, 18 deletions
diff --git a/routers/web/repo/view_home.go b/routers/web/repo/view_home.go index fd6e746381..f475e93f60 100644 --- a/routers/web/repo/view_home.go +++ b/routers/web/repo/view_home.go @@ -19,8 +19,8 @@ import ( unit_model "code.gitea.io/gitea/models/unit" user_model "code.gitea.io/gitea/models/user" "code.gitea.io/gitea/modules/git" - giturl "code.gitea.io/gitea/modules/git/url" "code.gitea.io/gitea/modules/gitrepo" + "code.gitea.io/gitea/modules/htmlutil" "code.gitea.io/gitea/modules/httplib" "code.gitea.io/gitea/modules/log" repo_module "code.gitea.io/gitea/modules/repository" @@ -258,35 +258,41 @@ func handleRepoEmptyOrBroken(ctx *context.Context) { ctx.Redirect(link) } -func handleRepoViewSubmodule(ctx *context.Context, submodule *git.SubModule) { - // TODO: it needs to use git.NewCommitSubmoduleFile and SubmoduleWebLinkTree to correctly handle relative paths - submoduleRepoURL, err := giturl.ParseRepositoryURL(ctx, submodule.URL) - if err != nil { - HandleGitError(ctx, "handleRepoViewSubmodule: ParseRepositoryURL", err) +func isViewHomeOnlyContent(ctx *context.Context) bool { + return ctx.FormBool("only_content") +} + +func handleRepoViewSubmodule(ctx *context.Context, commitSubmoduleFile *git.CommitSubmoduleFile) { + submoduleWebLink := commitSubmoduleFile.SubmoduleWebLinkTree(ctx) + if submoduleWebLink == nil { + ctx.Data["NotFoundPrompt"] = ctx.Repo.TreePath + ctx.NotFound(nil) return } - submoduleURL := giturl.MakeRepositoryWebLink(submoduleRepoURL) - if httplib.IsCurrentGiteaSiteURL(ctx, submoduleURL) { - ctx.RedirectToCurrentSite(submoduleURL) - } else { + + redirectLink := submoduleWebLink.CommitWebLink + if isViewHomeOnlyContent(ctx) { + ctx.Resp.Header().Set("Content-Type", "text/html; charset=utf-8") + _, _ = ctx.Resp.Write([]byte(htmlutil.HTMLFormat(`<a href="%s">%s</a>`, redirectLink, redirectLink))) + } else if !httplib.IsCurrentGiteaSiteURL(ctx, redirectLink) { // don't auto-redirect to external URL, to avoid open redirect or phishing - ctx.Data["NotFoundPrompt"] = submoduleURL + ctx.Data["NotFoundPrompt"] = redirectLink ctx.NotFound(nil) + } else { + ctx.Redirect(submoduleWebLink.CommitWebLink) } } func prepareToRenderDirOrFile(entry *git.TreeEntry) func(ctx *context.Context) { return func(ctx *context.Context) { if entry.IsSubModule() { - submodule, err := ctx.Repo.Commit.GetSubModule(entry.Name()) + commitSubmoduleFile, err := git.GetCommitInfoSubmoduleFile(ctx.Repo.RepoLink, ctx.Repo.TreePath, ctx.Repo.Commit, entry.ID) if err != nil { - HandleGitError(ctx, "prepareToRenderDirOrFile: GetSubModule", err) + HandleGitError(ctx, "prepareToRenderDirOrFile: GetCommitInfoSubmoduleFile", err) return } - handleRepoViewSubmodule(ctx, submodule) - return - } - if entry.IsDir() { + handleRepoViewSubmodule(ctx, commitSubmoduleFile) + } else if entry.IsDir() { prepareToRenderDirectory(ctx) } else { prepareFileView(ctx, entry) @@ -441,7 +447,7 @@ func Home(ctx *context.Context) { } } - if ctx.FormBool("only_content") { + if isViewHomeOnlyContent(ctx) { ctx.HTML(http.StatusOK, tplRepoViewContent) } else if len(treeNames) != 0 { ctx.HTML(http.StatusOK, tplRepoView) |