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.

repos.go 4.7KB

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