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