2014-08-29 18:20:43 +05:30
|
|
|
// Copyright 2014 The Gogs Authors. All rights reserved.
|
2022-11-27 23:50:29 +05:30
|
|
|
// SPDX-License-Identifier: MIT
|
2014-08-29 18:20:43 +05:30
|
|
|
|
|
|
|
package admin
|
|
|
|
|
|
|
|
import (
|
2021-04-05 21:00:52 +05:30
|
|
|
"net/http"
|
2020-12-24 20:56:19 +05:30
|
|
|
"net/url"
|
2020-09-25 09:39:23 +05:30
|
|
|
"strings"
|
|
|
|
|
2021-09-24 17:02:56 +05:30
|
|
|
"code.gitea.io/gitea/models/db"
|
2021-12-10 06:57:50 +05:30
|
|
|
repo_model "code.gitea.io/gitea/models/repo"
|
2021-11-24 15:19:20 +05:30
|
|
|
user_model "code.gitea.io/gitea/models/user"
|
2016-11-10 21:54:48 +05:30
|
|
|
"code.gitea.io/gitea/modules/base"
|
|
|
|
"code.gitea.io/gitea/modules/context"
|
|
|
|
"code.gitea.io/gitea/modules/log"
|
2022-08-25 08:01:57 +05:30
|
|
|
repo_module "code.gitea.io/gitea/modules/repository"
|
2016-11-10 21:54:48 +05:30
|
|
|
"code.gitea.io/gitea/modules/setting"
|
2020-11-28 08:12:08 +05:30
|
|
|
"code.gitea.io/gitea/modules/util"
|
2021-06-09 05:03:54 +05:30
|
|
|
"code.gitea.io/gitea/routers/web/explore"
|
2019-10-26 12:24:11 +05:30
|
|
|
repo_service "code.gitea.io/gitea/services/repository"
|
2014-08-29 18:20:43 +05:30
|
|
|
)
|
|
|
|
|
|
|
|
const (
|
2020-09-25 09:39:23 +05:30
|
|
|
tplRepos base.TplName = "admin/repo/list"
|
|
|
|
tplUnadoptedRepos base.TplName = "admin/repo/unadopted"
|
2014-08-29 18:20:43 +05:30
|
|
|
)
|
|
|
|
|
2016-11-21 08:51:24 +05:30
|
|
|
// Repos show all the repositories
|
2016-03-11 22:26:52 +05:30
|
|
|
func Repos(ctx *context.Context) {
|
2014-08-29 18:20:43 +05:30
|
|
|
ctx.Data["Title"] = ctx.Tr("admin.repositories")
|
|
|
|
ctx.Data["PageIsAdmin"] = true
|
|
|
|
ctx.Data["PageIsAdminRepositories"] = true
|
|
|
|
|
2021-06-09 05:03:54 +05:30
|
|
|
explore.RenderRepoSearch(ctx, &explore.RepoSearchOptions{
|
2023-02-25 00:41:31 +05:30
|
|
|
Private: true,
|
|
|
|
PageSize: setting.UI.Admin.RepoPagingNum,
|
|
|
|
TplName: tplRepos,
|
|
|
|
OnlyShowRelevant: false,
|
2016-03-15 23:53:12 +05:30
|
|
|
})
|
2014-08-29 18:20:43 +05:30
|
|
|
}
|
2015-12-06 04:09:29 +05:30
|
|
|
|
2016-11-21 08:51:24 +05:30
|
|
|
// DeleteRepo delete one repository
|
2016-03-11 22:26:52 +05:30
|
|
|
func DeleteRepo(ctx *context.Context) {
|
2022-12-03 08:18:26 +05:30
|
|
|
repo, err := repo_model.GetRepositoryByID(ctx, ctx.FormInt64("id"))
|
2015-12-06 04:09:29 +05:30
|
|
|
if err != nil {
|
2018-01-11 03:04:17 +05:30
|
|
|
ctx.ServerError("GetRepositoryByID", err)
|
2015-12-06 04:09:29 +05:30
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2021-05-15 01:49:38 +05:30
|
|
|
if ctx.Repo != nil && ctx.Repo.GitRepo != nil && ctx.Repo.Repository != nil && ctx.Repo.Repository.ID == repo.ID {
|
|
|
|
ctx.Repo.GitRepo.Close()
|
|
|
|
}
|
|
|
|
|
2022-03-22 12:33:22 +05:30
|
|
|
if err := repo_service.DeleteRepository(ctx, ctx.Doer, repo, true); err != nil {
|
2018-01-11 03:04:17 +05:30
|
|
|
ctx.ServerError("DeleteRepository", err)
|
2015-12-06 04:09:29 +05:30
|
|
|
return
|
|
|
|
}
|
2020-01-12 15:06:21 +05:30
|
|
|
log.Trace("Repository deleted: %s", repo.FullName())
|
2015-12-06 04:09:29 +05:30
|
|
|
|
|
|
|
ctx.Flash.Success(ctx.Tr("repo.settings.deletion_success"))
|
2021-04-05 21:00:52 +05:30
|
|
|
ctx.JSON(http.StatusOK, map[string]interface{}{
|
2021-11-16 23:48:25 +05:30
|
|
|
"redirect": setting.AppSubURL + "/admin/repos?page=" + url.QueryEscape(ctx.FormString("page")) + "&sort=" + url.QueryEscape(ctx.FormString("sort")),
|
2015-12-06 04:09:29 +05:30
|
|
|
})
|
|
|
|
}
|
2020-09-25 09:39:23 +05:30
|
|
|
|
|
|
|
// UnadoptedRepos lists the unadopted repositories
|
|
|
|
func UnadoptedRepos(ctx *context.Context) {
|
|
|
|
ctx.Data["Title"] = ctx.Tr("admin.repositories")
|
|
|
|
ctx.Data["PageIsAdmin"] = true
|
|
|
|
ctx.Data["PageIsAdminRepositories"] = true
|
|
|
|
|
2021-09-24 17:02:56 +05:30
|
|
|
opts := db.ListOptions{
|
2020-09-25 09:39:23 +05:30
|
|
|
PageSize: setting.UI.Admin.UserPagingNum,
|
2021-07-29 07:12:15 +05:30
|
|
|
Page: ctx.FormInt("page"),
|
2020-09-25 09:39:23 +05:30
|
|
|
}
|
|
|
|
|
|
|
|
if opts.Page <= 0 {
|
|
|
|
opts.Page = 1
|
|
|
|
}
|
|
|
|
|
2020-12-24 20:56:19 +05:30
|
|
|
ctx.Data["CurrentPage"] = opts.Page
|
|
|
|
|
2021-07-29 07:12:15 +05:30
|
|
|
doSearch := ctx.FormBool("search")
|
2020-09-25 09:39:23 +05:30
|
|
|
|
|
|
|
ctx.Data["search"] = doSearch
|
2021-08-11 06:01:13 +05:30
|
|
|
q := ctx.FormString("q")
|
2020-09-25 09:39:23 +05:30
|
|
|
|
|
|
|
if !doSearch {
|
|
|
|
pager := context.NewPagination(0, opts.PageSize, opts.Page, 5)
|
|
|
|
pager.SetDefaultParams(ctx)
|
2020-12-24 20:56:19 +05:30
|
|
|
pager.AddParam(ctx, "search", "search")
|
2020-09-25 09:39:23 +05:30
|
|
|
ctx.Data["Page"] = pager
|
2021-04-05 21:00:52 +05:30
|
|
|
ctx.HTML(http.StatusOK, tplUnadoptedRepos)
|
2020-09-25 09:39:23 +05:30
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
ctx.Data["Keyword"] = q
|
2023-03-01 03:47:51 +05:30
|
|
|
repoNames, count, err := repo_service.ListUnadoptedRepositories(ctx, q, &opts)
|
2020-09-25 09:39:23 +05:30
|
|
|
if err != nil {
|
|
|
|
ctx.ServerError("ListUnadoptedRepositories", err)
|
|
|
|
}
|
|
|
|
ctx.Data["Dirs"] = repoNames
|
2022-06-20 15:32:49 +05:30
|
|
|
pager := context.NewPagination(count, opts.PageSize, opts.Page, 5)
|
2020-09-25 09:39:23 +05:30
|
|
|
pager.SetDefaultParams(ctx)
|
2020-12-24 20:56:19 +05:30
|
|
|
pager.AddParam(ctx, "search", "search")
|
2020-09-25 09:39:23 +05:30
|
|
|
ctx.Data["Page"] = pager
|
2021-04-05 21:00:52 +05:30
|
|
|
ctx.HTML(http.StatusOK, tplUnadoptedRepos)
|
2020-09-25 09:39:23 +05:30
|
|
|
}
|
|
|
|
|
|
|
|
// AdoptOrDeleteRepository adopts or deletes a repository
|
|
|
|
func AdoptOrDeleteRepository(ctx *context.Context) {
|
2021-08-11 06:01:13 +05:30
|
|
|
dir := ctx.FormString("id")
|
|
|
|
action := ctx.FormString("action")
|
2021-08-11 20:38:52 +05:30
|
|
|
page := ctx.FormString("page")
|
2021-08-11 06:01:13 +05:30
|
|
|
q := ctx.FormString("q")
|
2020-12-24 20:56:19 +05:30
|
|
|
|
2020-09-25 09:39:23 +05:30
|
|
|
dirSplit := strings.SplitN(dir, "/", 2)
|
|
|
|
if len(dirSplit) != 2 {
|
|
|
|
ctx.Redirect(setting.AppSubURL + "/admin/repos")
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2022-05-20 19:38:52 +05:30
|
|
|
ctxUser, err := user_model.GetUserByName(ctx, dirSplit[0])
|
2020-09-25 09:39:23 +05:30
|
|
|
if err != nil {
|
2021-11-24 15:19:20 +05:30
|
|
|
if user_model.IsErrUserNotExist(err) {
|
2020-09-25 09:39:23 +05:30
|
|
|
log.Debug("User does not exist: %s", dirSplit[0])
|
|
|
|
ctx.Redirect(setting.AppSubURL + "/admin/repos")
|
|
|
|
return
|
|
|
|
}
|
|
|
|
ctx.ServerError("GetUserByName", err)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
repoName := dirSplit[1]
|
|
|
|
|
|
|
|
// check not a repo
|
2022-05-20 19:38:52 +05:30
|
|
|
has, err := repo_model.IsRepositoryExist(ctx, ctxUser, repoName)
|
2020-11-28 08:12:08 +05:30
|
|
|
if err != nil {
|
2020-09-25 09:39:23 +05:30
|
|
|
ctx.ServerError("IsRepositoryExist", err)
|
|
|
|
return
|
2020-11-28 08:12:08 +05:30
|
|
|
}
|
2021-12-10 06:57:50 +05:30
|
|
|
isDir, err := util.IsDir(repo_model.RepoPath(ctxUser.Name, repoName))
|
2020-11-28 08:12:08 +05:30
|
|
|
if err != nil {
|
|
|
|
ctx.ServerError("IsDir", err)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
if has || !isDir {
|
2020-09-25 09:39:23 +05:30
|
|
|
// Fallthrough to failure mode
|
|
|
|
} else if action == "adopt" {
|
2023-03-01 03:47:51 +05:30
|
|
|
if _, err := repo_service.AdoptRepository(ctx, ctx.Doer, ctxUser, repo_module.CreateRepoOptions{
|
2020-09-25 09:39:23 +05:30
|
|
|
Name: dirSplit[1],
|
|
|
|
IsPrivate: true,
|
|
|
|
}); err != nil {
|
|
|
|
ctx.ServerError("repository.AdoptRepository", err)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
ctx.Flash.Success(ctx.Tr("repo.adopt_preexisting_success", dir))
|
|
|
|
} else if action == "delete" {
|
2023-03-01 03:47:51 +05:30
|
|
|
if err := repo_service.DeleteUnadoptedRepository(ctx, ctx.Doer, ctxUser, dirSplit[1]); err != nil {
|
2020-09-25 09:39:23 +05:30
|
|
|
ctx.ServerError("repository.AdoptRepository", err)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
ctx.Flash.Success(ctx.Tr("repo.delete_preexisting_success", dir))
|
|
|
|
}
|
2021-11-16 23:48:25 +05:30
|
|
|
ctx.Redirect(setting.AppSubURL + "/admin/repos/unadopted?search=true&q=" + url.QueryEscape(q) + "&page=" + url.QueryEscape(page))
|
2020-09-25 09:39:23 +05:30
|
|
|
}
|