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.

repo_generate.go 3.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. // Copyright 2019 The Gitea Authors. All rights reserved.
  2. // Use of this source code is governed by a MIT-style
  3. // license that can be found in the LICENSE file.
  4. package models
  5. import (
  6. "bufio"
  7. "bytes"
  8. "context"
  9. "strings"
  10. "code.gitea.io/gitea/models/db"
  11. repo_model "code.gitea.io/gitea/models/repo"
  12. "code.gitea.io/gitea/models/webhook"
  13. "code.gitea.io/gitea/modules/log"
  14. "github.com/gobwas/glob"
  15. )
  16. // GenerateRepoOptions contains the template units to generate
  17. type GenerateRepoOptions struct {
  18. Name string
  19. DefaultBranch string
  20. Description string
  21. Private bool
  22. GitContent bool
  23. Topics bool
  24. GitHooks bool
  25. Webhooks bool
  26. Avatar bool
  27. IssueLabels bool
  28. }
  29. // IsValid checks whether at least one option is chosen for generation
  30. func (gro GenerateRepoOptions) IsValid() bool {
  31. return gro.GitContent || gro.Topics || gro.GitHooks || gro.Webhooks || gro.Avatar || gro.IssueLabels // or other items as they are added
  32. }
  33. // GiteaTemplate holds information about a .gitea/template file
  34. type GiteaTemplate struct {
  35. Path string
  36. Content []byte
  37. globs []glob.Glob
  38. }
  39. // Globs parses the .gitea/template globs or returns them if they were already parsed
  40. func (gt GiteaTemplate) Globs() []glob.Glob {
  41. if gt.globs != nil {
  42. return gt.globs
  43. }
  44. gt.globs = make([]glob.Glob, 0)
  45. scanner := bufio.NewScanner(bytes.NewReader(gt.Content))
  46. for scanner.Scan() {
  47. line := strings.TrimSpace(scanner.Text())
  48. if line == "" || strings.HasPrefix(line, "#") {
  49. continue
  50. }
  51. g, err := glob.Compile(line, '/')
  52. if err != nil {
  53. log.Info("Invalid glob expression '%s' (skipped): %v", line, err)
  54. continue
  55. }
  56. gt.globs = append(gt.globs, g)
  57. }
  58. return gt.globs
  59. }
  60. // GenerateWebhooks generates webhooks from a template repository
  61. func GenerateWebhooks(ctx context.Context, templateRepo, generateRepo *repo_model.Repository) error {
  62. templateWebhooks, err := webhook.ListWebhooksByOpts(ctx, &webhook.ListWebhookOptions{RepoID: templateRepo.ID})
  63. if err != nil {
  64. return err
  65. }
  66. for _, templateWebhook := range templateWebhooks {
  67. generateWebhook := &webhook.Webhook{
  68. RepoID: generateRepo.ID,
  69. URL: templateWebhook.URL,
  70. HTTPMethod: templateWebhook.HTTPMethod,
  71. ContentType: templateWebhook.ContentType,
  72. Secret: templateWebhook.Secret,
  73. HookEvent: templateWebhook.HookEvent,
  74. IsActive: templateWebhook.IsActive,
  75. Type: templateWebhook.Type,
  76. OrgID: templateWebhook.OrgID,
  77. Events: templateWebhook.Events,
  78. Meta: templateWebhook.Meta,
  79. }
  80. if err := webhook.CreateWebhook(ctx, generateWebhook); err != nil {
  81. return err
  82. }
  83. }
  84. return nil
  85. }
  86. // GenerateIssueLabels generates issue labels from a template repository
  87. func GenerateIssueLabels(ctx context.Context, templateRepo, generateRepo *repo_model.Repository) error {
  88. templateLabels, err := GetLabelsByRepoID(ctx, templateRepo.ID, "", db.ListOptions{})
  89. if err != nil {
  90. return err
  91. }
  92. for _, templateLabel := range templateLabels {
  93. generateLabel := &Label{
  94. RepoID: generateRepo.ID,
  95. Name: templateLabel.Name,
  96. Description: templateLabel.Description,
  97. Color: templateLabel.Color,
  98. }
  99. if err := db.Insert(ctx, generateLabel); err != nil {
  100. return err
  101. }
  102. }
  103. return nil
  104. }