gitea源码

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. // Copyright 2022 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package user
  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. shared_user "code.gitea.io/gitea/routers/web/shared/user"
  14. "code.gitea.io/gitea/services/context"
  15. )
  16. const (
  17. tplUserCode templates.TplName = "user/code"
  18. )
  19. // CodeSearch render user/organization code search page
  20. func CodeSearch(ctx *context.Context) {
  21. if !setting.Indexer.RepoIndexerEnabled {
  22. ctx.Redirect(ctx.ContextUser.HomeLink())
  23. return
  24. }
  25. if _, err := shared_user.RenderUserOrgHeader(ctx); err != nil {
  26. ctx.ServerError("RenderUserOrgHeader", err)
  27. return
  28. }
  29. ctx.Data["IsPackageEnabled"] = setting.Packages.Enabled
  30. ctx.Data["Title"] = ctx.Tr("explore.code")
  31. ctx.Data["IsCodePage"] = true
  32. prepareSearch := common.PrepareCodeSearch(ctx)
  33. if prepareSearch.Keyword == "" {
  34. ctx.HTML(http.StatusOK, tplUserCode)
  35. return
  36. }
  37. var (
  38. repoIDs []int64
  39. err error
  40. )
  41. page := ctx.FormInt("page")
  42. if page <= 0 {
  43. page = 1
  44. }
  45. repoIDs, err = repo_model.FindUserCodeAccessibleOwnerRepoIDs(ctx, ctx.ContextUser.ID, ctx.Doer)
  46. if err != nil {
  47. ctx.ServerError("FindUserCodeAccessibleOwnerRepoIDs", err)
  48. return
  49. }
  50. var (
  51. total int
  52. searchResults []*code_indexer.Result
  53. searchResultLanguages []*code_indexer.SearchResultLanguages
  54. )
  55. if len(repoIDs) > 0 {
  56. total, searchResults, searchResultLanguages, err = code_indexer.PerformSearch(ctx, &code_indexer.SearchOptions{
  57. RepoIDs: repoIDs,
  58. Keyword: prepareSearch.Keyword,
  59. SearchMode: prepareSearch.SearchMode,
  60. Language: prepareSearch.Language,
  61. Paginator: &db.ListOptions{
  62. Page: page,
  63. PageSize: setting.UI.RepoSearchPagingNum,
  64. },
  65. })
  66. if err != nil {
  67. if code_indexer.IsAvailable(ctx) {
  68. ctx.ServerError("SearchResults", err)
  69. return
  70. }
  71. ctx.Data["CodeIndexerUnavailable"] = true
  72. } else {
  73. ctx.Data["CodeIndexerUnavailable"] = !code_indexer.IsAvailable(ctx)
  74. }
  75. loadRepoIDs := make([]int64, 0, len(searchResults))
  76. for _, result := range searchResults {
  77. if !slices.Contains(loadRepoIDs, result.RepoID) {
  78. loadRepoIDs = append(loadRepoIDs, result.RepoID)
  79. }
  80. }
  81. repoMaps, err := repo_model.GetRepositoriesMapByIDs(ctx, loadRepoIDs)
  82. if err != nil {
  83. ctx.ServerError("GetRepositoriesMapByIDs", err)
  84. return
  85. }
  86. ctx.Data["RepoMaps"] = repoMaps
  87. }
  88. ctx.Data["SearchResults"] = searchResults
  89. ctx.Data["SearchResultLanguages"] = searchResultLanguages
  90. pager := context.NewPagination(total, setting.UI.RepoSearchPagingNum, page, 5)
  91. pager.AddParamFromRequest(ctx.Req)
  92. ctx.Data["Page"] = pager
  93. ctx.HTML(http.StatusOK, tplUserCode)
  94. }