diff --git a/modules/structs/repo.go b/modules/structs/repo.go index c12f8e1c18e11..904a8fa89da8a 100644 --- a/modules/structs/repo.go +++ b/modules/structs/repo.go @@ -93,6 +93,18 @@ type Repository struct { Internal bool `json:"internal"` } +// CreateRepoOption options when creating repository +// swagger:model +type CreateRepoTemplateOption struct { + RepoTemplate int64 + GitContent bool + Topics bool + GitHooks bool + Webhooks bool + Avatar bool + Labels bool +} + // CreateRepoOption options when creating repository // swagger:model type CreateRepoOption struct { @@ -122,6 +134,8 @@ type CreateRepoOption struct { // TrustModel of the repository // enum: default,collaborator,committer,collaboratorcommitter TrustModel string `json:"trust_model"` + // Template contains all options to generate a repo based on a template + Template *CreateRepoTemplateOption `json:"template,omitempty"` } // EditRepoOption options when editing a repository's properties diff --git a/routers/api/v1/repo/repo.go b/routers/api/v1/repo/repo.go index 048f7d6b1f58b..83dededecdb88 100644 --- a/routers/api/v1/repo/repo.go +++ b/routers/api/v1/repo/repo.go @@ -235,19 +235,45 @@ func CreateUserRepo(ctx *context.APIContext, owner *models.User, opt api.CreateR if opt.AutoInit && opt.Readme == "" { opt.Readme = "Default" } - repo, err := repo_service.CreateRepository(ctx.User, owner, models.CreateRepoOptions{ - Name: opt.Name, - Description: opt.Description, - IssueLabels: opt.IssueLabels, - Gitignores: opt.Gitignores, - License: opt.License, - Readme: opt.Readme, - IsPrivate: opt.Private, - AutoInit: opt.AutoInit, - DefaultBranch: opt.DefaultBranch, - TrustModel: models.ToTrustModel(opt.TrustModel), - IsTemplate: opt.Template, - }) + + var err error + var repo *models.Repository + + if opt.Template != nil { + templateRepo, err2 := models.GetRepositoryByID(opt.Template.RepoTemplate) + if err2 != nil { + if models.IsErrRepoNotExist(err) { + ctx.Error(http.StatusNotFound, "GetTemplateRepo", fmt.Errorf("Template Repo [%d] not found", opt.Template.RepoTemplate)) + } + ctx.InternalServerError(err) + return + } + repo, err = repo_service.GenerateRepository(ctx.User, owner, templateRepo, models.GenerateRepoOptions{ + Name: opt.Name, + Description: opt.Description, + Private: opt.Private, + GitContent: opt.Template.GitContent, + Topics: opt.Template.Topics, + GitHooks: opt.Template.GitHooks, + Webhooks: opt.Template.Webhooks, + Avatar: opt.Template.Avatar, + IssueLabels: opt.Template.Labels, + }) + } else { + repo, err = repo_service.CreateRepository(ctx.User, owner, models.CreateRepoOptions{ + Name: opt.Name, + Description: opt.Description, + IssueLabels: opt.IssueLabels, + Gitignores: opt.Gitignores, + License: opt.License, + Readme: opt.Readme, + IsPrivate: opt.Private, + AutoInit: opt.AutoInit, + DefaultBranch: opt.DefaultBranch, + TrustModel: models.ToTrustModel(opt.TrustModel), + IsTemplate: opt.Template, + }) + } if err != nil { if models.IsErrRepoAlreadyExist(err) { ctx.Error(http.StatusConflict, "", "The repository with the same name already exists.")