gitea源码

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