2014-08-29 16:50:43 +04:00
// Copyright 2014 The Gogs Authors. All rights reserved.
2022-11-27 21:20:29 +03:00
// SPDX-License-Identifier: MIT
2014-08-29 16:50:43 +04:00
package admin
import (
2024-03-16 15:07:56 +03:00
"fmt"
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"
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/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"
2024-02-27 10:12:22 +03:00
"code.gitea.io/gitea/services/context"
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 [ "PageIsAdminRepositories" ] = true
2021-06-09 02:33:54 +03:00
explore . RenderRepoSearch ( ctx , & explore . RepoSearchOptions {
2023-02-24 22:11:31 +03:00
Private : true ,
PageSize : setting . UI . Admin . RepoPagingNum ,
TplName : tplRepos ,
OnlyShowRelevant : false ,
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 ) {
2022-12-03 05:48:26 +03:00
repo , err := repo_model . GetRepositoryByID ( ctx , 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" ) )
2024-10-10 07:56:49 +03:00
ctx . JSONRedirect ( 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 [ "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 )
2024-03-16 15:07:56 +03:00
pager . AddParamString ( "search" , fmt . Sprint ( doSearch ) )
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
2023-03-01 01:17:51 +03:00
repoNames , count , err := repo_service . ListUnadoptedRepositories ( ctx , q , & opts )
2020-09-25 07:09:23 +03:00
if err != nil {
ctx . ServerError ( "ListUnadoptedRepositories" , err )
2024-05-28 12:31:59 +03:00
return
2020-09-25 07:09:23 +03:00
}
ctx . Data [ "Dirs" ] = repoNames
2022-06-20 13:02:49 +03:00
pager := context . NewPagination ( count , opts . PageSize , opts . Page , 5 )
2020-09-25 07:09:23 +03:00
pager . SetDefaultParams ( ctx )
2024-03-16 15:07:56 +03:00
pager . AddParamString ( "search" , fmt . Sprint ( doSearch ) )
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 {
2024-10-10 07:56:49 +03:00
ctx . Redirect ( setting . AppSubURL + "/-/admin/repos" )
2020-09-25 07:09:23 +03:00
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 ] )
2024-10-10 07:56:49 +03:00
ctx . Redirect ( setting . AppSubURL + "/-/admin/repos" )
2020-09-25 07:09:23 +03:00
return
}
ctx . ServerError ( "GetUserByName" , err )
return
}
repoName := dirSplit [ 1 ]
// check not a repo
2023-04-28 21:14:26 +03:00
has , err := repo_model . IsRepositoryModelExist ( 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" {
2023-09-06 15:08:51 +03:00
if _ , err := repo_service . AdoptRepository ( ctx , ctx . Doer , ctxUser , repo_service . 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" {
2023-03-01 01:17:51 +03:00
if err := repo_service . DeleteUnadoptedRepository ( ctx , 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 ) )
}
2024-10-10 07:56:49 +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
}