You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

code.go 3.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. // Copyright 2021 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package explore
  4. import (
  5. "net/http"
  6. repo_model "code.gitea.io/gitea/models/repo"
  7. "code.gitea.io/gitea/modules/base"
  8. code_indexer "code.gitea.io/gitea/modules/indexer/code"
  9. "code.gitea.io/gitea/modules/setting"
  10. "code.gitea.io/gitea/services/context"
  11. )
  12. const (
  13. // tplExploreCode explore code page template
  14. tplExploreCode base.TplName = "explore/code"
  15. )
  16. // Code render explore code page
  17. func Code(ctx *context.Context) {
  18. if !setting.Indexer.RepoIndexerEnabled {
  19. ctx.Redirect(setting.AppSubURL + "/explore")
  20. return
  21. }
  22. ctx.Data["UsersIsDisabled"] = setting.Service.Explore.DisableUsersPage
  23. ctx.Data["IsRepoIndexerEnabled"] = setting.Indexer.RepoIndexerEnabled
  24. ctx.Data["Title"] = ctx.Tr("explore")
  25. ctx.Data["PageIsExplore"] = true
  26. ctx.Data["PageIsExploreCode"] = true
  27. language := ctx.FormTrim("l")
  28. keyword := ctx.FormTrim("q")
  29. queryType := ctx.FormTrim("t")
  30. isMatch := queryType == "match"
  31. ctx.Data["Keyword"] = keyword
  32. ctx.Data["Language"] = language
  33. ctx.Data["queryType"] = queryType
  34. ctx.Data["PageIsViewCode"] = true
  35. if keyword == "" {
  36. ctx.HTML(http.StatusOK, tplExploreCode)
  37. return
  38. }
  39. page := ctx.FormInt("page")
  40. if page <= 0 {
  41. page = 1
  42. }
  43. var (
  44. repoIDs []int64
  45. err error
  46. isAdmin bool
  47. )
  48. if ctx.Doer != nil {
  49. isAdmin = ctx.Doer.IsAdmin
  50. }
  51. // guest user or non-admin user
  52. if ctx.Doer == nil || !isAdmin {
  53. repoIDs, err = repo_model.FindUserCodeAccessibleRepoIDs(ctx, ctx.Doer)
  54. if err != nil {
  55. ctx.ServerError("FindUserCodeAccessibleRepoIDs", err)
  56. return
  57. }
  58. }
  59. var (
  60. total int
  61. searchResults []*code_indexer.Result
  62. searchResultLanguages []*code_indexer.SearchResultLanguages
  63. )
  64. if (len(repoIDs) > 0) || isAdmin {
  65. total, searchResults, searchResultLanguages, err = code_indexer.PerformSearch(ctx, repoIDs, language, keyword, page, setting.UI.RepoSearchPagingNum, isMatch)
  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. var find bool
  78. for _, id := range loadRepoIDs {
  79. if id == result.RepoID {
  80. find = true
  81. break
  82. }
  83. }
  84. if !find {
  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.SetDefaultParams(ctx)
  109. pager.AddParam(ctx, "l", "Language")
  110. ctx.Data["Page"] = pager
  111. ctx.HTML(http.StatusOK, tplExploreCode)
  112. }