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.

hooks.go 3.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. // Copyright 2021 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package repository
  4. import (
  5. "context"
  6. "fmt"
  7. "code.gitea.io/gitea/models/db"
  8. repo_model "code.gitea.io/gitea/models/repo"
  9. "code.gitea.io/gitea/models/webhook"
  10. "code.gitea.io/gitea/modules/gitrepo"
  11. "code.gitea.io/gitea/modules/log"
  12. repo_module "code.gitea.io/gitea/modules/repository"
  13. "xorm.io/builder"
  14. )
  15. // SyncRepositoryHooks rewrites all repositories' pre-receive, update and post-receive hooks
  16. // to make sure the binary and custom conf path are up-to-date.
  17. func SyncRepositoryHooks(ctx context.Context) error {
  18. log.Trace("Doing: SyncRepositoryHooks")
  19. if err := db.Iterate(
  20. ctx,
  21. builder.Gt{"id": 0},
  22. func(ctx context.Context, repo *repo_model.Repository) error {
  23. select {
  24. case <-ctx.Done():
  25. return db.ErrCancelledf("before sync repository hooks for %s", repo.FullName())
  26. default:
  27. }
  28. if err := repo_module.CreateDelegateHooks(repo.RepoPath()); err != nil {
  29. return fmt.Errorf("SyncRepositoryHook: %w", err)
  30. }
  31. if repo.HasWiki() {
  32. if err := repo_module.CreateDelegateHooks(repo.WikiPath()); err != nil {
  33. return fmt.Errorf("SyncRepositoryHook: %w", err)
  34. }
  35. }
  36. return nil
  37. },
  38. ); err != nil {
  39. return err
  40. }
  41. log.Trace("Finished: SyncRepositoryHooks")
  42. return nil
  43. }
  44. // GenerateGitHooks generates git hooks from a template repository
  45. func GenerateGitHooks(ctx context.Context, templateRepo, generateRepo *repo_model.Repository) error {
  46. generateGitRepo, err := gitrepo.OpenRepository(ctx, generateRepo)
  47. if err != nil {
  48. return err
  49. }
  50. defer generateGitRepo.Close()
  51. templateGitRepo, err := gitrepo.OpenRepository(ctx, templateRepo)
  52. if err != nil {
  53. return err
  54. }
  55. defer templateGitRepo.Close()
  56. templateHooks, err := templateGitRepo.Hooks()
  57. if err != nil {
  58. return err
  59. }
  60. for _, templateHook := range templateHooks {
  61. generateHook, err := generateGitRepo.GetHook(templateHook.Name())
  62. if err != nil {
  63. return err
  64. }
  65. generateHook.Content = templateHook.Content
  66. if err := generateHook.Update(); err != nil {
  67. return err
  68. }
  69. }
  70. return nil
  71. }
  72. // GenerateWebhooks generates webhooks from a template repository
  73. func GenerateWebhooks(ctx context.Context, templateRepo, generateRepo *repo_model.Repository) error {
  74. templateWebhooks, err := db.Find[webhook.Webhook](ctx, webhook.ListWebhookOptions{RepoID: templateRepo.ID})
  75. if err != nil {
  76. return err
  77. }
  78. ws := make([]*webhook.Webhook, 0, len(templateWebhooks))
  79. for _, templateWebhook := range templateWebhooks {
  80. ws = append(ws, &webhook.Webhook{
  81. RepoID: generateRepo.ID,
  82. URL: templateWebhook.URL,
  83. HTTPMethod: templateWebhook.HTTPMethod,
  84. ContentType: templateWebhook.ContentType,
  85. Secret: templateWebhook.Secret,
  86. HookEvent: templateWebhook.HookEvent,
  87. IsActive: templateWebhook.IsActive,
  88. Type: templateWebhook.Type,
  89. OwnerID: templateWebhook.OwnerID,
  90. Events: templateWebhook.Events,
  91. Meta: templateWebhook.Meta,
  92. })
  93. }
  94. return webhook.CreateWebhooks(ctx, ws)
  95. }