2014-08-29 16:50:43 +04:00
// Copyright 2014 The Gogs Authors. All rights reserved.
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
package admin
import (
2020-09-25 07:09:23 +03:00
"strings"
2016-11-10 19:24:48 +03:00
"code.gitea.io/gitea/models"
"code.gitea.io/gitea/modules/base"
"code.gitea.io/gitea/modules/context"
"code.gitea.io/gitea/modules/log"
2020-09-25 07:09:23 +03:00
"code.gitea.io/gitea/modules/repository"
2016-11-10 19:24:48 +03:00
"code.gitea.io/gitea/modules/setting"
"code.gitea.io/gitea/routers"
2019-10-26 09:54:11 +03:00
repo_service "code.gitea.io/gitea/services/repository"
2020-09-25 07:09:23 +03:00
"github.com/unknwon/com"
2014-08-29 16:50:43 +04:00
)
const (
2020-09-25 07:09:23 +03:00
tplRepos base . TplName = "admin/repo/list"
tplUnadoptedRepos base . TplName = "admin/repo/unadopted"
2014-08-29 16:50:43 +04:00
)
2016-11-21 06:21:24 +03:00
// Repos show all the repositories
2016-03-11 19:56:52 +03:00
func Repos ( ctx * context . Context ) {
2014-08-29 16:50:43 +04:00
ctx . Data [ "Title" ] = ctx . Tr ( "admin.repositories" )
ctx . Data [ "PageIsAdmin" ] = true
ctx . Data [ "PageIsAdminRepositories" ] = true
2016-03-15 21:23:12 +03:00
routers . RenderRepoSearch ( ctx , & routers . RepoSearchOptions {
Private : true ,
2016-07-23 19:23:54 +03:00
PageSize : setting . UI . Admin . RepoPagingNum ,
2016-11-21 06:21:24 +03:00
TplName : tplRepos ,
2016-03-15 21:23:12 +03:00
} )
2014-08-29 16:50:43 +04:00
}
2015-12-06 01:39:29 +03:00
2016-11-21 06:21:24 +03:00
// DeleteRepo delete one repository
2016-03-11 19:56:52 +03:00
func DeleteRepo ( ctx * context . Context ) {
2015-12-06 01:39:29 +03:00
repo , err := models . GetRepositoryByID ( ctx . QueryInt64 ( "id" ) )
if err != nil {
2018-01-11 00:34:17 +03:00
ctx . ServerError ( "GetRepositoryByID" , err )
2015-12-06 01:39:29 +03:00
return
}
2019-10-26 09:54:11 +03:00
if err := repo_service . DeleteRepository ( ctx . User , repo ) ; err != nil {
2018-01-11 00:34:17 +03:00
ctx . ServerError ( "DeleteRepository" , err )
2015-12-06 01:39:29 +03:00
return
}
2020-01-12 12:36:21 +03:00
log . Trace ( "Repository deleted: %s" , repo . FullName ( ) )
2015-12-06 01:39:29 +03:00
ctx . Flash . Success ( ctx . Tr ( "repo.settings.deletion_success" ) )
ctx . JSON ( 200 , map [ string ] interface { } {
2019-02-11 04:27:24 +03:00
"redirect" : setting . AppSubURL + "/admin/repos?page=" + ctx . Query ( "page" ) + "&sort=" + ctx . Query ( "sort" ) ,
2015-12-06 01:39:29 +03:00
} )
}
2020-09-25 07:09:23 +03:00
// 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
opts := models . ListOptions {
PageSize : setting . UI . Admin . UserPagingNum ,
Page : ctx . QueryInt ( "page" ) ,
}
if opts . Page <= 0 {
opts . Page = 1
}
doSearch := ctx . QueryBool ( "search" )
ctx . Data [ "search" ] = doSearch
q := ctx . Query ( "q" )
if ! doSearch {
pager := context . NewPagination ( 0 , opts . PageSize , opts . Page , 5 )
pager . SetDefaultParams ( ctx )
ctx . Data [ "Page" ] = pager
ctx . HTML ( 200 , tplUnadoptedRepos )
return
}
ctx . Data [ "Keyword" ] = q
repoNames , count , err := repository . ListUnadoptedRepositories ( q , & opts )
if err != nil {
ctx . ServerError ( "ListUnadoptedRepositories" , err )
}
ctx . Data [ "Dirs" ] = repoNames
pager := context . NewPagination ( int ( count ) , opts . PageSize , opts . Page , 5 )
pager . SetDefaultParams ( ctx )
ctx . Data [ "Page" ] = pager
ctx . HTML ( 200 , tplUnadoptedRepos )
}
// AdoptOrDeleteRepository adopts or deletes a repository
func AdoptOrDeleteRepository ( ctx * context . Context ) {
dir := ctx . Query ( "id" )
action := ctx . Query ( "action" )
dirSplit := strings . SplitN ( dir , "/" , 2 )
if len ( dirSplit ) != 2 {
ctx . Redirect ( setting . AppSubURL + "/admin/repos" )
return
}
ctxUser , err := models . GetUserByName ( dirSplit [ 0 ] )
if err != nil {
if models . IsErrUserNotExist ( err ) {
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
if has , err := models . IsRepositoryExist ( ctxUser , repoName ) ; err != nil {
ctx . ServerError ( "IsRepositoryExist" , err )
return
} else if has || ! com . IsDir ( models . RepoPath ( ctxUser . Name , repoName ) ) {
// Fallthrough to failure mode
} else if action == "adopt" {
if _ , err := repository . AdoptRepository ( ctx . User , ctxUser , models . CreateRepoOptions {
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" {
if err := repository . DeleteUnadoptedRepository ( ctx . User , ctxUser , dirSplit [ 1 ] ) ; err != nil {
ctx . ServerError ( "repository.AdoptRepository" , err )
return
}
ctx . Flash . Success ( ctx . Tr ( "repo.delete_preexisting_success" , dir ) )
}
ctx . Redirect ( setting . AppSubURL + "/admin/repos/unadopted" )
}