diff --git a/routers/web/repo/branch.go b/routers/web/repo/branch.go index 4a62237838a4a..ee1389cf3de5b 100644 --- a/routers/web/repo/branch.go +++ b/routers/web/repo/branch.go @@ -24,6 +24,7 @@ import ( "code.gitea.io/gitea/modules/util" "code.gitea.io/gitea/modules/web" "code.gitea.io/gitea/routers/utils" + "code.gitea.io/gitea/routers/web/repo/shared" "code.gitea.io/gitea/services/context" "code.gitea.io/gitea/services/forms" release_service "code.gitea.io/gitea/services/release" @@ -46,6 +47,10 @@ func Branches(ctx *context.Context) { ctx.Data["PageIsViewCode"] = true ctx.Data["PageIsBranches"] = true + if !shared.PrepareRepoSubMenu(ctx) { + return + } + page := ctx.FormInt("page") if page <= 1 { page = 1 @@ -89,7 +94,6 @@ func Branches(ctx *context.Context) { pager := context.NewPagination(int(branchesCount), pageSize, page, 5) pager.SetDefaultParams(ctx) ctx.Data["Page"] = pager - ctx.Data["LicenseFileName"] = repo_service.LicenseFileName ctx.HTML(http.StatusOK, tplBranch) } diff --git a/routers/web/repo/commit.go b/routers/web/repo/commit.go index 0be9689c3f5e3..c4847e7297d49 100644 --- a/routers/web/repo/commit.go +++ b/routers/web/repo/commit.go @@ -28,6 +28,7 @@ import ( "code.gitea.io/gitea/modules/markup" "code.gitea.io/gitea/modules/setting" "code.gitea.io/gitea/modules/util" + "code.gitea.io/gitea/routers/web/repo/shared" "code.gitea.io/gitea/services/context" "code.gitea.io/gitea/services/gitdiff" repo_service "code.gitea.io/gitea/services/repository" @@ -61,9 +62,7 @@ func Commits(ctx *context.Context) { } ctx.Data["PageIsViewCode"] = true - commitsCount, err := ctx.Repo.GetCommitsCount() - if err != nil { - ctx.ServerError("GetCommitsCount", err) + if !shared.PrepareRepoSubMenu(ctx) { return } @@ -97,12 +96,11 @@ func Commits(ctx *context.Context) { } ctx.Data["Username"] = ctx.Repo.Owner.Name ctx.Data["Reponame"] = ctx.Repo.Repository.Name - ctx.Data["CommitCount"] = commitsCount + ctx.Data["CommitCount"] = ctx.Repo.CommitsCount - pager := context.NewPagination(int(commitsCount), pageSize, page, 5) + pager := context.NewPagination(int(ctx.Repo.CommitsCount), pageSize, page, 5) pager.SetDefaultParams(ctx) ctx.Data["Page"] = pager - ctx.Data["LicenseFileName"] = repo_service.LicenseFileName ctx.HTML(http.StatusOK, tplCommits) } @@ -197,6 +195,10 @@ func SearchCommits(ctx *context.Context) { ctx.Data["PageIsCommits"] = true ctx.Data["PageIsViewCode"] = true + if !shared.PrepareRepoSubMenu(ctx) { + return + } + query := ctx.FormTrim("q") if len(query) == 0 { ctx.Redirect(ctx.Repo.RepoLink + "/commits/" + ctx.Repo.BranchNameSubURL()) @@ -220,7 +222,6 @@ func SearchCommits(ctx *context.Context) { ctx.Data["Username"] = ctx.Repo.Owner.Name ctx.Data["Reponame"] = ctx.Repo.Repository.Name ctx.Data["RefName"] = ctx.Repo.RefName - ctx.Data["LicenseFileName"] = repo_service.LicenseFileName ctx.HTML(http.StatusOK, tplCommits) } @@ -232,6 +233,10 @@ func FileHistory(ctx *context.Context) { return } + if !shared.PrepareRepoSubMenu(ctx) { + return + } + commitsCount, err := ctx.Repo.GitRepo.FileCommitsCount(ctx.Repo.RefName, fileName) if err != nil { ctx.ServerError("FileCommitsCount", err) @@ -266,7 +271,6 @@ func FileHistory(ctx *context.Context) { pager := context.NewPagination(int(commitsCount), setting.Git.CommitsRangeSize, page, 5) pager.SetDefaultParams(ctx) ctx.Data["Page"] = pager - ctx.Data["LicenseFileName"] = repo_service.LicenseFileName ctx.HTML(http.StatusOK, tplCommits) } diff --git a/routers/web/repo/release.go b/routers/web/repo/release.go index 96c512dd3df95..18efe7b3d0366 100644 --- a/routers/web/repo/release.go +++ b/routers/web/repo/release.go @@ -26,6 +26,7 @@ import ( "code.gitea.io/gitea/modules/util" "code.gitea.io/gitea/modules/web" "code.gitea.io/gitea/routers/web/feed" + "code.gitea.io/gitea/routers/web/repo/shared" shared_user "code.gitea.io/gitea/routers/web/shared/user" "code.gitea.io/gitea/services/context" "code.gitea.io/gitea/services/context/upload" @@ -156,6 +157,10 @@ func Releases(ctx *context.Context) { ctx.Data["CanCreateBranch"] = false ctx.Data["HideBranchesInDropdown"] = true + if !shared.PrepareSubmenuTag(ctx) { + return + } + listOptions := db.ListOptions{ Page: ctx.FormInt("page"), PageSize: ctx.FormInt("limit"), @@ -207,6 +212,10 @@ func TagsList(ctx *context.Context) { ctx.Data["HideBranchesInDropdown"] = true ctx.Data["CanCreateRelease"] = ctx.Repo.CanWrite(unit.TypeReleases) && !ctx.Repo.Repository.IsArchived + if !shared.PrepareSubmenuTag(ctx) { + return + } + namePattern := ctx.FormTrim("q") listOptions := db.ListOptions{ diff --git a/routers/web/repo/shared/submenu.go b/routers/web/repo/shared/submenu.go new file mode 100644 index 0000000000000..20b485ea9de76 --- /dev/null +++ b/routers/web/repo/shared/submenu.go @@ -0,0 +1,103 @@ +// Copyright 2024 The Gitea Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package shared + +import ( + "code.gitea.io/gitea/models/db" + git_model "code.gitea.io/gitea/models/git" + repo_model "code.gitea.io/gitea/models/repo" + "code.gitea.io/gitea/modules/cache" + "code.gitea.io/gitea/modules/git" + "code.gitea.io/gitea/modules/optional" + repo_module "code.gitea.io/gitea/modules/repository" + "code.gitea.io/gitea/services/context" + repo_service "code.gitea.io/gitea/services/repository" +) + +// PrepareRepoSubMenu prepares data for repository template repo/sub_menu.tmpl +func PrepareRepoSubMenu(ctx *context.Context) bool { + if !prepareSubmenuBranch(ctx) { + return false + } + + if !PrepareSubmenuTag(ctx) { + return false + } + + if !prepareSubmenuCommit(ctx) { + return false + } + + // only show license on repository's home page + if ctx.Data["PageIsRepoHome"] == true { + if !prepareSubmenuLicense(ctx) { + return false + } + } + + return true +} + +func prepareSubmenuLicense(ctx *context.Context) bool { + repoLicenses, err := repo_model.GetRepoLicenses(ctx, ctx.Repo.Repository) + if err != nil { + ctx.ServerError("GetRepoLicenses", err) + return false + } + ctx.Data["DetectedRepoLicenses"] = repoLicenses.StringList() + ctx.Data["LicenseFileName"] = repo_service.LicenseFileName + return true +} + +func prepareSubmenuBranch(ctx *context.Context) bool { + branchOpts := git_model.FindBranchOptions{ + RepoID: ctx.Repo.Repository.ID, + IsDeletedBranch: optional.Some(false), + ListOptions: db.ListOptionsAll, + } + branchesTotal, err := db.Count[git_model.Branch](ctx, branchOpts) + if err != nil { + ctx.ServerError("CountBranches", err) + return false + } + + // non-empty repo should have at least 1 branch, so this repository's branches haven't been synced yet + if branchesTotal == 0 { // fallback to do a sync immediately + branchesTotal, err = repo_module.SyncRepoBranches(ctx, ctx.Repo.Repository.ID, 0) + if err != nil { + ctx.ServerError("SyncRepoBranches", err) + return false + } + } + + ctx.Data["BranchesCount"] = branchesTotal + return true +} + +func PrepareSubmenuTag(ctx *context.Context) bool { + var err error + ctx.Data["NumTags"], err = db.Count[repo_model.Release](ctx, repo_model.FindReleasesOptions{ + IncludeDrafts: true, + IncludeTags: true, + HasSha1: optional.Some(true), // only draft releases which are created with existing tags + RepoID: ctx.Repo.Repository.ID, + }) + if err != nil { + ctx.ServerError("GetReleaseCountByRepoID", err) + return false + } + return true +} + +func prepareSubmenuCommit(ctx *context.Context) bool { + var err error + ctx.Repo.CommitsCount, err = ctx.Repo.GetCommitsCount() + if err != nil { + ctx.ServerError("GetCommitsCount", err) + return false + } + ctx.Data["CommitsCount"] = ctx.Repo.CommitsCount + ctx.Repo.GitRepo.LastCommitCache = git.NewLastCommitCache(ctx.Repo.CommitsCount, ctx.Repo.Repository.FullName(), ctx.Repo.GitRepo, cache.GetCache()) + return true +} diff --git a/routers/web/repo/view.go b/routers/web/repo/view.go index e6c25d75e9315..cd7141c0c9641 100644 --- a/routers/web/repo/view.go +++ b/routers/web/repo/view.go @@ -50,6 +50,7 @@ import ( "code.gitea.io/gitea/modules/typesniffer" "code.gitea.io/gitea/modules/util" "code.gitea.io/gitea/routers/web/feed" + "code.gitea.io/gitea/routers/web/repo/shared" "code.gitea.io/gitea/services/context" issue_service "code.gitea.io/gitea/services/issue" repo_service "code.gitea.io/gitea/services/repository" @@ -923,6 +924,7 @@ func prepareOpenWithEditorApps(ctx *context.Context) { func renderHomeCode(ctx *context.Context) { ctx.Data["PageIsViewCode"] = true + ctx.Data["PageIsRepoHome"] = true ctx.Data["RepositoryUploadEnabled"] = setting.Repository.Upload.Enabled prepareOpenWithEditorApps(ctx) @@ -980,6 +982,10 @@ func renderHomeCode(ctx *context.Context) { return } + if !shared.PrepareRepoSubMenu(ctx) { + return + } + // Get current entry user currently looking at. entry, err := ctx.Repo.Commit.GetTreeEntryByPath(ctx.Repo.TreePath) if err != nil { @@ -1062,7 +1068,6 @@ func renderHomeCode(ctx *context.Context) { ctx.Data["TreeLink"] = treeLink ctx.Data["TreeNames"] = treeNames ctx.Data["BranchLink"] = branchLink - ctx.Data["LicenseFileName"] = repo_service.LicenseFileName ctx.HTML(http.StatusOK, tplRepoHome) } diff --git a/services/context/repo.go b/services/context/repo.go index 1eafb7ca48bb4..8a69ffd86ca02 100644 --- a/services/context/repo.go +++ b/services/context/repo.go @@ -28,7 +28,6 @@ import ( "code.gitea.io/gitea/modules/httplib" code_indexer "code.gitea.io/gitea/modules/indexer/code" "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/optional" repo_module "code.gitea.io/gitea/modules/repository" "code.gitea.io/gitea/modules/setting" "code.gitea.io/gitea/modules/util" @@ -396,13 +395,6 @@ func repoAssignment(ctx *Context, repo *repo_model.Repository) { ctx.Repo.Repository = repo ctx.Data["RepoName"] = ctx.Repo.Repository.Name ctx.Data["IsEmptyRepo"] = ctx.Repo.Repository.IsEmpty - - repoLicenses, err := repo_model.GetRepoLicenses(ctx, ctx.Repo.Repository) - if err != nil { - ctx.ServerError("GetRepoLicenses", err) - return - } - ctx.Data["DetectedRepoLicenses"] = repoLicenses.StringList() } // RepoAssignment returns a middleware to handle repository assignment @@ -520,16 +512,6 @@ func RepoAssignment(ctx *Context) context.CancelFunc { ctx.Data["RepoExternalIssuesLink"] = unit.ExternalTrackerConfig().ExternalTrackerURL } - ctx.Data["NumTags"], err = db.Count[repo_model.Release](ctx, repo_model.FindReleasesOptions{ - IncludeDrafts: true, - IncludeTags: true, - HasSha1: optional.Some(true), // only draft releases which are created with existing tags - RepoID: ctx.Repo.Repository.ID, - }) - if err != nil { - ctx.ServerError("GetReleaseCountByRepoID", err) - return nil - } ctx.Data["NumReleases"], err = db.Count[repo_model.Release](ctx, repo_model.FindReleasesOptions{ // only show draft releases for users who can write, read-only users shouldn't see draft releases. IncludeDrafts: ctx.Repo.CanWrite(unit_model.TypeReleases), @@ -654,28 +636,6 @@ func RepoAssignment(ctx *Context) context.CancelFunc { return cancel } - branchOpts := git_model.FindBranchOptions{ - RepoID: ctx.Repo.Repository.ID, - IsDeletedBranch: optional.Some(false), - ListOptions: db.ListOptionsAll, - } - branchesTotal, err := db.Count[git_model.Branch](ctx, branchOpts) - if err != nil { - ctx.ServerError("CountBranches", err) - return cancel - } - - // non-empty repo should have at least 1 branch, so this repository's branches haven't been synced yet - if branchesTotal == 0 { // fallback to do a sync immediately - branchesTotal, err = repo_module.SyncRepoBranches(ctx, ctx.Repo.Repository.ID, 0) - if err != nil { - ctx.ServerError("SyncRepoBranches", err) - return cancel - } - } - - ctx.Data["BranchesCount"] = branchesTotal - // If no branch is set in the request URL, try to guess a default one. if len(ctx.Repo.BranchName) == 0 { if len(ctx.Repo.Repository.DefaultBranch) > 0 && gitRepo.IsBranchExist(ctx.Repo.Repository.DefaultBranch) { @@ -1038,14 +998,6 @@ func RepoRefByType(detectRefType RepoRefType, opts ...RepoRefByTypeOptions) func ctx.Data["IsViewCommit"] = ctx.Repo.IsViewCommit ctx.Data["CanCreateBranch"] = ctx.Repo.CanCreateBranch() - ctx.Repo.CommitsCount, err = ctx.Repo.GetCommitsCount() - if err != nil { - ctx.ServerError("GetCommitsCount", err) - return cancel - } - ctx.Data["CommitsCount"] = ctx.Repo.CommitsCount - ctx.Repo.GitRepo.LastCommitCache = git.NewLastCommitCache(ctx.Repo.CommitsCount, ctx.Repo.Repository.FullName(), ctx.Repo.GitRepo, cache.GetCache()) - return cancel } }