code.gitea.io/gitea@v1.21.7/routers/web/user/setting/adopt.go (about)

     1  // Copyright 2020 The Gitea Authors. All rights reserved.
     2  // SPDX-License-Identifier: MIT
     3  
     4  package setting
     5  
     6  import (
     7  	"path/filepath"
     8  
     9  	repo_model "code.gitea.io/gitea/models/repo"
    10  	user_model "code.gitea.io/gitea/models/user"
    11  	"code.gitea.io/gitea/modules/context"
    12  	"code.gitea.io/gitea/modules/setting"
    13  	"code.gitea.io/gitea/modules/util"
    14  	repo_service "code.gitea.io/gitea/services/repository"
    15  )
    16  
    17  // AdoptOrDeleteRepository adopts or deletes a repository
    18  func AdoptOrDeleteRepository(ctx *context.Context) {
    19  	ctx.Data["Title"] = ctx.Tr("settings.adopt")
    20  	ctx.Data["PageIsSettingsRepos"] = true
    21  	allowAdopt := ctx.IsUserSiteAdmin() || setting.Repository.AllowAdoptionOfUnadoptedRepositories
    22  	ctx.Data["allowAdopt"] = allowAdopt
    23  	allowDelete := ctx.IsUserSiteAdmin() || setting.Repository.AllowDeleteOfUnadoptedRepositories
    24  	ctx.Data["allowDelete"] = allowDelete
    25  
    26  	dir := ctx.FormString("id")
    27  	action := ctx.FormString("action")
    28  
    29  	ctxUser := ctx.Doer
    30  	root := user_model.UserPath(ctxUser.LowerName)
    31  
    32  	// check not a repo
    33  	has, err := repo_model.IsRepositoryModelExist(ctx, ctxUser, dir)
    34  	if err != nil {
    35  		ctx.ServerError("IsRepositoryExist", err)
    36  		return
    37  	}
    38  
    39  	isDir, err := util.IsDir(filepath.Join(root, dir+".git"))
    40  	if err != nil {
    41  		ctx.ServerError("IsDir", err)
    42  		return
    43  	}
    44  	if has || !isDir {
    45  		// Fallthrough to failure mode
    46  	} else if action == "adopt" && allowAdopt {
    47  		if _, err := repo_service.AdoptRepository(ctx, ctxUser, ctxUser, repo_service.CreateRepoOptions{
    48  			Name:      dir,
    49  			IsPrivate: true,
    50  		}); err != nil {
    51  			ctx.ServerError("repository.AdoptRepository", err)
    52  			return
    53  		}
    54  		ctx.Flash.Success(ctx.Tr("repo.adopt_preexisting_success", dir))
    55  	} else if action == "delete" && allowDelete {
    56  		if err := repo_service.DeleteUnadoptedRepository(ctx, ctxUser, ctxUser, dir); err != nil {
    57  			ctx.ServerError("repository.AdoptRepository", err)
    58  			return
    59  		}
    60  		ctx.Flash.Success(ctx.Tr("repo.delete_preexisting_success", dir))
    61  	}
    62  
    63  	ctx.Redirect(setting.AppSubURL + "/user/settings/repos")
    64  }