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 (
2021-04-05 18:30:52 +03:00
"net/http"
2020-12-24 18:26:19 +03:00
"net/url"
2020-09-25 07:09:23 +03:00
"strings"
2016-11-10 19:24:48 +03:00
"code.gitea.io/gitea/models"
2021-09-24 14:32:56 +03:00
"code.gitea.io/gitea/models/db"
2021-12-10 04:27:50 +03:00
repo_model "code.gitea.io/gitea/models/repo"
2021-11-24 12:49:20 +03:00
user_model "code.gitea.io/gitea/models/user"
2016-11-10 19:24:48 +03:00
"code.gitea.io/gitea/modules/base"
"code.gitea.io/gitea/modules/context"
"code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/setting"
2020-11-28 05:42:08 +03:00
"code.gitea.io/gitea/modules/util"
2021-06-09 02:33:54 +03:00
"code.gitea.io/gitea/routers/web/explore"
2019-10-26 09:54:11 +03:00
repo_service "code.gitea.io/gitea/services/repository"
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
2021-06-09 02:33:54 +03:00
explore . RenderRepoSearch ( ctx , & explore . RepoSearchOptions {
2016-03-15 21:23:12 +03:00
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 ) {
2021-12-10 04:27:50 +03:00
repo , err := repo_model . GetRepositoryByID ( ctx . FormInt64 ( "id" ) )
2015-12-06 01:39:29 +03:00
if err != nil {
2018-01-11 00:34:17 +03:00
ctx . ServerError ( "GetRepositoryByID" , err )
2015-12-06 01:39:29 +03:00
return
}
2021-05-14 23:19:38 +03:00
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 10:03:22 +03:00
if err := repo_service . DeleteRepository ( ctx , ctx . Doer , repo , true ) ; 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" ) )
2021-04-05 18:30:52 +03:00
ctx . JSON ( http . StatusOK , map [ string ] interface { } {
2021-11-16 21:18:25 +03:00
"redirect" : setting . AppSubURL + "/admin/repos?page=" + url . QueryEscape ( ctx . FormString ( "page" ) ) + "&sort=" + url . QueryEscape ( ctx . FormString ( "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
2021-09-24 14:32:56 +03:00
opts := db . ListOptions {
2020-09-25 07:09:23 +03:00
PageSize : setting . UI . Admin . UserPagingNum ,
2021-07-29 04:42:15 +03:00
Page : ctx . FormInt ( "page" ) ,
2020-09-25 07:09:23 +03:00
}
if opts . Page <= 0 {
opts . Page = 1
}
2020-12-24 18:26:19 +03:00
ctx . Data [ "CurrentPage" ] = opts . Page
2021-07-29 04:42:15 +03:00
doSearch := ctx . FormBool ( "search" )
2020-09-25 07:09:23 +03:00
ctx . Data [ "search" ] = doSearch
2021-08-11 03:31:13 +03:00
q := ctx . FormString ( "q" )
2020-09-25 07:09:23 +03:00
if ! doSearch {
pager := context . NewPagination ( 0 , opts . PageSize , opts . Page , 5 )
pager . SetDefaultParams ( ctx )
2020-12-24 18:26:19 +03:00
pager . AddParam ( ctx , "search" , "search" )
2020-09-25 07:09:23 +03:00
ctx . Data [ "Page" ] = pager
2021-04-05 18:30:52 +03:00
ctx . HTML ( http . StatusOK , tplUnadoptedRepos )
2020-09-25 07:09:23 +03:00
return
}
ctx . Data [ "Keyword" ] = q
2021-11-16 16:30:11 +03:00
repoNames , count , err := repo_service . ListUnadoptedRepositories ( q , & opts )
2020-09-25 07:09:23 +03:00
if err != nil {
ctx . ServerError ( "ListUnadoptedRepositories" , err )
}
ctx . Data [ "Dirs" ] = repoNames
pager := context . NewPagination ( int ( count ) , opts . PageSize , opts . Page , 5 )
pager . SetDefaultParams ( ctx )
2020-12-24 18:26:19 +03:00
pager . AddParam ( ctx , "search" , "search" )
2020-09-25 07:09:23 +03:00
ctx . Data [ "Page" ] = pager
2021-04-05 18:30:52 +03:00
ctx . HTML ( http . StatusOK , tplUnadoptedRepos )
2020-09-25 07:09:23 +03:00
}
// AdoptOrDeleteRepository adopts or deletes a repository
func AdoptOrDeleteRepository ( ctx * context . Context ) {
2021-08-11 03:31:13 +03:00
dir := ctx . FormString ( "id" )
action := ctx . FormString ( "action" )
2021-08-11 18:08:52 +03:00
page := ctx . FormString ( "page" )
2021-08-11 03:31:13 +03:00
q := ctx . FormString ( "q" )
2020-12-24 18:26:19 +03:00
2020-09-25 07:09:23 +03:00
dirSplit := strings . SplitN ( dir , "/" , 2 )
if len ( dirSplit ) != 2 {
ctx . Redirect ( setting . AppSubURL + "/admin/repos" )
return
}
2022-05-20 17:08:52 +03:00
ctxUser , err := user_model . GetUserByName ( ctx , dirSplit [ 0 ] )
2020-09-25 07:09:23 +03:00
if err != nil {
2021-11-24 12:49:20 +03:00
if user_model . IsErrUserNotExist ( err ) {
2020-09-25 07:09:23 +03:00
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 17:08:52 +03:00
has , err := repo_model . IsRepositoryExist ( ctx , ctxUser , repoName )
2020-11-28 05:42:08 +03:00
if err != nil {
2020-09-25 07:09:23 +03:00
ctx . ServerError ( "IsRepositoryExist" , err )
return
2020-11-28 05:42:08 +03:00
}
2021-12-10 04:27:50 +03:00
isDir , err := util . IsDir ( repo_model . RepoPath ( ctxUser . Name , repoName ) )
2020-11-28 05:42:08 +03:00
if err != nil {
ctx . ServerError ( "IsDir" , err )
return
}
if has || ! isDir {
2020-09-25 07:09:23 +03:00
// Fallthrough to failure mode
} else if action == "adopt" {
2022-03-22 10:03:22 +03:00
if _ , err := repo_service . AdoptRepository ( ctx . Doer , ctxUser , models . CreateRepoOptions {
2020-09-25 07:09:23 +03:00
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" {
2022-03-22 10:03:22 +03:00
if err := repo_service . DeleteUnadoptedRepository ( ctx . Doer , ctxUser , dirSplit [ 1 ] ) ; err != nil {
2020-09-25 07:09:23 +03:00
ctx . ServerError ( "repository.AdoptRepository" , err )
return
}
ctx . Flash . Success ( ctx . Tr ( "repo.delete_preexisting_success" , dir ) )
}
2021-11-16 21:18:25 +03:00
ctx . Redirect ( setting . AppSubURL + "/admin/repos/unadopted?search=true&q=" + url . QueryEscape ( q ) + "&page=" + url . QueryEscape ( page ) )
2020-09-25 07:09:23 +03:00
}