gitea源码

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. // Copyright 2021 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package explore
  4. import (
  5. "net/http"
  6. "slices"
  7. "code.gitea.io/gitea/models/db"
  8. repo_model "code.gitea.io/gitea/models/repo"
  9. code_indexer "code.gitea.io/gitea/modules/indexer/code"
  10. "code.gitea.io/gitea/modules/setting"
  11. "code.gitea.io/gitea/modules/templates"
  12. "code.gitea.io/gitea/routers/common"
  13. "code.gitea.io/gitea/services/context"
  14. )
  15. const (
  16. // tplExploreCode explore code page template
  17. tplExploreCode templates.TplName = "explore/code"
  18. )
  19. // Code render explore code page
  20. func Code(ctx *context.Context) {
  21. if !setting.Indexer.RepoIndexerEnabled || setting.Service.Explore.DisableCodePage {
  22. ctx.Redirect(setting.AppSubURL + "/explore")
  23. return
  24. }
  25. ctx.Data["UsersPageIsDisabled"] = setting.Service.Explore.DisableUsersPage
  26. ctx.Data["OrganizationsPageIsDisabled"] = setting.Service.Explore.DisableOrganizationsPage
  27. ctx.Data["IsRepoIndexerEnabled"] = setting.Indexer.RepoIndexerEnabled
  28. ctx.Data["Title"] = ctx.Tr("explore")
  29. ctx.Data["PageIsExplore"] = true
  30. ctx.Data["PageIsExploreCode"] = true
  31. ctx.Data["PageIsViewCode"] = true
  32. prepareSearch := common.PrepareCodeSearch(ctx)
  33. if prepareSearch.Keyword == "" {
  34. ctx.HTML(http.StatusOK, tplExploreCode)
  35. return
  36. }
  37. page := ctx.FormInt("page")
  38. if page <= 0 {
  39. page = 1
  40. }
  41. var (
  42. repoIDs []int64
  43. err error
  44. isAdmin bool
  45. )
  46. if ctx.Doer != nil {
  47. isAdmin = ctx.Doer.IsAdmin
  48. }
  49. // guest user or non-admin user
  50. if ctx.Doer == nil || !isAdmin {
  51. repoIDs, err = repo_model.FindUserCodeAccessibleRepoIDs(ctx, ctx.Doer)
  52. if err != nil {
  53. ctx.ServerError("FindUserCodeAccessibleRepoIDs", err)
  54. return
  55. }
  56. }
  57. var (
  58. total int
  59. searchResults []*code_indexer.Result
  60. searchResultLanguages []*code_indexer.SearchResultLanguages
  61. )
  62. if (len(repoIDs) > 0) || isAdmin {
  63. total, searchResults, searchResultLanguages, err = code_indexer.PerformSearch(ctx, &code_indexer.SearchOptions{
  64. RepoIDs: repoIDs,
  65. Keyword: prepareSearch.Keyword,
  66. SearchMode: prepareSearch.SearchMode,
  67. Language: prepareSearch.Language,
  68. Paginator: &db.ListOptions{
  69. Page: page,
  70. PageSize: setting.UI.RepoSearchPagingNum,
  71. },
  72. })
  73. if err != nil {
  74. if code_indexer.IsAvailable(ctx) {
  75. ctx.ServerError("SearchResults", err)
  76. return
  77. }
  78. ctx.Data["CodeIndexerUnavailable"] = true
  79. } else {
  80. ctx.Data["CodeIndexerUnavailable"] = !code_indexer.IsAvailable(ctx)
  81. }
  82. loadRepoIDs := make([]int64, 0, len(searchResults))
  83. for _, result := range searchResults {
  84. if !slices.Contains(loadRepoIDs, result.RepoID) {
  85. loadRepoIDs = append(loadRepoIDs, result.RepoID)
  86. }
  87. }
  88. repoMaps, err := repo_model.GetRepositoriesMapByIDs(ctx, loadRepoIDs)
  89. if err != nil {
  90. ctx.ServerError("GetRepositoriesMapByIDs", err)
  91. return
  92. }
  93. ctx.Data["RepoMaps"] = repoMaps
  94. if len(loadRepoIDs) != len(repoMaps) {
  95. // Remove deleted repos from search results
  96. cleanedSearchResults := make([]*code_indexer.Result, 0, len(repoMaps))
  97. for _, sr := range searchResults {
  98. if _, found := repoMaps[sr.RepoID]; found {
  99. cleanedSearchResults = append(cleanedSearchResults, sr)
  100. }
  101. }
  102. searchResults = cleanedSearchResults
  103. }
  104. }
  105. ctx.Data["SearchResults"] = searchResults
  106. ctx.Data["SearchResultLanguages"] = searchResultLanguages
  107. pager := context.NewPagination(total, setting.UI.RepoSearchPagingNum, page, 5)
  108. pager.AddParamFromRequest(ctx.Req)
  109. ctx.Data["Page"] = pager
  110. ctx.HTML(http.StatusOK, tplExploreCode)
  111. }