You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

template.go 3.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. // Copyright 2019 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package repository
  4. import (
  5. "context"
  6. "code.gitea.io/gitea/models/db"
  7. git_model "code.gitea.io/gitea/models/git"
  8. issues_model "code.gitea.io/gitea/models/issues"
  9. repo_model "code.gitea.io/gitea/models/repo"
  10. user_model "code.gitea.io/gitea/models/user"
  11. repo_module "code.gitea.io/gitea/modules/repository"
  12. notify_service "code.gitea.io/gitea/services/notify"
  13. )
  14. // GenerateIssueLabels generates issue labels from a template repository
  15. func GenerateIssueLabels(ctx context.Context, templateRepo, generateRepo *repo_model.Repository) error {
  16. templateLabels, err := issues_model.GetLabelsByRepoID(ctx, templateRepo.ID, "", db.ListOptions{})
  17. if err != nil {
  18. return err
  19. }
  20. // Prevent insert being called with an empty slice which would result in
  21. // err "no element on slice when insert".
  22. if len(templateLabels) == 0 {
  23. return nil
  24. }
  25. newLabels := make([]*issues_model.Label, 0, len(templateLabels))
  26. for _, templateLabel := range templateLabels {
  27. newLabels = append(newLabels, &issues_model.Label{
  28. RepoID: generateRepo.ID,
  29. Name: templateLabel.Name,
  30. Exclusive: templateLabel.Exclusive,
  31. Description: templateLabel.Description,
  32. Color: templateLabel.Color,
  33. })
  34. }
  35. return db.Insert(ctx, newLabels)
  36. }
  37. func GenerateProtectedBranch(ctx context.Context, templateRepo, generateRepo *repo_model.Repository) error {
  38. templateBranches, err := git_model.FindRepoProtectedBranchRules(ctx, templateRepo.ID)
  39. if err != nil {
  40. return err
  41. }
  42. // Prevent insert being called with an empty slice which would result in
  43. // err "no element on slice when insert".
  44. if len(templateBranches) == 0 {
  45. return nil
  46. }
  47. newBranches := make([]*git_model.ProtectedBranch, 0, len(templateBranches))
  48. for _, templateBranch := range templateBranches {
  49. templateBranch.ID = 0
  50. templateBranch.RepoID = generateRepo.ID
  51. templateBranch.UpdatedUnix = 0
  52. templateBranch.CreatedUnix = 0
  53. newBranches = append(newBranches, templateBranch)
  54. }
  55. return db.Insert(ctx, newBranches)
  56. }
  57. // GenerateRepository generates a repository from a template
  58. func GenerateRepository(ctx context.Context, doer, owner *user_model.User, templateRepo *repo_model.Repository, opts repo_module.GenerateRepoOptions) (_ *repo_model.Repository, err error) {
  59. if !doer.IsAdmin && !owner.CanCreateRepo() {
  60. return nil, repo_model.ErrReachLimitOfRepo{
  61. Limit: owner.MaxRepoCreation,
  62. }
  63. }
  64. var generateRepo *repo_model.Repository
  65. if err = db.WithTx(ctx, func(ctx context.Context) error {
  66. generateRepo, err = repo_module.GenerateRepository(ctx, doer, owner, templateRepo, opts)
  67. if err != nil {
  68. return err
  69. }
  70. // Git Content
  71. if opts.GitContent && !templateRepo.IsEmpty {
  72. if err = repo_module.GenerateGitContent(ctx, templateRepo, generateRepo); err != nil {
  73. return err
  74. }
  75. }
  76. // Topics
  77. if opts.Topics {
  78. if err = repo_model.GenerateTopics(ctx, templateRepo, generateRepo); err != nil {
  79. return err
  80. }
  81. }
  82. // Git Hooks
  83. if opts.GitHooks {
  84. if err = GenerateGitHooks(ctx, templateRepo, generateRepo); err != nil {
  85. return err
  86. }
  87. }
  88. // Webhooks
  89. if opts.Webhooks {
  90. if err = GenerateWebhooks(ctx, templateRepo, generateRepo); err != nil {
  91. return err
  92. }
  93. }
  94. // Avatar
  95. if opts.Avatar && len(templateRepo.Avatar) > 0 {
  96. if err = generateAvatar(ctx, templateRepo, generateRepo); err != nil {
  97. return err
  98. }
  99. }
  100. // Issue Labels
  101. if opts.IssueLabels {
  102. if err = GenerateIssueLabels(ctx, templateRepo, generateRepo); err != nil {
  103. return err
  104. }
  105. }
  106. if opts.ProtectedBranch {
  107. if err = GenerateProtectedBranch(ctx, templateRepo, generateRepo); err != nil {
  108. return err
  109. }
  110. }
  111. return nil
  112. }); err != nil {
  113. return nil, err
  114. }
  115. notify_service.CreateRepository(ctx, doer, owner, generateRepo)
  116. return generateRepo, nil
  117. }