2019-11-24 20:57:52 +03:00
// Copyright 2019 The Gitea 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 repository
import (
2021-09-23 18:45:36 +03:00
"context"
2019-11-24 20:57:52 +03:00
"code.gitea.io/gitea/models"
2021-09-19 14:49:59 +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"
2019-11-24 20:57:52 +03:00
"code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/notification"
2020-01-12 15:11:17 +03:00
repo_module "code.gitea.io/gitea/modules/repository"
2019-11-24 20:57:52 +03:00
)
// GenerateRepository generates a repository from a template
2021-12-10 04:27:50 +03:00
func GenerateRepository ( doer , owner * user_model . User , templateRepo * repo_model . Repository , opts models . GenerateRepoOptions ) ( _ * repo_model . Repository , err error ) {
2021-05-27 19:08:46 +03:00
if ! doer . IsAdmin && ! owner . CanCreateRepo ( ) {
2021-12-12 18:48:20 +03:00
return nil , repo_model . ErrReachLimitOfRepo {
2021-05-27 19:08:46 +03:00
Limit : owner . MaxRepoCreation ,
}
}
2021-12-10 04:27:50 +03:00
var generateRepo * repo_model . Repository
2021-09-23 18:45:36 +03:00
if err = db . WithTx ( func ( ctx context . Context ) error {
2020-01-12 15:11:17 +03:00
generateRepo , err = repo_module . GenerateRepository ( ctx , doer , owner , templateRepo , opts )
2019-11-24 20:57:52 +03:00
if err != nil {
return err
}
// Git Content
if opts . GitContent && ! templateRepo . IsEmpty {
2020-01-12 15:11:17 +03:00
if err = repo_module . GenerateGitContent ( ctx , templateRepo , generateRepo ) ; err != nil {
2019-11-24 20:57:52 +03:00
return err
}
}
// Topics
if opts . Topics {
2021-12-12 18:48:20 +03:00
if err = repo_model . GenerateTopics ( ctx , templateRepo , generateRepo ) ; err != nil {
2019-11-24 20:57:52 +03:00
return err
}
}
// Git Hooks
if opts . GitHooks {
2021-12-12 18:48:20 +03:00
if err = GenerateGitHooks ( ctx , templateRepo , generateRepo ) ; err != nil {
2019-11-24 20:57:52 +03:00
return err
}
}
// Webhooks
if opts . Webhooks {
if err = models . GenerateWebhooks ( ctx , templateRepo , generateRepo ) ; err != nil {
return err
}
}
2019-11-25 08:17:51 +03:00
// Avatar
if opts . Avatar && len ( templateRepo . Avatar ) > 0 {
2021-12-12 18:48:20 +03:00
if err = generateAvatar ( ctx , templateRepo , generateRepo ) ; err != nil {
2019-11-25 08:17:51 +03:00
return err
}
}
// Issue Labels
if opts . IssueLabels {
if err = models . GenerateIssueLabels ( ctx , templateRepo , generateRepo ) ; err != nil {
return err
}
}
2019-11-24 20:57:52 +03:00
return nil
} ) ; err != nil {
2020-09-25 07:09:23 +03:00
if generateRepo != nil && generateRepo . ID > 0 {
2019-11-24 20:57:52 +03:00
if errDelete := models . DeleteRepository ( doer , owner . ID , generateRepo . ID ) ; errDelete != nil {
log . Error ( "Rollback deleteRepository: %v" , errDelete )
}
}
return nil , err
}
notification . NotifyCreateRepository ( doer , owner , generateRepo )
return generateRepo , nil
}