2014-08-29 20:50:43 +08: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 17:30:52 +02:00
"net/http"
2020-12-24 15:26:19 +00:00
"net/url"
2020-09-25 05:09:23 +01:00
"strings"
2016-11-10 17:24:48 +01:00
"code.gitea.io/gitea/models"
2021-09-24 19:32:56 +08:00
"code.gitea.io/gitea/models/db"
2016-11-10 17:24:48 +01: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 02:42:08 +00:00
"code.gitea.io/gitea/modules/util"
2021-06-09 07:33:54 +08:00
"code.gitea.io/gitea/routers/web/explore"
2019-10-26 14:54:11 +08:00
repo_service "code.gitea.io/gitea/services/repository"
2014-08-29 20:50:43 +08:00
)
const (
2020-09-25 05:09:23 +01:00
tplRepos base . TplName = "admin/repo/list"
tplUnadoptedRepos base . TplName = "admin/repo/unadopted"
2014-08-29 20:50:43 +08:00
)
2016-11-21 11:21:24 +08:00
// Repos show all the repositories
2016-03-11 11:56:52 -05:00
func Repos ( ctx * context . Context ) {
2014-08-29 20:50:43 +08:00
ctx . Data [ "Title" ] = ctx . Tr ( "admin.repositories" )
ctx . Data [ "PageIsAdmin" ] = true
ctx . Data [ "PageIsAdminRepositories" ] = true
2021-06-09 07:33:54 +08:00
explore . RenderRepoSearch ( ctx , & explore . RepoSearchOptions {
2016-03-15 14:23:12 -04:00
Private : true ,
2016-07-24 00:23:54 +08:00
PageSize : setting . UI . Admin . RepoPagingNum ,
2016-11-21 11:21:24 +08:00
TplName : tplRepos ,
2016-03-15 14:23:12 -04:00
} )
2014-08-29 20:50:43 +08:00
}
2015-12-05 17:39:29 -05:00
2016-11-21 11:21:24 +08:00
// DeleteRepo delete one repository
2016-03-11 11:56:52 -05:00
func DeleteRepo ( ctx * context . Context ) {
2021-07-29 09:42:15 +08:00
repo , err := models . GetRepositoryByID ( ctx . FormInt64 ( "id" ) )
2015-12-05 17:39:29 -05:00
if err != nil {
2018-01-10 22:34:17 +01:00
ctx . ServerError ( "GetRepositoryByID" , err )
2015-12-05 17:39:29 -05:00
return
}
2021-05-14 21:19:38 +01:00
if ctx . Repo != nil && ctx . Repo . GitRepo != nil && ctx . Repo . Repository != nil && ctx . Repo . Repository . ID == repo . ID {
ctx . Repo . GitRepo . Close ( )
}
2019-10-26 14:54:11 +08:00
if err := repo_service . DeleteRepository ( ctx . User , repo ) ; err != nil {
2018-01-10 22:34:17 +01:00
ctx . ServerError ( "DeleteRepository" , err )
2015-12-05 17:39:29 -05:00
return
}
2020-01-12 17:36:21 +08:00
log . Trace ( "Repository deleted: %s" , repo . FullName ( ) )
2015-12-05 17:39:29 -05:00
ctx . Flash . Success ( ctx . Tr ( "repo.settings.deletion_success" ) )
2021-04-05 17:30:52 +02:00
ctx . JSON ( http . StatusOK , map [ string ] interface { } {
2021-11-16 18:18:25 +00:00
"redirect" : setting . AppSubURL + "/admin/repos?page=" + url . QueryEscape ( ctx . FormString ( "page" ) ) + "&sort=" + url . QueryEscape ( ctx . FormString ( "sort" ) ) ,
2015-12-05 17:39:29 -05:00
} )
}
2020-09-25 05:09:23 +01: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 19:32:56 +08:00
opts := db . ListOptions {
2020-09-25 05:09:23 +01:00
PageSize : setting . UI . Admin . UserPagingNum ,
2021-07-29 09:42:15 +08:00
Page : ctx . FormInt ( "page" ) ,
2020-09-25 05:09:23 +01:00
}
if opts . Page <= 0 {
opts . Page = 1
}
2020-12-24 15:26:19 +00:00
ctx . Data [ "CurrentPage" ] = opts . Page
2021-07-29 09:42:15 +08:00
doSearch := ctx . FormBool ( "search" )
2020-09-25 05:09:23 +01:00
ctx . Data [ "search" ] = doSearch
2021-08-11 02:31:13 +02:00
q := ctx . FormString ( "q" )
2020-09-25 05:09:23 +01:00
if ! doSearch {
pager := context . NewPagination ( 0 , opts . PageSize , opts . Page , 5 )
pager . SetDefaultParams ( ctx )
2020-12-24 15:26:19 +00:00
pager . AddParam ( ctx , "search" , "search" )
2020-09-25 05:09:23 +01:00
ctx . Data [ "Page" ] = pager
2021-04-05 17:30:52 +02:00
ctx . HTML ( http . StatusOK , tplUnadoptedRepos )
2020-09-25 05:09:23 +01:00
return
}
ctx . Data [ "Keyword" ] = q
2021-11-16 21:30:11 +08:00
repoNames , count , err := repo_service . ListUnadoptedRepositories ( q , & opts )
2020-09-25 05:09:23 +01: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 15:26:19 +00:00
pager . AddParam ( ctx , "search" , "search" )
2020-09-25 05:09:23 +01:00
ctx . Data [ "Page" ] = pager
2021-04-05 17:30:52 +02:00
ctx . HTML ( http . StatusOK , tplUnadoptedRepos )
2020-09-25 05:09:23 +01:00
}
// AdoptOrDeleteRepository adopts or deletes a repository
func AdoptOrDeleteRepository ( ctx * context . Context ) {
2021-08-11 02:31:13 +02:00
dir := ctx . FormString ( "id" )
action := ctx . FormString ( "action" )
2021-08-11 17:08:52 +02:00
page := ctx . FormString ( "page" )
2021-08-11 02:31:13 +02:00
q := ctx . FormString ( "q" )
2020-12-24 15:26:19 +00:00
2020-09-25 05:09:23 +01:00
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
2020-11-28 02:42:08 +00:00
has , err := models . IsRepositoryExist ( ctxUser , repoName )
if err != nil {
2020-09-25 05:09:23 +01:00
ctx . ServerError ( "IsRepositoryExist" , err )
return
2020-11-28 02:42:08 +00:00
}
isDir , err := util . IsDir ( models . RepoPath ( ctxUser . Name , repoName ) )
if err != nil {
ctx . ServerError ( "IsDir" , err )
return
}
if has || ! isDir {
2020-09-25 05:09:23 +01:00
// Fallthrough to failure mode
} else if action == "adopt" {
2021-11-16 21:30:11 +08:00
if _ , err := repo_service . AdoptRepository ( ctx . User , ctxUser , models . CreateRepoOptions {
2020-09-25 05:09:23 +01: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" {
2021-11-16 21:30:11 +08:00
if err := repo_service . DeleteUnadoptedRepository ( ctx . User , ctxUser , dirSplit [ 1 ] ) ; err != nil {
2020-09-25 05:09:23 +01:00
ctx . ServerError ( "repository.AdoptRepository" , err )
return
}
ctx . Flash . Success ( ctx . Tr ( "repo.delete_preexisting_success" , dir ) )
}
2021-11-16 18:18:25 +00:00
ctx . Redirect ( setting . AppSubURL + "/admin/repos/unadopted?search=true&q=" + url . QueryEscape ( q ) + "&page=" + url . QueryEscape ( page ) )
2020-09-25 05:09:23 +01:00
}