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  }