gitea源码

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. // Copyright 2014 The Gogs Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package admin
  4. import (
  5. "net/http"
  6. "net/url"
  7. "strings"
  8. "code.gitea.io/gitea/models/db"
  9. repo_model "code.gitea.io/gitea/models/repo"
  10. user_model "code.gitea.io/gitea/models/user"
  11. "code.gitea.io/gitea/modules/log"
  12. "code.gitea.io/gitea/modules/setting"
  13. "code.gitea.io/gitea/modules/templates"
  14. "code.gitea.io/gitea/modules/util"
  15. "code.gitea.io/gitea/routers/web/explore"
  16. "code.gitea.io/gitea/services/context"
  17. repo_service "code.gitea.io/gitea/services/repository"
  18. )
  19. const (
  20. tplRepos templates.TplName = "admin/repo/list"
  21. tplUnadoptedRepos templates.TplName = "admin/repo/unadopted"
  22. )
  23. // Repos show all the repositories
  24. func Repos(ctx *context.Context) {
  25. ctx.Data["Title"] = ctx.Tr("admin.repositories")
  26. ctx.Data["PageIsAdminRepositories"] = true
  27. explore.RenderRepoSearch(ctx, &explore.RepoSearchOptions{
  28. Private: true,
  29. PageSize: setting.UI.Admin.RepoPagingNum,
  30. TplName: tplRepos,
  31. OnlyShowRelevant: false,
  32. })
  33. }
  34. // DeleteRepo delete one repository
  35. func DeleteRepo(ctx *context.Context) {
  36. repo, err := repo_model.GetRepositoryByID(ctx, ctx.FormInt64("id"))
  37. if err != nil {
  38. ctx.ServerError("GetRepositoryByID", err)
  39. return
  40. }
  41. if ctx.Repo != nil && ctx.Repo.GitRepo != nil && ctx.Repo.Repository != nil && ctx.Repo.Repository.ID == repo.ID {
  42. ctx.Repo.GitRepo.Close()
  43. }
  44. if err := repo_service.DeleteRepository(ctx, ctx.Doer, repo, true); err != nil {
  45. ctx.ServerError("DeleteRepository", err)
  46. return
  47. }
  48. log.Trace("Repository deleted: %s", repo.FullName())
  49. ctx.Flash.Success(ctx.Tr("repo.settings.deletion_success"))
  50. ctx.JSONRedirect(setting.AppSubURL + "/-/admin/repos?page=" + url.QueryEscape(ctx.FormString("page")) + "&sort=" + url.QueryEscape(ctx.FormString("sort")))
  51. }
  52. // UnadoptedRepos lists the unadopted repositories
  53. func UnadoptedRepos(ctx *context.Context) {
  54. ctx.Data["Title"] = ctx.Tr("admin.repositories")
  55. ctx.Data["PageIsAdminRepositories"] = true
  56. opts := db.ListOptions{
  57. PageSize: setting.UI.Admin.UserPagingNum,
  58. Page: ctx.FormInt("page"),
  59. }
  60. if opts.Page <= 0 {
  61. opts.Page = 1
  62. }
  63. ctx.Data["CurrentPage"] = opts.Page
  64. doSearch := ctx.FormBool("search")
  65. ctx.Data["search"] = doSearch
  66. q := ctx.FormString("q")
  67. if !doSearch {
  68. pager := context.NewPagination(0, opts.PageSize, opts.Page, 5)
  69. pager.AddParamFromRequest(ctx.Req)
  70. ctx.Data["Page"] = pager
  71. ctx.HTML(http.StatusOK, tplUnadoptedRepos)
  72. return
  73. }
  74. ctx.Data["Keyword"] = q
  75. repoNames, count, err := repo_service.ListUnadoptedRepositories(ctx, q, &opts)
  76. if err != nil {
  77. ctx.ServerError("ListUnadoptedRepositories", err)
  78. return
  79. }
  80. ctx.Data["Dirs"] = repoNames
  81. pager := context.NewPagination(count, opts.PageSize, opts.Page, 5)
  82. pager.AddParamFromRequest(ctx.Req)
  83. ctx.Data["Page"] = pager
  84. ctx.HTML(http.StatusOK, tplUnadoptedRepos)
  85. }
  86. // AdoptOrDeleteRepository adopts or deletes a repository
  87. func AdoptOrDeleteRepository(ctx *context.Context) {
  88. dir := ctx.FormString("id")
  89. action := ctx.FormString("action")
  90. page := ctx.FormString("page")
  91. q := ctx.FormString("q")
  92. dirSplit := strings.SplitN(dir, "/", 2)
  93. if len(dirSplit) != 2 {
  94. ctx.Redirect(setting.AppSubURL + "/-/admin/repos")
  95. return
  96. }
  97. ctxUser, err := user_model.GetUserByName(ctx, dirSplit[0])
  98. if err != nil {
  99. if user_model.IsErrUserNotExist(err) {
  100. log.Debug("User does not exist: %s", dirSplit[0])
  101. ctx.Redirect(setting.AppSubURL + "/-/admin/repos")
  102. return
  103. }
  104. ctx.ServerError("GetUserByName", err)
  105. return
  106. }
  107. repoName := dirSplit[1]
  108. // check not a repo
  109. has, err := repo_model.IsRepositoryModelExist(ctx, ctxUser, repoName)
  110. if err != nil {
  111. ctx.ServerError("IsRepositoryExist", err)
  112. return
  113. }
  114. isDir, err := util.IsDir(repo_model.RepoPath(ctxUser.Name, repoName))
  115. if err != nil {
  116. ctx.ServerError("IsDir", err)
  117. return
  118. }
  119. if has || !isDir {
  120. // Fallthrough to failure mode
  121. } else if action == "adopt" {
  122. if _, err := repo_service.AdoptRepository(ctx, ctx.Doer, ctxUser, repo_service.CreateRepoOptions{
  123. Name: dirSplit[1],
  124. IsPrivate: true,
  125. }); err != nil {
  126. ctx.ServerError("repository.AdoptRepository", err)
  127. return
  128. }
  129. ctx.Flash.Success(ctx.Tr("repo.adopt_preexisting_success", dir))
  130. } else if action == "delete" {
  131. if err := repo_service.DeleteUnadoptedRepository(ctx, ctx.Doer, ctxUser, dirSplit[1]); err != nil {
  132. ctx.ServerError("repository.AdoptRepository", err)
  133. return
  134. }
  135. ctx.Flash.Success(ctx.Tr("repo.delete_preexisting_success", dir))
  136. }
  137. ctx.Redirect(setting.AppSubURL + "/-/admin/repos/unadopted?search=true&q=" + url.QueryEscape(q) + "&page=" + url.QueryEscape(page))
  138. }