gitea源码

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. // Copyright 2020 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package v1_12
  4. import (
  5. "code.gitea.io/gitea/modules/json"
  6. "code.gitea.io/gitea/modules/setting"
  7. "xorm.io/xorm"
  8. )
  9. func ExpandWebhooks(x *xorm.Engine) error {
  10. type HookEvents struct {
  11. Create bool `json:"create"`
  12. Delete bool `json:"delete"`
  13. Fork bool `json:"fork"`
  14. Issues bool `json:"issues"`
  15. IssueAssign bool `json:"issue_assign"`
  16. IssueLabel bool `json:"issue_label"`
  17. IssueMilestone bool `json:"issue_milestone"`
  18. IssueComment bool `json:"issue_comment"`
  19. Push bool `json:"push"`
  20. PullRequest bool `json:"pull_request"`
  21. PullRequestAssign bool `json:"pull_request_assign"`
  22. PullRequestLabel bool `json:"pull_request_label"`
  23. PullRequestMilestone bool `json:"pull_request_milestone"`
  24. PullRequestComment bool `json:"pull_request_comment"`
  25. PullRequestReview bool `json:"pull_request_review"`
  26. PullRequestSync bool `json:"pull_request_sync"`
  27. Repository bool `json:"repository"`
  28. Release bool `json:"release"`
  29. }
  30. type HookEvent struct {
  31. PushOnly bool `json:"push_only"`
  32. SendEverything bool `json:"send_everything"`
  33. ChooseEvents bool `json:"choose_events"`
  34. BranchFilter string `json:"branch_filter"`
  35. HookEvents `json:"events"`
  36. }
  37. type Webhook struct {
  38. ID int64
  39. Events string
  40. }
  41. var bytes []byte
  42. var last int
  43. batchSize := setting.Database.IterateBufferSize
  44. sess := x.NewSession()
  45. defer sess.Close()
  46. for {
  47. if err := sess.Begin(); err != nil {
  48. return err
  49. }
  50. results := make([]Webhook, 0, batchSize)
  51. err := x.OrderBy("id").
  52. Limit(batchSize, last).
  53. Find(&results)
  54. if err != nil {
  55. return err
  56. }
  57. if len(results) == 0 {
  58. break
  59. }
  60. last += len(results)
  61. for _, res := range results {
  62. var events HookEvent
  63. if err = json.Unmarshal([]byte(res.Events), &events); err != nil {
  64. return err
  65. }
  66. if !events.ChooseEvents {
  67. continue
  68. }
  69. if events.Issues {
  70. events.IssueAssign = true
  71. events.IssueLabel = true
  72. events.IssueMilestone = true
  73. events.IssueComment = true
  74. }
  75. if events.PullRequest {
  76. events.PullRequestAssign = true
  77. events.PullRequestLabel = true
  78. events.PullRequestMilestone = true
  79. events.PullRequestComment = true
  80. events.PullRequestReview = true
  81. events.PullRequestSync = true
  82. }
  83. if bytes, err = json.Marshal(&events); err != nil {
  84. return err
  85. }
  86. _, err = sess.Exec("UPDATE webhook SET events = ? WHERE id = ?", string(bytes), res.ID)
  87. if err != nil {
  88. return err
  89. }
  90. }
  91. if err := sess.Commit(); err != nil {
  92. return err
  93. }
  94. }
  95. return nil
  96. }