aboutsummaryrefslogtreecommitdiffstats
path: root/modules/repository/create.go
diff options
context:
space:
mode:
authorLunny Xiao <xiaolunwen@gmail.com>2023-09-06 20:08:51 +0800
committerGitHub <noreply@github.com>2023-09-06 12:08:51 +0000
commitb9df9fa2e22d0bbf66a549183749b9dfaca6bd2f (patch)
tree2746f647c6d5f616afa5fc9acd2103e7091cb1ff /modules/repository/create.go
parentb3d88ada01c5bafe0581dc129fabe35a6faa3a85 (diff)
downloadgitea-b9df9fa2e22d0bbf66a549183749b9dfaca6bd2f.tar.gz
gitea-b9df9fa2e22d0bbf66a549183749b9dfaca6bd2f.zip
Move createrepository from module to service layer (#26927)
Repository creation depends on many models, so moving it to service layer is better.
Diffstat (limited to 'modules/repository/create.go')
-rw-r--r--modules/repository/create.go137
1 files changed, 0 insertions, 137 deletions
diff --git a/modules/repository/create.go b/modules/repository/create.go
index 10a1e872df..2dac35224e 100644
--- a/modules/repository/create.go
+++ b/modules/repository/create.go
@@ -22,7 +22,6 @@ import (
"code.gitea.io/gitea/models/unit"
user_model "code.gitea.io/gitea/models/user"
"code.gitea.io/gitea/models/webhook"
- "code.gitea.io/gitea/modules/git"
issue_indexer "code.gitea.io/gitea/modules/indexer/issues"
"code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/setting"
@@ -156,142 +155,6 @@ func CreateRepositoryByExample(ctx context.Context, doer, u *user_model.User, re
return nil
}
-// CreateRepoOptions contains the create repository options
-type CreateRepoOptions struct {
- Name string
- Description string
- OriginalURL string
- GitServiceType api.GitServiceType
- Gitignores string
- IssueLabels string
- License string
- Readme string
- DefaultBranch string
- IsPrivate bool
- IsMirror bool
- IsTemplate bool
- AutoInit bool
- Status repo_model.RepositoryStatus
- TrustModel repo_model.TrustModelType
- MirrorInterval string
-}
-
-// CreateRepository creates a repository for the user/organization.
-func CreateRepository(doer, u *user_model.User, opts CreateRepoOptions) (*repo_model.Repository, error) {
- if !doer.IsAdmin && !u.CanCreateRepo() {
- return nil, repo_model.ErrReachLimitOfRepo{
- Limit: u.MaxRepoCreation,
- }
- }
-
- if len(opts.DefaultBranch) == 0 {
- opts.DefaultBranch = setting.Repository.DefaultBranch
- }
-
- // Check if label template exist
- if len(opts.IssueLabels) > 0 {
- if _, err := LoadTemplateLabelsByDisplayName(opts.IssueLabels); err != nil {
- return nil, err
- }
- }
-
- repo := &repo_model.Repository{
- OwnerID: u.ID,
- Owner: u,
- OwnerName: u.Name,
- Name: opts.Name,
- LowerName: strings.ToLower(opts.Name),
- Description: opts.Description,
- OriginalURL: opts.OriginalURL,
- OriginalServiceType: opts.GitServiceType,
- IsPrivate: opts.IsPrivate,
- IsFsckEnabled: !opts.IsMirror,
- IsTemplate: opts.IsTemplate,
- CloseIssuesViaCommitInAnyBranch: setting.Repository.DefaultCloseIssuesViaCommitsInAnyBranch,
- Status: opts.Status,
- IsEmpty: !opts.AutoInit,
- TrustModel: opts.TrustModel,
- IsMirror: opts.IsMirror,
- DefaultBranch: opts.DefaultBranch,
- }
-
- var rollbackRepo *repo_model.Repository
-
- if err := db.WithTx(db.DefaultContext, func(ctx context.Context) error {
- if err := CreateRepositoryByExample(ctx, doer, u, repo, false, false); err != nil {
- return err
- }
-
- // No need for init mirror.
- if opts.IsMirror {
- return nil
- }
-
- repoPath := repo_model.RepoPath(u.Name, repo.Name)
- isExist, err := util.IsExist(repoPath)
- if err != nil {
- log.Error("Unable to check if %s exists. Error: %v", repoPath, err)
- return err
- }
- if isExist {
- // repo already exists - We have two or three options.
- // 1. We fail stating that the directory exists
- // 2. We create the db repository to go with this data and adopt the git repo
- // 3. We delete it and start afresh
- //
- // Previously Gitea would just delete and start afresh - this was naughty.
- // So we will now fail and delegate to other functionality to adopt or delete
- log.Error("Files already exist in %s and we are not going to adopt or delete.", repoPath)
- return repo_model.ErrRepoFilesAlreadyExist{
- Uname: u.Name,
- Name: repo.Name,
- }
- }
-
- if err = initRepository(ctx, repoPath, doer, repo, opts); err != nil {
- if err2 := util.RemoveAll(repoPath); err2 != nil {
- log.Error("initRepository: %v", err)
- return fmt.Errorf(
- "delete repo directory %s/%s failed(2): %v", u.Name, repo.Name, err2)
- }
- return fmt.Errorf("initRepository: %w", err)
- }
-
- // Initialize Issue Labels if selected
- if len(opts.IssueLabels) > 0 {
- if err = InitializeLabels(ctx, repo.ID, opts.IssueLabels, false); err != nil {
- rollbackRepo = repo
- rollbackRepo.OwnerID = u.ID
- return fmt.Errorf("InitializeLabels: %w", err)
- }
- }
-
- if err := CheckDaemonExportOK(ctx, repo); err != nil {
- return fmt.Errorf("checkDaemonExportOK: %w", err)
- }
-
- if stdout, _, err := git.NewCommand(ctx, "update-server-info").
- SetDescription(fmt.Sprintf("CreateRepository(git update-server-info): %s", repoPath)).
- RunStdString(&git.RunOpts{Dir: repoPath}); err != nil {
- log.Error("CreateRepository(git update-server-info) in %v: Stdout: %s\nError: %v", repo, stdout, err)
- rollbackRepo = repo
- rollbackRepo.OwnerID = u.ID
- return fmt.Errorf("CreateRepository(git update-server-info): %w", err)
- }
- return nil
- }); err != nil {
- if rollbackRepo != nil {
- if errDelete := models.DeleteRepository(doer, rollbackRepo.OwnerID, rollbackRepo.ID); errDelete != nil {
- log.Error("Rollback deleteRepository: %v", errDelete)
- }
- }
-
- return nil, err
- }
-
- return repo, nil
-}
-
const notRegularFileMode = os.ModeSymlink | os.ModeNamedPipe | os.ModeSocket | os.ModeDevice | os.ModeCharDevice | os.ModeIrregular
// getDirectorySize returns the disk consumption for a given path