mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-11-04 01:34:27 +00:00 
			
		
		
		
	Granular webhook events (#9626)
* Initial work Signed-off-by: jolheiser <john.olheiser@gmail.com> * Add PR reviews and API coverage Signed-off-by: jolheiser <john.olheiser@gmail.com> * Split up events Signed-off-by: jolheiser <john.olheiser@gmail.com> * Add migration and locale Signed-off-by: jolheiser <john.olheiser@gmail.com> * Format Signed-off-by: jolheiser <john.olheiser@gmail.com> * Revert IsPull Signed-off-by: jolheiser <john.olheiser@gmail.com> * Fix comments Signed-off-by: jolheiser <john.olheiser@gmail.com> * Fix tests Signed-off-by: jolheiser <john.olheiser@gmail.com> * Fix PR reviews Signed-off-by: jolheiser <john.olheiser@gmail.com> * Fix issue_comment Signed-off-by: jolheiser <john.olheiser@gmail.com> * Make fmt Signed-off-by: jolheiser <john.olheiser@gmail.com> * Migrations Signed-off-by: jolheiser <john.olheiser@gmail.com> * Backwards compatible API Signed-off-by: jolheiser <john.olheiser@gmail.com> * Fix feishu Signed-off-by: jolheiser <john.olheiser@gmail.com> * Move session commit Signed-off-by: jolheiser <john.olheiser@gmail.com> Co-authored-by: Lauris BH <lauris@nix.lv> Co-authored-by: guillep2k <18600385+guillep2k@users.noreply.github.com>
This commit is contained in:
		@@ -192,6 +192,8 @@ var migrations = []Migration{
 | 
				
			|||||||
	NewMigration("fix merge base for pull requests", fixMergeBase),
 | 
						NewMigration("fix merge base for pull requests", fixMergeBase),
 | 
				
			||||||
	// v129 -> v130
 | 
						// v129 -> v130
 | 
				
			||||||
	NewMigration("remove dependencies from deleted repositories", purgeUnusedDependencies),
 | 
						NewMigration("remove dependencies from deleted repositories", purgeUnusedDependencies),
 | 
				
			||||||
 | 
						// v130 -> v131
 | 
				
			||||||
 | 
						NewMigration("Expand webhooks for more granularity", expandWebhooks),
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Migrate database to current version
 | 
					// Migrate database to current version
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										101
									
								
								models/migrations/v130.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										101
									
								
								models/migrations/v130.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,101 @@
 | 
				
			|||||||
 | 
					// Copyright 2020 The Gitea Authors. All rights reserved.
 | 
				
			||||||
 | 
					// Use of this source code is governed by a MIT-style
 | 
				
			||||||
 | 
					// license that can be found in the LICENSE file.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package migrations
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"encoding/json"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"xorm.io/xorm"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func expandWebhooks(x *xorm.Engine) error {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						type ChooseEvents struct {
 | 
				
			||||||
 | 
							Issues               bool `json:"issues"`
 | 
				
			||||||
 | 
							IssueAssign          bool `json:"issue_assign"`
 | 
				
			||||||
 | 
							IssueLabel           bool `json:"issue_label"`
 | 
				
			||||||
 | 
							IssueMilestone       bool `json:"issue_milestone"`
 | 
				
			||||||
 | 
							IssueComment         bool `json:"issue_comment"`
 | 
				
			||||||
 | 
							PullRequest          bool `json:"pull_request"`
 | 
				
			||||||
 | 
							PullRequestAssign    bool `json:"pull_request_assign"`
 | 
				
			||||||
 | 
							PullRequestLabel     bool `json:"pull_request_label"`
 | 
				
			||||||
 | 
							PullRequestMilestone bool `json:"pull_request_milestone"`
 | 
				
			||||||
 | 
							PullRequestComment   bool `json:"pull_request_comment"`
 | 
				
			||||||
 | 
							PullRequestReview    bool `json:"pull_request_review"`
 | 
				
			||||||
 | 
							PullRequestSync      bool `json:"pull_request_sync"`
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						type Events struct {
 | 
				
			||||||
 | 
							PushOnly       bool         `json:"push_only"`
 | 
				
			||||||
 | 
							SendEverything bool         `json:"send_everything"`
 | 
				
			||||||
 | 
							ChooseEvents   bool         `json:"choose_events"`
 | 
				
			||||||
 | 
							BranchFilter   string       `json:"branch_filter"`
 | 
				
			||||||
 | 
							Events         ChooseEvents `json:"events"`
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						type Webhook struct {
 | 
				
			||||||
 | 
							ID     int64
 | 
				
			||||||
 | 
							Events string
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						var events Events
 | 
				
			||||||
 | 
						var bytes []byte
 | 
				
			||||||
 | 
						var last int
 | 
				
			||||||
 | 
						const batchSize = 50
 | 
				
			||||||
 | 
						sess := x.NewSession()
 | 
				
			||||||
 | 
						defer sess.Close()
 | 
				
			||||||
 | 
						for {
 | 
				
			||||||
 | 
							if err := sess.Begin(); err != nil {
 | 
				
			||||||
 | 
								return err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							var results = make([]Webhook, 0, batchSize)
 | 
				
			||||||
 | 
							err := x.OrderBy("id").
 | 
				
			||||||
 | 
								Limit(batchSize, last).
 | 
				
			||||||
 | 
								Find(&results)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if len(results) == 0 {
 | 
				
			||||||
 | 
								break
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							last += len(results)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							for _, res := range results {
 | 
				
			||||||
 | 
								if err = json.Unmarshal([]byte(res.Events), &events); err != nil {
 | 
				
			||||||
 | 
									return err
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if events.Events.Issues {
 | 
				
			||||||
 | 
									events.Events.IssueAssign = true
 | 
				
			||||||
 | 
									events.Events.IssueLabel = true
 | 
				
			||||||
 | 
									events.Events.IssueMilestone = true
 | 
				
			||||||
 | 
									events.Events.IssueComment = true
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if events.Events.PullRequest {
 | 
				
			||||||
 | 
									events.Events.PullRequestAssign = true
 | 
				
			||||||
 | 
									events.Events.PullRequestLabel = true
 | 
				
			||||||
 | 
									events.Events.PullRequestMilestone = true
 | 
				
			||||||
 | 
									events.Events.PullRequestComment = true
 | 
				
			||||||
 | 
									events.Events.PullRequestReview = true
 | 
				
			||||||
 | 
									events.Events.PullRequestSync = true
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if bytes, err = json.Marshal(&events); err != nil {
 | 
				
			||||||
 | 
									return err
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								_, err = sess.Exec("UPDATE webhook SET events = ? WHERE id = ?", string(bytes), res.ID)
 | 
				
			||||||
 | 
								if err != nil {
 | 
				
			||||||
 | 
									return err
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if err := sess.Commit(); err != nil {
 | 
				
			||||||
 | 
								return err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -57,15 +57,24 @@ func IsValidHookContentType(name string) bool {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// HookEvents is a set of web hook events
 | 
					// HookEvents is a set of web hook events
 | 
				
			||||||
type HookEvents struct {
 | 
					type HookEvents struct {
 | 
				
			||||||
	Create       bool `json:"create"`
 | 
						Create               bool `json:"create"`
 | 
				
			||||||
	Delete       bool `json:"delete"`
 | 
						Delete               bool `json:"delete"`
 | 
				
			||||||
	Fork         bool `json:"fork"`
 | 
						Fork                 bool `json:"fork"`
 | 
				
			||||||
	Issues       bool `json:"issues"`
 | 
						Issues               bool `json:"issues"`
 | 
				
			||||||
	IssueComment bool `json:"issue_comment"`
 | 
						IssueAssign          bool `json:"issue_assign"`
 | 
				
			||||||
	Push         bool `json:"push"`
 | 
						IssueLabel           bool `json:"issue_label"`
 | 
				
			||||||
	PullRequest  bool `json:"pull_request"`
 | 
						IssueMilestone       bool `json:"issue_milestone"`
 | 
				
			||||||
	Repository   bool `json:"repository"`
 | 
						IssueComment         bool `json:"issue_comment"`
 | 
				
			||||||
	Release      bool `json:"release"`
 | 
						Push                 bool `json:"push"`
 | 
				
			||||||
 | 
						PullRequest          bool `json:"pull_request"`
 | 
				
			||||||
 | 
						PullRequestAssign    bool `json:"pull_request_assign"`
 | 
				
			||||||
 | 
						PullRequestLabel     bool `json:"pull_request_label"`
 | 
				
			||||||
 | 
						PullRequestMilestone bool `json:"pull_request_milestone"`
 | 
				
			||||||
 | 
						PullRequestComment   bool `json:"pull_request_comment"`
 | 
				
			||||||
 | 
						PullRequestReview    bool `json:"pull_request_review"`
 | 
				
			||||||
 | 
						PullRequestSync      bool `json:"pull_request_sync"`
 | 
				
			||||||
 | 
						Repository           bool `json:"repository"`
 | 
				
			||||||
 | 
						Release              bool `json:"release"`
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// HookEvent represents events that will delivery hook.
 | 
					// HookEvent represents events that will delivery hook.
 | 
				
			||||||
@@ -154,6 +163,24 @@ func (w *Webhook) HasIssuesEvent() bool {
 | 
				
			|||||||
		(w.ChooseEvents && w.HookEvents.Issues)
 | 
							(w.ChooseEvents && w.HookEvents.Issues)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// HasIssuesAssignEvent returns true if hook enabled issues assign event.
 | 
				
			||||||
 | 
					func (w *Webhook) HasIssuesAssignEvent() bool {
 | 
				
			||||||
 | 
						return w.SendEverything ||
 | 
				
			||||||
 | 
							(w.ChooseEvents && w.HookEvents.IssueAssign)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// HasIssuesLabelEvent returns true if hook enabled issues label event.
 | 
				
			||||||
 | 
					func (w *Webhook) HasIssuesLabelEvent() bool {
 | 
				
			||||||
 | 
						return w.SendEverything ||
 | 
				
			||||||
 | 
							(w.ChooseEvents && w.HookEvents.IssueLabel)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// HasIssuesMilestoneEvent returns true if hook enabled issues milestone event.
 | 
				
			||||||
 | 
					func (w *Webhook) HasIssuesMilestoneEvent() bool {
 | 
				
			||||||
 | 
						return w.SendEverything ||
 | 
				
			||||||
 | 
							(w.ChooseEvents && w.HookEvents.IssueMilestone)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// HasIssueCommentEvent returns true if hook enabled issue_comment event.
 | 
					// HasIssueCommentEvent returns true if hook enabled issue_comment event.
 | 
				
			||||||
func (w *Webhook) HasIssueCommentEvent() bool {
 | 
					func (w *Webhook) HasIssueCommentEvent() bool {
 | 
				
			||||||
	return w.SendEverything ||
 | 
						return w.SendEverything ||
 | 
				
			||||||
@@ -172,6 +199,54 @@ func (w *Webhook) HasPullRequestEvent() bool {
 | 
				
			|||||||
		(w.ChooseEvents && w.HookEvents.PullRequest)
 | 
							(w.ChooseEvents && w.HookEvents.PullRequest)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// HasPullRequestAssignEvent returns true if hook enabled pull request assign event.
 | 
				
			||||||
 | 
					func (w *Webhook) HasPullRequestAssignEvent() bool {
 | 
				
			||||||
 | 
						return w.SendEverything ||
 | 
				
			||||||
 | 
							(w.ChooseEvents && w.HookEvents.PullRequestAssign)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// HasPullRequestLabelEvent returns true if hook enabled pull request label event.
 | 
				
			||||||
 | 
					func (w *Webhook) HasPullRequestLabelEvent() bool {
 | 
				
			||||||
 | 
						return w.SendEverything ||
 | 
				
			||||||
 | 
							(w.ChooseEvents && w.HookEvents.PullRequestLabel)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// HasPullRequestMilestoneEvent returns true if hook enabled pull request milestone event.
 | 
				
			||||||
 | 
					func (w *Webhook) HasPullRequestMilestoneEvent() bool {
 | 
				
			||||||
 | 
						return w.SendEverything ||
 | 
				
			||||||
 | 
							(w.ChooseEvents && w.HookEvents.PullRequestMilestone)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// HasPullRequestCommentEvent returns true if hook enabled pull_request_comment event.
 | 
				
			||||||
 | 
					func (w *Webhook) HasPullRequestCommentEvent() bool {
 | 
				
			||||||
 | 
						return w.SendEverything ||
 | 
				
			||||||
 | 
							(w.ChooseEvents && w.HookEvents.PullRequestComment)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// HasPullRequestApprovedEvent returns true if hook enabled pull request review event.
 | 
				
			||||||
 | 
					func (w *Webhook) HasPullRequestApprovedEvent() bool {
 | 
				
			||||||
 | 
						return w.SendEverything ||
 | 
				
			||||||
 | 
							(w.ChooseEvents && w.HookEvents.PullRequestReview)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// HasPullRequestRejectedEvent returns true if hook enabled pull request review event.
 | 
				
			||||||
 | 
					func (w *Webhook) HasPullRequestRejectedEvent() bool {
 | 
				
			||||||
 | 
						return w.SendEverything ||
 | 
				
			||||||
 | 
							(w.ChooseEvents && w.HookEvents.PullRequestReview)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// HasPullRequestReviewCommentEvent returns true if hook enabled pull request review event.
 | 
				
			||||||
 | 
					func (w *Webhook) HasPullRequestReviewCommentEvent() bool {
 | 
				
			||||||
 | 
						return w.SendEverything ||
 | 
				
			||||||
 | 
							(w.ChooseEvents && w.HookEvents.PullRequestReview)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// HasPullRequestSyncEvent returns true if hook enabled pull request sync event.
 | 
				
			||||||
 | 
					func (w *Webhook) HasPullRequestSyncEvent() bool {
 | 
				
			||||||
 | 
						return w.SendEverything ||
 | 
				
			||||||
 | 
							(w.ChooseEvents && w.HookEvents.PullRequestSync)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// HasReleaseEvent returns if hook enabled release event.
 | 
					// HasReleaseEvent returns if hook enabled release event.
 | 
				
			||||||
func (w *Webhook) HasReleaseEvent() bool {
 | 
					func (w *Webhook) HasReleaseEvent() bool {
 | 
				
			||||||
	return w.SendEverything ||
 | 
						return w.SendEverything ||
 | 
				
			||||||
@@ -198,8 +273,19 @@ func (w *Webhook) EventCheckers() []struct {
 | 
				
			|||||||
		{w.HasForkEvent, HookEventFork},
 | 
							{w.HasForkEvent, HookEventFork},
 | 
				
			||||||
		{w.HasPushEvent, HookEventPush},
 | 
							{w.HasPushEvent, HookEventPush},
 | 
				
			||||||
		{w.HasIssuesEvent, HookEventIssues},
 | 
							{w.HasIssuesEvent, HookEventIssues},
 | 
				
			||||||
 | 
							{w.HasIssuesAssignEvent, HookEventIssueAssign},
 | 
				
			||||||
 | 
							{w.HasIssuesLabelEvent, HookEventIssueLabel},
 | 
				
			||||||
 | 
							{w.HasIssuesMilestoneEvent, HookEventIssueMilestone},
 | 
				
			||||||
		{w.HasIssueCommentEvent, HookEventIssueComment},
 | 
							{w.HasIssueCommentEvent, HookEventIssueComment},
 | 
				
			||||||
		{w.HasPullRequestEvent, HookEventPullRequest},
 | 
							{w.HasPullRequestEvent, HookEventPullRequest},
 | 
				
			||||||
 | 
							{w.HasPullRequestAssignEvent, HookEventPullRequestAssign},
 | 
				
			||||||
 | 
							{w.HasPullRequestLabelEvent, HookEventPullRequestLabel},
 | 
				
			||||||
 | 
							{w.HasPullRequestMilestoneEvent, HookEventPullRequestMilestone},
 | 
				
			||||||
 | 
							{w.HasPullRequestCommentEvent, HookEventPullRequestComment},
 | 
				
			||||||
 | 
							{w.HasPullRequestApprovedEvent, HookEventPullRequestReviewApproved},
 | 
				
			||||||
 | 
							{w.HasPullRequestRejectedEvent, HookEventPullRequestReviewRejected},
 | 
				
			||||||
 | 
							{w.HasPullRequestCommentEvent, HookEventPullRequestReviewComment},
 | 
				
			||||||
 | 
							{w.HasPullRequestSyncEvent, HookEventPullRequestSync},
 | 
				
			||||||
		{w.HasRepositoryEvent, HookEventRepository},
 | 
							{w.HasRepositoryEvent, HookEventRepository},
 | 
				
			||||||
		{w.HasReleaseEvent, HookEventRelease},
 | 
							{w.HasReleaseEvent, HookEventRelease},
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -498,20 +584,60 @@ type HookEventType string
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// Types of hook events
 | 
					// Types of hook events
 | 
				
			||||||
const (
 | 
					const (
 | 
				
			||||||
	HookEventCreate              HookEventType = "create"
 | 
						HookEventCreate                    HookEventType = "create"
 | 
				
			||||||
	HookEventDelete              HookEventType = "delete"
 | 
						HookEventDelete                    HookEventType = "delete"
 | 
				
			||||||
	HookEventFork                HookEventType = "fork"
 | 
						HookEventFork                      HookEventType = "fork"
 | 
				
			||||||
	HookEventPush                HookEventType = "push"
 | 
						HookEventPush                      HookEventType = "push"
 | 
				
			||||||
	HookEventIssues              HookEventType = "issues"
 | 
						HookEventIssues                    HookEventType = "issues"
 | 
				
			||||||
	HookEventIssueComment        HookEventType = "issue_comment"
 | 
						HookEventIssueAssign               HookEventType = "issue_assign"
 | 
				
			||||||
	HookEventPullRequest         HookEventType = "pull_request"
 | 
						HookEventIssueLabel                HookEventType = "issue_label"
 | 
				
			||||||
	HookEventRepository          HookEventType = "repository"
 | 
						HookEventIssueMilestone            HookEventType = "issue_milestone"
 | 
				
			||||||
	HookEventRelease             HookEventType = "release"
 | 
						HookEventIssueComment              HookEventType = "issue_comment"
 | 
				
			||||||
	HookEventPullRequestApproved HookEventType = "pull_request_approved"
 | 
						HookEventPullRequest               HookEventType = "pull_request"
 | 
				
			||||||
	HookEventPullRequestRejected HookEventType = "pull_request_rejected"
 | 
						HookEventPullRequestAssign         HookEventType = "pull_request_assign"
 | 
				
			||||||
	HookEventPullRequestComment  HookEventType = "pull_request_comment"
 | 
						HookEventPullRequestLabel          HookEventType = "pull_request_label"
 | 
				
			||||||
 | 
						HookEventPullRequestMilestone      HookEventType = "pull_request_milestone"
 | 
				
			||||||
 | 
						HookEventPullRequestComment        HookEventType = "pull_request_comment"
 | 
				
			||||||
 | 
						HookEventPullRequestReviewApproved HookEventType = "pull_request_review_approved"
 | 
				
			||||||
 | 
						HookEventPullRequestReviewRejected HookEventType = "pull_request_review_rejected"
 | 
				
			||||||
 | 
						HookEventPullRequestReviewComment  HookEventType = "pull_request_review_comment"
 | 
				
			||||||
 | 
						HookEventPullRequestSync           HookEventType = "pull_request_sync"
 | 
				
			||||||
 | 
						HookEventRepository                HookEventType = "repository"
 | 
				
			||||||
 | 
						HookEventRelease                   HookEventType = "release"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Event returns the HookEventType as an event string
 | 
				
			||||||
 | 
					func (h HookEventType) Event() string {
 | 
				
			||||||
 | 
						switch h {
 | 
				
			||||||
 | 
						case HookEventCreate:
 | 
				
			||||||
 | 
							return "create"
 | 
				
			||||||
 | 
						case HookEventDelete:
 | 
				
			||||||
 | 
							return "delete"
 | 
				
			||||||
 | 
						case HookEventFork:
 | 
				
			||||||
 | 
							return "fork"
 | 
				
			||||||
 | 
						case HookEventPush:
 | 
				
			||||||
 | 
							return "push"
 | 
				
			||||||
 | 
						case HookEventIssues, HookEventIssueAssign, HookEventIssueLabel, HookEventIssueMilestone:
 | 
				
			||||||
 | 
							return "issues"
 | 
				
			||||||
 | 
						case HookEventPullRequest, HookEventPullRequestAssign, HookEventPullRequestLabel, HookEventPullRequestMilestone,
 | 
				
			||||||
 | 
							HookEventPullRequestSync:
 | 
				
			||||||
 | 
							return "pull_request"
 | 
				
			||||||
 | 
						case HookEventIssueComment, HookEventPullRequestComment:
 | 
				
			||||||
 | 
							return "issue_comment"
 | 
				
			||||||
 | 
						case HookEventPullRequestReviewApproved:
 | 
				
			||||||
 | 
							return "pull_request_approved"
 | 
				
			||||||
 | 
						case HookEventPullRequestReviewRejected:
 | 
				
			||||||
 | 
							return "pull_request_rejected"
 | 
				
			||||||
 | 
						case HookEventPullRequestReviewComment:
 | 
				
			||||||
 | 
							return "pull_request_comment"
 | 
				
			||||||
 | 
						case HookEventRepository:
 | 
				
			||||||
 | 
							return "repository"
 | 
				
			||||||
 | 
						case HookEventRelease:
 | 
				
			||||||
 | 
							return "release"
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return ""
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// HookRequest represents hook task request information.
 | 
					// HookRequest represents hook task request information.
 | 
				
			||||||
type HookRequest struct {
 | 
					type HookRequest struct {
 | 
				
			||||||
	Headers map[string]string `json:"headers"`
 | 
						Headers map[string]string `json:"headers"`
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -61,7 +61,11 @@ func TestWebhook_UpdateEvent(t *testing.T) {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func TestWebhook_EventsArray(t *testing.T) {
 | 
					func TestWebhook_EventsArray(t *testing.T) {
 | 
				
			||||||
	assert.Equal(t, []string{"create", "delete", "fork", "push", "issues", "issue_comment", "pull_request", "repository", "release"},
 | 
						assert.Equal(t, []string{"create", "delete", "fork", "push",
 | 
				
			||||||
 | 
							"issues", "issue_assign", "issue_label", "issue_milestone", "issue_comment",
 | 
				
			||||||
 | 
							"pull_request", "pull_request_assign", "pull_request_label", "pull_request_milestone",
 | 
				
			||||||
 | 
							"pull_request_comment", "pull_request_review_approved", "pull_request_review_rejected",
 | 
				
			||||||
 | 
							"pull_request_review_comment", "pull_request_sync", "repository", "release"},
 | 
				
			||||||
		(&Webhook{
 | 
							(&Webhook{
 | 
				
			||||||
			HookEvent: &HookEvent{SendEverything: true},
 | 
								HookEvent: &HookEvent{SendEverything: true},
 | 
				
			||||||
		}).EventsArray(),
 | 
							}).EventsArray(),
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -190,18 +190,27 @@ func (f *ProtectBranchForm) Validate(ctx *macaron.Context, errs binding.Errors)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// WebhookForm form for changing web hook
 | 
					// WebhookForm form for changing web hook
 | 
				
			||||||
type WebhookForm struct {
 | 
					type WebhookForm struct {
 | 
				
			||||||
	Events       string
 | 
						Events               string
 | 
				
			||||||
	Create       bool
 | 
						Create               bool
 | 
				
			||||||
	Delete       bool
 | 
						Delete               bool
 | 
				
			||||||
	Fork         bool
 | 
						Fork                 bool
 | 
				
			||||||
	Issues       bool
 | 
						Issues               bool
 | 
				
			||||||
	IssueComment bool
 | 
						IssueAssign          bool
 | 
				
			||||||
	Release      bool
 | 
						IssueLabel           bool
 | 
				
			||||||
	Push         bool
 | 
						IssueMilestone       bool
 | 
				
			||||||
	PullRequest  bool
 | 
						IssueComment         bool
 | 
				
			||||||
	Repository   bool
 | 
						Release              bool
 | 
				
			||||||
	Active       bool
 | 
						Push                 bool
 | 
				
			||||||
	BranchFilter string `binding:"GlobPattern"`
 | 
						PullRequest          bool
 | 
				
			||||||
 | 
						PullRequestAssign    bool
 | 
				
			||||||
 | 
						PullRequestLabel     bool
 | 
				
			||||||
 | 
						PullRequestMilestone bool
 | 
				
			||||||
 | 
						PullRequestComment   bool
 | 
				
			||||||
 | 
						PullRequestReview    bool
 | 
				
			||||||
 | 
						PullRequestSync      bool
 | 
				
			||||||
 | 
						Repository           bool
 | 
				
			||||||
 | 
						Active               bool
 | 
				
			||||||
 | 
						BranchFilter         string `binding:"GlobPattern"`
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// PushOnly if the hook will be triggered when push
 | 
					// PushOnly if the hook will be triggered when push
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -48,7 +48,7 @@ func (m *webhookNotifier) NotifyIssueClearLabels(doer *models.User, issue *model
 | 
				
			|||||||
			return
 | 
								return
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		err = webhook_module.PrepareWebhooks(issue.Repo, models.HookEventPullRequest, &api.PullRequestPayload{
 | 
							err = webhook_module.PrepareWebhooks(issue.Repo, models.HookEventPullRequestLabel, &api.PullRequestPayload{
 | 
				
			||||||
			Action:      api.HookIssueLabelCleared,
 | 
								Action:      api.HookIssueLabelCleared,
 | 
				
			||||||
			Index:       issue.Index,
 | 
								Index:       issue.Index,
 | 
				
			||||||
			PullRequest: convert.ToAPIPullRequest(issue.PullRequest),
 | 
								PullRequest: convert.ToAPIPullRequest(issue.PullRequest),
 | 
				
			||||||
@@ -56,7 +56,7 @@ func (m *webhookNotifier) NotifyIssueClearLabels(doer *models.User, issue *model
 | 
				
			|||||||
			Sender:      doer.APIFormat(),
 | 
								Sender:      doer.APIFormat(),
 | 
				
			||||||
		})
 | 
							})
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		err = webhook_module.PrepareWebhooks(issue.Repo, models.HookEventIssues, &api.IssuePayload{
 | 
							err = webhook_module.PrepareWebhooks(issue.Repo, models.HookEventIssueLabel, &api.IssuePayload{
 | 
				
			||||||
			Action:     api.HookIssueLabelCleared,
 | 
								Action:     api.HookIssueLabelCleared,
 | 
				
			||||||
			Index:      issue.Index,
 | 
								Index:      issue.Index,
 | 
				
			||||||
			Issue:      convert.ToAPIIssue(issue),
 | 
								Issue:      convert.ToAPIIssue(issue),
 | 
				
			||||||
@@ -147,7 +147,7 @@ func (m *webhookNotifier) NotifyIssueChangeAssignee(doer *models.User, issue *mo
 | 
				
			|||||||
			apiPullRequest.Action = api.HookIssueAssigned
 | 
								apiPullRequest.Action = api.HookIssueAssigned
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		// Assignee comment triggers a webhook
 | 
							// Assignee comment triggers a webhook
 | 
				
			||||||
		if err := webhook_module.PrepareWebhooks(issue.Repo, models.HookEventPullRequest, apiPullRequest); err != nil {
 | 
							if err := webhook_module.PrepareWebhooks(issue.Repo, models.HookEventPullRequestAssign, apiPullRequest); err != nil {
 | 
				
			||||||
			log.Error("PrepareWebhooks [is_pull: %v, remove_assignee: %v]: %v", issue.IsPull, removed, err)
 | 
								log.Error("PrepareWebhooks [is_pull: %v, remove_assignee: %v]: %v", issue.IsPull, removed, err)
 | 
				
			||||||
			return
 | 
								return
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
@@ -165,7 +165,7 @@ func (m *webhookNotifier) NotifyIssueChangeAssignee(doer *models.User, issue *mo
 | 
				
			|||||||
			apiIssue.Action = api.HookIssueAssigned
 | 
								apiIssue.Action = api.HookIssueAssigned
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		// Assignee comment triggers a webhook
 | 
							// Assignee comment triggers a webhook
 | 
				
			||||||
		if err := webhook_module.PrepareWebhooks(issue.Repo, models.HookEventIssues, apiIssue); err != nil {
 | 
							if err := webhook_module.PrepareWebhooks(issue.Repo, models.HookEventIssueAssign, apiIssue); err != nil {
 | 
				
			||||||
			log.Error("PrepareWebhooks [is_pull: %v, remove_assignee: %v]: %v", issue.IsPull, removed, err)
 | 
								log.Error("PrepareWebhooks [is_pull: %v, remove_assignee: %v]: %v", issue.IsPull, removed, err)
 | 
				
			||||||
			return
 | 
								return
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
@@ -338,34 +338,54 @@ func (m *webhookNotifier) NotifyIssueChangeContent(doer *models.User, issue *mod
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (m *webhookNotifier) NotifyUpdateComment(doer *models.User, c *models.Comment, oldContent string) {
 | 
					func (m *webhookNotifier) NotifyUpdateComment(doer *models.User, c *models.Comment, oldContent string) {
 | 
				
			||||||
	if err := c.LoadPoster(); err != nil {
 | 
						var err error
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if err = c.LoadPoster(); err != nil {
 | 
				
			||||||
		log.Error("LoadPoster: %v", err)
 | 
							log.Error("LoadPoster: %v", err)
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if err := c.LoadIssue(); err != nil {
 | 
						if err = c.LoadIssue(); err != nil {
 | 
				
			||||||
		log.Error("LoadIssue: %v", err)
 | 
							log.Error("LoadIssue: %v", err)
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if err := c.Issue.LoadAttributes(); err != nil {
 | 
						if err = c.Issue.LoadAttributes(); err != nil {
 | 
				
			||||||
		log.Error("LoadAttributes: %v", err)
 | 
							log.Error("LoadAttributes: %v", err)
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	mode, _ := models.AccessLevel(doer, c.Issue.Repo)
 | 
						mode, _ := models.AccessLevel(doer, c.Issue.Repo)
 | 
				
			||||||
	if err := webhook_module.PrepareWebhooks(c.Issue.Repo, models.HookEventIssueComment, &api.IssueCommentPayload{
 | 
						if c.Issue.IsPull {
 | 
				
			||||||
		Action:  api.HookIssueCommentEdited,
 | 
							err = webhook_module.PrepareWebhooks(c.Issue.Repo, models.HookEventPullRequestComment, &api.IssueCommentPayload{
 | 
				
			||||||
		Issue:   convert.ToAPIIssue(c.Issue),
 | 
								Action:  api.HookIssueCommentEdited,
 | 
				
			||||||
		Comment: c.APIFormat(),
 | 
								Issue:   convert.ToAPIIssue(c.Issue),
 | 
				
			||||||
		Changes: &api.ChangesPayload{
 | 
								Comment: c.APIFormat(),
 | 
				
			||||||
			Body: &api.ChangesFromPayload{
 | 
								Changes: &api.ChangesPayload{
 | 
				
			||||||
				From: oldContent,
 | 
									Body: &api.ChangesFromPayload{
 | 
				
			||||||
 | 
										From: oldContent,
 | 
				
			||||||
 | 
									},
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
		},
 | 
								Repository: c.Issue.Repo.APIFormat(mode),
 | 
				
			||||||
		Repository: c.Issue.Repo.APIFormat(mode),
 | 
								Sender:     doer.APIFormat(),
 | 
				
			||||||
		Sender:     doer.APIFormat(),
 | 
								IsPull:     true,
 | 
				
			||||||
		IsPull:     c.Issue.IsPull,
 | 
							})
 | 
				
			||||||
	}); err != nil {
 | 
						} else {
 | 
				
			||||||
 | 
							err = webhook_module.PrepareWebhooks(c.Issue.Repo, models.HookEventIssueComment, &api.IssueCommentPayload{
 | 
				
			||||||
 | 
								Action:  api.HookIssueCommentEdited,
 | 
				
			||||||
 | 
								Issue:   convert.ToAPIIssue(c.Issue),
 | 
				
			||||||
 | 
								Comment: c.APIFormat(),
 | 
				
			||||||
 | 
								Changes: &api.ChangesPayload{
 | 
				
			||||||
 | 
									Body: &api.ChangesFromPayload{
 | 
				
			||||||
 | 
										From: oldContent,
 | 
				
			||||||
 | 
									},
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
								Repository: c.Issue.Repo.APIFormat(mode),
 | 
				
			||||||
 | 
								Sender:     doer.APIFormat(),
 | 
				
			||||||
 | 
								IsPull:     false,
 | 
				
			||||||
 | 
							})
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
		log.Error("PrepareWebhooks [comment_id: %d]: %v", c.ID, err)
 | 
							log.Error("PrepareWebhooks [comment_id: %d]: %v", c.ID, err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -373,45 +393,76 @@ func (m *webhookNotifier) NotifyUpdateComment(doer *models.User, c *models.Comme
 | 
				
			|||||||
func (m *webhookNotifier) NotifyCreateIssueComment(doer *models.User, repo *models.Repository,
 | 
					func (m *webhookNotifier) NotifyCreateIssueComment(doer *models.User, repo *models.Repository,
 | 
				
			||||||
	issue *models.Issue, comment *models.Comment) {
 | 
						issue *models.Issue, comment *models.Comment) {
 | 
				
			||||||
	mode, _ := models.AccessLevel(doer, repo)
 | 
						mode, _ := models.AccessLevel(doer, repo)
 | 
				
			||||||
	if err := webhook_module.PrepareWebhooks(repo, models.HookEventIssueComment, &api.IssueCommentPayload{
 | 
					
 | 
				
			||||||
		Action:     api.HookIssueCommentCreated,
 | 
						var err error
 | 
				
			||||||
		Issue:      convert.ToAPIIssue(issue),
 | 
						if issue.IsPull {
 | 
				
			||||||
		Comment:    comment.APIFormat(),
 | 
							err = webhook_module.PrepareWebhooks(issue.Repo, models.HookEventPullRequestComment, &api.IssueCommentPayload{
 | 
				
			||||||
		Repository: repo.APIFormat(mode),
 | 
								Action:     api.HookIssueCommentCreated,
 | 
				
			||||||
		Sender:     doer.APIFormat(),
 | 
								Issue:      convert.ToAPIIssue(issue),
 | 
				
			||||||
		IsPull:     issue.IsPull,
 | 
								Comment:    comment.APIFormat(),
 | 
				
			||||||
	}); err != nil {
 | 
								Repository: repo.APIFormat(mode),
 | 
				
			||||||
 | 
								Sender:     doer.APIFormat(),
 | 
				
			||||||
 | 
								IsPull:     true,
 | 
				
			||||||
 | 
							})
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							err = webhook_module.PrepareWebhooks(issue.Repo, models.HookEventIssueComment, &api.IssueCommentPayload{
 | 
				
			||||||
 | 
								Action:     api.HookIssueCommentCreated,
 | 
				
			||||||
 | 
								Issue:      convert.ToAPIIssue(issue),
 | 
				
			||||||
 | 
								Comment:    comment.APIFormat(),
 | 
				
			||||||
 | 
								Repository: repo.APIFormat(mode),
 | 
				
			||||||
 | 
								Sender:     doer.APIFormat(),
 | 
				
			||||||
 | 
								IsPull:     false,
 | 
				
			||||||
 | 
							})
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
		log.Error("PrepareWebhooks [comment_id: %d]: %v", comment.ID, err)
 | 
							log.Error("PrepareWebhooks [comment_id: %d]: %v", comment.ID, err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (m *webhookNotifier) NotifyDeleteComment(doer *models.User, comment *models.Comment) {
 | 
					func (m *webhookNotifier) NotifyDeleteComment(doer *models.User, comment *models.Comment) {
 | 
				
			||||||
	if err := comment.LoadPoster(); err != nil {
 | 
						var err error
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if err = comment.LoadPoster(); err != nil {
 | 
				
			||||||
		log.Error("LoadPoster: %v", err)
 | 
							log.Error("LoadPoster: %v", err)
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if err := comment.LoadIssue(); err != nil {
 | 
						if err = comment.LoadIssue(); err != nil {
 | 
				
			||||||
		log.Error("LoadIssue: %v", err)
 | 
							log.Error("LoadIssue: %v", err)
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if err := comment.Issue.LoadAttributes(); err != nil {
 | 
						if err = comment.Issue.LoadAttributes(); err != nil {
 | 
				
			||||||
		log.Error("LoadAttributes: %v", err)
 | 
							log.Error("LoadAttributes: %v", err)
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	mode, _ := models.AccessLevel(doer, comment.Issue.Repo)
 | 
						mode, _ := models.AccessLevel(doer, comment.Issue.Repo)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if err := webhook_module.PrepareWebhooks(comment.Issue.Repo, models.HookEventIssueComment, &api.IssueCommentPayload{
 | 
						if comment.Issue.IsPull {
 | 
				
			||||||
		Action:     api.HookIssueCommentDeleted,
 | 
							err = webhook_module.PrepareWebhooks(comment.Issue.Repo, models.HookEventPullRequestComment, &api.IssueCommentPayload{
 | 
				
			||||||
		Issue:      convert.ToAPIIssue(comment.Issue),
 | 
								Action:     api.HookIssueCommentDeleted,
 | 
				
			||||||
		Comment:    comment.APIFormat(),
 | 
								Issue:      convert.ToAPIIssue(comment.Issue),
 | 
				
			||||||
		Repository: comment.Issue.Repo.APIFormat(mode),
 | 
								Comment:    comment.APIFormat(),
 | 
				
			||||||
		Sender:     doer.APIFormat(),
 | 
								Repository: comment.Issue.Repo.APIFormat(mode),
 | 
				
			||||||
		IsPull:     comment.Issue.IsPull,
 | 
								Sender:     doer.APIFormat(),
 | 
				
			||||||
	}); err != nil {
 | 
								IsPull:     true,
 | 
				
			||||||
 | 
							})
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							err = webhook_module.PrepareWebhooks(comment.Issue.Repo, models.HookEventIssueComment, &api.IssueCommentPayload{
 | 
				
			||||||
 | 
								Action:     api.HookIssueCommentDeleted,
 | 
				
			||||||
 | 
								Issue:      convert.ToAPIIssue(comment.Issue),
 | 
				
			||||||
 | 
								Comment:    comment.APIFormat(),
 | 
				
			||||||
 | 
								Repository: comment.Issue.Repo.APIFormat(mode),
 | 
				
			||||||
 | 
								Sender:     doer.APIFormat(),
 | 
				
			||||||
 | 
								IsPull:     false,
 | 
				
			||||||
 | 
							})
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
		log.Error("PrepareWebhooks [comment_id: %d]: %v", comment.ID, err)
 | 
							log.Error("PrepareWebhooks [comment_id: %d]: %v", comment.ID, err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (m *webhookNotifier) NotifyIssueChangeLabels(doer *models.User, issue *models.Issue,
 | 
					func (m *webhookNotifier) NotifyIssueChangeLabels(doer *models.User, issue *models.Issue,
 | 
				
			||||||
@@ -438,7 +489,7 @@ func (m *webhookNotifier) NotifyIssueChangeLabels(doer *models.User, issue *mode
 | 
				
			|||||||
			log.Error("LoadIssue: %v", err)
 | 
								log.Error("LoadIssue: %v", err)
 | 
				
			||||||
			return
 | 
								return
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		err = webhook_module.PrepareWebhooks(issue.Repo, models.HookEventPullRequest, &api.PullRequestPayload{
 | 
							err = webhook_module.PrepareWebhooks(issue.Repo, models.HookEventPullRequestLabel, &api.PullRequestPayload{
 | 
				
			||||||
			Action:      api.HookIssueLabelUpdated,
 | 
								Action:      api.HookIssueLabelUpdated,
 | 
				
			||||||
			Index:       issue.Index,
 | 
								Index:       issue.Index,
 | 
				
			||||||
			PullRequest: convert.ToAPIPullRequest(issue.PullRequest),
 | 
								PullRequest: convert.ToAPIPullRequest(issue.PullRequest),
 | 
				
			||||||
@@ -446,7 +497,7 @@ func (m *webhookNotifier) NotifyIssueChangeLabels(doer *models.User, issue *mode
 | 
				
			|||||||
			Sender:      doer.APIFormat(),
 | 
								Sender:      doer.APIFormat(),
 | 
				
			||||||
		})
 | 
							})
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		err = webhook_module.PrepareWebhooks(issue.Repo, models.HookEventIssues, &api.IssuePayload{
 | 
							err = webhook_module.PrepareWebhooks(issue.Repo, models.HookEventIssueLabel, &api.IssuePayload{
 | 
				
			||||||
			Action:     api.HookIssueLabelUpdated,
 | 
								Action:     api.HookIssueLabelUpdated,
 | 
				
			||||||
			Index:      issue.Index,
 | 
								Index:      issue.Index,
 | 
				
			||||||
			Issue:      convert.ToAPIIssue(issue),
 | 
								Issue:      convert.ToAPIIssue(issue),
 | 
				
			||||||
@@ -480,7 +531,7 @@ func (m *webhookNotifier) NotifyIssueChangeMilestone(doer *models.User, issue *m
 | 
				
			|||||||
			log.Error("LoadIssue: %v", err)
 | 
								log.Error("LoadIssue: %v", err)
 | 
				
			||||||
			return
 | 
								return
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		err = webhook_module.PrepareWebhooks(issue.Repo, models.HookEventPullRequest, &api.PullRequestPayload{
 | 
							err = webhook_module.PrepareWebhooks(issue.Repo, models.HookEventPullRequestMilestone, &api.PullRequestPayload{
 | 
				
			||||||
			Action:      hookAction,
 | 
								Action:      hookAction,
 | 
				
			||||||
			Index:       issue.Index,
 | 
								Index:       issue.Index,
 | 
				
			||||||
			PullRequest: convert.ToAPIPullRequest(issue.PullRequest),
 | 
								PullRequest: convert.ToAPIPullRequest(issue.PullRequest),
 | 
				
			||||||
@@ -488,7 +539,7 @@ func (m *webhookNotifier) NotifyIssueChangeMilestone(doer *models.User, issue *m
 | 
				
			|||||||
			Sender:      doer.APIFormat(),
 | 
								Sender:      doer.APIFormat(),
 | 
				
			||||||
		})
 | 
							})
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		err = webhook_module.PrepareWebhooks(issue.Repo, models.HookEventIssues, &api.IssuePayload{
 | 
							err = webhook_module.PrepareWebhooks(issue.Repo, models.HookEventIssueMilestone, &api.IssuePayload{
 | 
				
			||||||
			Action:     hookAction,
 | 
								Action:     hookAction,
 | 
				
			||||||
			Index:      issue.Index,
 | 
								Index:      issue.Index,
 | 
				
			||||||
			Issue:      convert.ToAPIIssue(issue),
 | 
								Issue:      convert.ToAPIIssue(issue),
 | 
				
			||||||
@@ -597,11 +648,11 @@ func (m *webhookNotifier) NotifyPullRequestReview(pr *models.PullRequest, review
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	switch review.Type {
 | 
						switch review.Type {
 | 
				
			||||||
	case models.ReviewTypeApprove:
 | 
						case models.ReviewTypeApprove:
 | 
				
			||||||
		reviewHookType = models.HookEventPullRequestApproved
 | 
							reviewHookType = models.HookEventPullRequestReviewApproved
 | 
				
			||||||
	case models.ReviewTypeComment:
 | 
						case models.ReviewTypeComment:
 | 
				
			||||||
		reviewHookType = models.HookEventPullRequestComment
 | 
							reviewHookType = models.HookEventPullRequestComment
 | 
				
			||||||
	case models.ReviewTypeReject:
 | 
						case models.ReviewTypeReject:
 | 
				
			||||||
		reviewHookType = models.HookEventPullRequestRejected
 | 
							reviewHookType = models.HookEventPullRequestReviewRejected
 | 
				
			||||||
	default:
 | 
						default:
 | 
				
			||||||
		// unsupported review webhook type here
 | 
							// unsupported review webhook type here
 | 
				
			||||||
		log.Error("Unsupported review webhook type")
 | 
							log.Error("Unsupported review webhook type")
 | 
				
			||||||
@@ -619,7 +670,7 @@ func (m *webhookNotifier) NotifyPullRequestReview(pr *models.PullRequest, review
 | 
				
			|||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if err := webhook_module.PrepareWebhooks(review.Issue.Repo, reviewHookType, &api.PullRequestPayload{
 | 
						if err := webhook_module.PrepareWebhooks(review.Issue.Repo, reviewHookType, &api.PullRequestPayload{
 | 
				
			||||||
		Action:      api.HookIssueSynchronized,
 | 
							Action:      api.HookIssueReviewed,
 | 
				
			||||||
		Index:       review.Issue.Index,
 | 
							Index:       review.Issue.Index,
 | 
				
			||||||
		PullRequest: convert.ToAPIPullRequest(pr),
 | 
							PullRequest: convert.ToAPIPullRequest(pr),
 | 
				
			||||||
		Repository:  review.Issue.Repo.APIFormat(mode),
 | 
							Repository:  review.Issue.Repo.APIFormat(mode),
 | 
				
			||||||
@@ -673,7 +724,7 @@ func (m *webhookNotifier) NotifyPullRequestSynchronized(doer *models.User, pr *m
 | 
				
			|||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if err := webhook_module.PrepareWebhooks(pr.Issue.Repo, models.HookEventPullRequest, &api.PullRequestPayload{
 | 
						if err := webhook_module.PrepareWebhooks(pr.Issue.Repo, models.HookEventPullRequestSync, &api.PullRequestPayload{
 | 
				
			||||||
		Action:      api.HookIssueSynchronized,
 | 
							Action:      api.HookIssueSynchronized,
 | 
				
			||||||
		Index:       pr.Issue.Index,
 | 
							Index:       pr.Issue.Index,
 | 
				
			||||||
		PullRequest: convert.ToAPIPullRequest(pr),
 | 
							PullRequest: convert.ToAPIPullRequest(pr),
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -374,6 +374,8 @@ const (
 | 
				
			|||||||
	HookIssueMilestoned HookIssueAction = "milestoned"
 | 
						HookIssueMilestoned HookIssueAction = "milestoned"
 | 
				
			||||||
	// HookIssueDemilestoned is an issue action for when a milestone is cleared on an issue.
 | 
						// HookIssueDemilestoned is an issue action for when a milestone is cleared on an issue.
 | 
				
			||||||
	HookIssueDemilestoned HookIssueAction = "demilestoned"
 | 
						HookIssueDemilestoned HookIssueAction = "demilestoned"
 | 
				
			||||||
 | 
						// HookIssueReviewed is an issue action for when a pull request is reviewed
 | 
				
			||||||
 | 
						HookIssueReviewed HookIssueAction = "reviewed"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// IssuePayload represents the payload information that is sent along with an issue event.
 | 
					// IssuePayload represents the payload information that is sent along with an issue event.
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -74,13 +74,13 @@ func Deliver(t *models.HookTask) error {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	req.Header.Add("X-Gitea-Delivery", t.UUID)
 | 
						req.Header.Add("X-Gitea-Delivery", t.UUID)
 | 
				
			||||||
	req.Header.Add("X-Gitea-Event", string(t.EventType))
 | 
						req.Header.Add("X-Gitea-Event", t.EventType.Event())
 | 
				
			||||||
	req.Header.Add("X-Gitea-Signature", t.Signature)
 | 
						req.Header.Add("X-Gitea-Signature", t.Signature)
 | 
				
			||||||
	req.Header.Add("X-Gogs-Delivery", t.UUID)
 | 
						req.Header.Add("X-Gogs-Delivery", t.UUID)
 | 
				
			||||||
	req.Header.Add("X-Gogs-Event", string(t.EventType))
 | 
						req.Header.Add("X-Gogs-Event", t.EventType.Event())
 | 
				
			||||||
	req.Header.Add("X-Gogs-Signature", t.Signature)
 | 
						req.Header.Add("X-Gogs-Signature", t.Signature)
 | 
				
			||||||
	req.Header["X-GitHub-Delivery"] = []string{t.UUID}
 | 
						req.Header["X-GitHub-Delivery"] = []string{t.UUID}
 | 
				
			||||||
	req.Header["X-GitHub-Event"] = []string{string(t.EventType)}
 | 
						req.Header["X-GitHub-Event"] = []string{t.EventType.Event()}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Record delivery information.
 | 
						// Record delivery information.
 | 
				
			||||||
	t.RequestInfo = &models.HookRequest{
 | 
						t.RequestInfo = &models.HookRequest{
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -181,7 +181,7 @@ func getDingtalkPullRequestPayload(p *api.PullRequestPayload) (*DingtalkPayload,
 | 
				
			|||||||
func getDingtalkPullRequestApprovalPayload(p *api.PullRequestPayload, event models.HookEventType) (*DingtalkPayload, error) {
 | 
					func getDingtalkPullRequestApprovalPayload(p *api.PullRequestPayload, event models.HookEventType) (*DingtalkPayload, error) {
 | 
				
			||||||
	var text, title string
 | 
						var text, title string
 | 
				
			||||||
	switch p.Action {
 | 
						switch p.Action {
 | 
				
			||||||
	case api.HookIssueSynchronized:
 | 
						case api.HookIssueReviewed:
 | 
				
			||||||
		action, err := parseHookPullRequestEventType(event)
 | 
							action, err := parseHookPullRequestEventType(event)
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			return nil, err
 | 
								return nil, err
 | 
				
			||||||
@@ -261,15 +261,16 @@ func GetDingtalkPayload(p api.Payloader, event models.HookEventType, meta string
 | 
				
			|||||||
		return getDingtalkDeletePayload(p.(*api.DeletePayload))
 | 
							return getDingtalkDeletePayload(p.(*api.DeletePayload))
 | 
				
			||||||
	case models.HookEventFork:
 | 
						case models.HookEventFork:
 | 
				
			||||||
		return getDingtalkForkPayload(p.(*api.ForkPayload))
 | 
							return getDingtalkForkPayload(p.(*api.ForkPayload))
 | 
				
			||||||
	case models.HookEventIssues:
 | 
						case models.HookEventIssues, models.HookEventIssueAssign, models.HookEventIssueLabel, models.HookEventIssueMilestone:
 | 
				
			||||||
		return getDingtalkIssuesPayload(p.(*api.IssuePayload))
 | 
							return getDingtalkIssuesPayload(p.(*api.IssuePayload))
 | 
				
			||||||
	case models.HookEventIssueComment:
 | 
						case models.HookEventIssueComment, models.HookEventPullRequestComment:
 | 
				
			||||||
		return getDingtalkIssueCommentPayload(p.(*api.IssueCommentPayload))
 | 
							return getDingtalkIssueCommentPayload(p.(*api.IssueCommentPayload))
 | 
				
			||||||
	case models.HookEventPush:
 | 
						case models.HookEventPush:
 | 
				
			||||||
		return getDingtalkPushPayload(p.(*api.PushPayload))
 | 
							return getDingtalkPushPayload(p.(*api.PushPayload))
 | 
				
			||||||
	case models.HookEventPullRequest:
 | 
						case models.HookEventPullRequest, models.HookEventPullRequestAssign, models.HookEventPullRequestLabel,
 | 
				
			||||||
 | 
							models.HookEventPullRequestMilestone, models.HookEventPullRequestSync:
 | 
				
			||||||
		return getDingtalkPullRequestPayload(p.(*api.PullRequestPayload))
 | 
							return getDingtalkPullRequestPayload(p.(*api.PullRequestPayload))
 | 
				
			||||||
	case models.HookEventPullRequestApproved, models.HookEventPullRequestRejected, models.HookEventPullRequestComment:
 | 
						case models.HookEventPullRequestReviewApproved, models.HookEventPullRequestReviewRejected, models.HookEventPullRequestReviewComment:
 | 
				
			||||||
		return getDingtalkPullRequestApprovalPayload(p.(*api.PullRequestPayload), event)
 | 
							return getDingtalkPullRequestApprovalPayload(p.(*api.PullRequestPayload), event)
 | 
				
			||||||
	case models.HookEventRepository:
 | 
						case models.HookEventRepository:
 | 
				
			||||||
		return getDingtalkRepositoryPayload(p.(*api.RepositoryPayload))
 | 
							return getDingtalkRepositoryPayload(p.(*api.RepositoryPayload))
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -296,7 +296,7 @@ func getDiscordPullRequestApprovalPayload(p *api.PullRequestPayload, meta *Disco
 | 
				
			|||||||
	var text, title string
 | 
						var text, title string
 | 
				
			||||||
	var color int
 | 
						var color int
 | 
				
			||||||
	switch p.Action {
 | 
						switch p.Action {
 | 
				
			||||||
	case api.HookIssueSynchronized:
 | 
						case api.HookIssueReviewed:
 | 
				
			||||||
		action, err := parseHookPullRequestEventType(event)
 | 
							action, err := parseHookPullRequestEventType(event)
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			return nil, err
 | 
								return nil, err
 | 
				
			||||||
@@ -306,9 +306,9 @@ func getDiscordPullRequestApprovalPayload(p *api.PullRequestPayload, meta *Disco
 | 
				
			|||||||
		text = p.Review.Content
 | 
							text = p.Review.Content
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		switch event {
 | 
							switch event {
 | 
				
			||||||
		case models.HookEventPullRequestApproved:
 | 
							case models.HookEventPullRequestReviewApproved:
 | 
				
			||||||
			color = greenColor
 | 
								color = greenColor
 | 
				
			||||||
		case models.HookEventPullRequestRejected:
 | 
							case models.HookEventPullRequestReviewRejected:
 | 
				
			||||||
			color = redColor
 | 
								color = redColor
 | 
				
			||||||
		case models.HookEventPullRequestComment:
 | 
							case models.HookEventPullRequestComment:
 | 
				
			||||||
			color = greyColor
 | 
								color = greyColor
 | 
				
			||||||
@@ -405,15 +405,16 @@ func GetDiscordPayload(p api.Payloader, event models.HookEventType, meta string)
 | 
				
			|||||||
		return getDiscordDeletePayload(p.(*api.DeletePayload), discord)
 | 
							return getDiscordDeletePayload(p.(*api.DeletePayload), discord)
 | 
				
			||||||
	case models.HookEventFork:
 | 
						case models.HookEventFork:
 | 
				
			||||||
		return getDiscordForkPayload(p.(*api.ForkPayload), discord)
 | 
							return getDiscordForkPayload(p.(*api.ForkPayload), discord)
 | 
				
			||||||
	case models.HookEventIssues:
 | 
						case models.HookEventIssues, models.HookEventIssueAssign, models.HookEventIssueLabel, models.HookEventIssueMilestone:
 | 
				
			||||||
		return getDiscordIssuesPayload(p.(*api.IssuePayload), discord)
 | 
							return getDiscordIssuesPayload(p.(*api.IssuePayload), discord)
 | 
				
			||||||
	case models.HookEventIssueComment:
 | 
						case models.HookEventIssueComment, models.HookEventPullRequestComment:
 | 
				
			||||||
		return getDiscordIssueCommentPayload(p.(*api.IssueCommentPayload), discord)
 | 
							return getDiscordIssueCommentPayload(p.(*api.IssueCommentPayload), discord)
 | 
				
			||||||
	case models.HookEventPush:
 | 
						case models.HookEventPush:
 | 
				
			||||||
		return getDiscordPushPayload(p.(*api.PushPayload), discord)
 | 
							return getDiscordPushPayload(p.(*api.PushPayload), discord)
 | 
				
			||||||
	case models.HookEventPullRequest:
 | 
						case models.HookEventPullRequest, models.HookEventPullRequestAssign, models.HookEventPullRequestLabel,
 | 
				
			||||||
 | 
							models.HookEventPullRequestMilestone, models.HookEventPullRequestSync:
 | 
				
			||||||
		return getDiscordPullRequestPayload(p.(*api.PullRequestPayload), discord)
 | 
							return getDiscordPullRequestPayload(p.(*api.PullRequestPayload), discord)
 | 
				
			||||||
	case models.HookEventPullRequestRejected, models.HookEventPullRequestApproved, models.HookEventPullRequestComment:
 | 
						case models.HookEventPullRequestReviewRejected, models.HookEventPullRequestReviewApproved, models.HookEventPullRequestReviewComment:
 | 
				
			||||||
		return getDiscordPullRequestApprovalPayload(p.(*api.PullRequestPayload), discord, event)
 | 
							return getDiscordPullRequestApprovalPayload(p.(*api.PullRequestPayload), discord, event)
 | 
				
			||||||
	case models.HookEventRepository:
 | 
						case models.HookEventRepository:
 | 
				
			||||||
		return getDiscordRepositoryPayload(p.(*api.RepositoryPayload), discord)
 | 
							return getDiscordRepositoryPayload(p.(*api.RepositoryPayload), discord)
 | 
				
			||||||
@@ -428,9 +429,9 @@ func parseHookPullRequestEventType(event models.HookEventType) (string, error) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	switch event {
 | 
						switch event {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	case models.HookEventPullRequestApproved:
 | 
						case models.HookEventPullRequestReviewApproved:
 | 
				
			||||||
		return "approved", nil
 | 
							return "approved", nil
 | 
				
			||||||
	case models.HookEventPullRequestRejected:
 | 
						case models.HookEventPullRequestReviewRejected:
 | 
				
			||||||
		return "rejected", nil
 | 
							return "rejected", nil
 | 
				
			||||||
	case models.HookEventPullRequestComment:
 | 
						case models.HookEventPullRequestComment:
 | 
				
			||||||
		return "comment", nil
 | 
							return "comment", nil
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -189,7 +189,7 @@ func GetFeishuPayload(p api.Payloader, event models.HookEventType, meta string)
 | 
				
			|||||||
		return getFeishuPushPayload(p.(*api.PushPayload))
 | 
							return getFeishuPushPayload(p.(*api.PushPayload))
 | 
				
			||||||
	case models.HookEventPullRequest:
 | 
						case models.HookEventPullRequest:
 | 
				
			||||||
		return getFeishuPullRequestPayload(p.(*api.PullRequestPayload))
 | 
							return getFeishuPullRequestPayload(p.(*api.PullRequestPayload))
 | 
				
			||||||
	case models.HookEventPullRequestApproved, models.HookEventPullRequestRejected, models.HookEventPullRequestComment:
 | 
						case models.HookEventPullRequestReviewApproved, models.HookEventPullRequestReviewRejected, models.HookEventPullRequestComment:
 | 
				
			||||||
		return getFeishuPullRequestApprovalPayload(p.(*api.PullRequestPayload), event)
 | 
							return getFeishuPullRequestApprovalPayload(p.(*api.PullRequestPayload), event)
 | 
				
			||||||
	case models.HookEventRepository:
 | 
						case models.HookEventRepository:
 | 
				
			||||||
		return getFeishuRepositoryPayload(p.(*api.RepositoryPayload))
 | 
							return getFeishuRepositoryPayload(p.(*api.RepositoryPayload))
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -395,7 +395,7 @@ func getMSTeamsPullRequestApprovalPayload(p *api.PullRequestPayload, event model
 | 
				
			|||||||
	var text, title string
 | 
						var text, title string
 | 
				
			||||||
	var color int
 | 
						var color int
 | 
				
			||||||
	switch p.Action {
 | 
						switch p.Action {
 | 
				
			||||||
	case api.HookIssueSynchronized:
 | 
						case api.HookIssueReviewed:
 | 
				
			||||||
		action, err := parseHookPullRequestEventType(event)
 | 
							action, err := parseHookPullRequestEventType(event)
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			return nil, err
 | 
								return nil, err
 | 
				
			||||||
@@ -405,9 +405,9 @@ func getMSTeamsPullRequestApprovalPayload(p *api.PullRequestPayload, event model
 | 
				
			|||||||
		text = p.Review.Content
 | 
							text = p.Review.Content
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		switch event {
 | 
							switch event {
 | 
				
			||||||
		case models.HookEventPullRequestApproved:
 | 
							case models.HookEventPullRequestReviewApproved:
 | 
				
			||||||
			color = greenColor
 | 
								color = greenColor
 | 
				
			||||||
		case models.HookEventPullRequestRejected:
 | 
							case models.HookEventPullRequestReviewRejected:
 | 
				
			||||||
			color = redColor
 | 
								color = redColor
 | 
				
			||||||
		case models.HookEventPullRequestComment:
 | 
							case models.HookEventPullRequestComment:
 | 
				
			||||||
			color = greyColor
 | 
								color = greyColor
 | 
				
			||||||
@@ -555,15 +555,16 @@ func GetMSTeamsPayload(p api.Payloader, event models.HookEventType, meta string)
 | 
				
			|||||||
		return getMSTeamsDeletePayload(p.(*api.DeletePayload))
 | 
							return getMSTeamsDeletePayload(p.(*api.DeletePayload))
 | 
				
			||||||
	case models.HookEventFork:
 | 
						case models.HookEventFork:
 | 
				
			||||||
		return getMSTeamsForkPayload(p.(*api.ForkPayload))
 | 
							return getMSTeamsForkPayload(p.(*api.ForkPayload))
 | 
				
			||||||
	case models.HookEventIssues:
 | 
						case models.HookEventIssues, models.HookEventIssueAssign, models.HookEventIssueLabel, models.HookEventIssueMilestone:
 | 
				
			||||||
		return getMSTeamsIssuesPayload(p.(*api.IssuePayload))
 | 
							return getMSTeamsIssuesPayload(p.(*api.IssuePayload))
 | 
				
			||||||
	case models.HookEventIssueComment:
 | 
						case models.HookEventIssueComment, models.HookEventPullRequestComment:
 | 
				
			||||||
		return getMSTeamsIssueCommentPayload(p.(*api.IssueCommentPayload))
 | 
							return getMSTeamsIssueCommentPayload(p.(*api.IssueCommentPayload))
 | 
				
			||||||
	case models.HookEventPush:
 | 
						case models.HookEventPush:
 | 
				
			||||||
		return getMSTeamsPushPayload(p.(*api.PushPayload))
 | 
							return getMSTeamsPushPayload(p.(*api.PushPayload))
 | 
				
			||||||
	case models.HookEventPullRequest:
 | 
						case models.HookEventPullRequest, models.HookEventPullRequestAssign, models.HookEventPullRequestLabel,
 | 
				
			||||||
 | 
							models.HookEventPullRequestMilestone, models.HookEventPullRequestSync:
 | 
				
			||||||
		return getMSTeamsPullRequestPayload(p.(*api.PullRequestPayload))
 | 
							return getMSTeamsPullRequestPayload(p.(*api.PullRequestPayload))
 | 
				
			||||||
	case models.HookEventPullRequestRejected, models.HookEventPullRequestApproved, models.HookEventPullRequestComment:
 | 
						case models.HookEventPullRequestReviewRejected, models.HookEventPullRequestReviewApproved, models.HookEventPullRequestReviewComment:
 | 
				
			||||||
		return getMSTeamsPullRequestApprovalPayload(p.(*api.PullRequestPayload), event)
 | 
							return getMSTeamsPullRequestApprovalPayload(p.(*api.PullRequestPayload), event)
 | 
				
			||||||
	case models.HookEventRepository:
 | 
						case models.HookEventRepository:
 | 
				
			||||||
		return getMSTeamsRepositoryPayload(p.(*api.RepositoryPayload))
 | 
							return getMSTeamsRepositoryPayload(p.(*api.RepositoryPayload))
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -271,7 +271,7 @@ func getSlackPullRequestApprovalPayload(p *api.PullRequestPayload, slack *SlackM
 | 
				
			|||||||
	var text string
 | 
						var text string
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	switch p.Action {
 | 
						switch p.Action {
 | 
				
			||||||
	case api.HookIssueSynchronized:
 | 
						case api.HookIssueReviewed:
 | 
				
			||||||
		action, err := parseHookPullRequestEventType(event)
 | 
							action, err := parseHookPullRequestEventType(event)
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			return nil, err
 | 
								return nil, err
 | 
				
			||||||
@@ -324,15 +324,16 @@ func GetSlackPayload(p api.Payloader, event models.HookEventType, meta string) (
 | 
				
			|||||||
		return getSlackDeletePayload(p.(*api.DeletePayload), slack)
 | 
							return getSlackDeletePayload(p.(*api.DeletePayload), slack)
 | 
				
			||||||
	case models.HookEventFork:
 | 
						case models.HookEventFork:
 | 
				
			||||||
		return getSlackForkPayload(p.(*api.ForkPayload), slack)
 | 
							return getSlackForkPayload(p.(*api.ForkPayload), slack)
 | 
				
			||||||
	case models.HookEventIssues:
 | 
						case models.HookEventIssues, models.HookEventIssueAssign, models.HookEventIssueLabel, models.HookEventIssueMilestone:
 | 
				
			||||||
		return getSlackIssuesPayload(p.(*api.IssuePayload), slack)
 | 
							return getSlackIssuesPayload(p.(*api.IssuePayload), slack)
 | 
				
			||||||
	case models.HookEventIssueComment:
 | 
						case models.HookEventIssueComment, models.HookEventPullRequestComment:
 | 
				
			||||||
		return getSlackIssueCommentPayload(p.(*api.IssueCommentPayload), slack)
 | 
							return getSlackIssueCommentPayload(p.(*api.IssueCommentPayload), slack)
 | 
				
			||||||
	case models.HookEventPush:
 | 
						case models.HookEventPush:
 | 
				
			||||||
		return getSlackPushPayload(p.(*api.PushPayload), slack)
 | 
							return getSlackPushPayload(p.(*api.PushPayload), slack)
 | 
				
			||||||
	case models.HookEventPullRequest:
 | 
						case models.HookEventPullRequest, models.HookEventPullRequestAssign, models.HookEventPullRequestLabel,
 | 
				
			||||||
 | 
							models.HookEventPullRequestMilestone, models.HookEventPullRequestSync:
 | 
				
			||||||
		return getSlackPullRequestPayload(p.(*api.PullRequestPayload), slack)
 | 
							return getSlackPullRequestPayload(p.(*api.PullRequestPayload), slack)
 | 
				
			||||||
	case models.HookEventPullRequestRejected, models.HookEventPullRequestApproved, models.HookEventPullRequestComment:
 | 
						case models.HookEventPullRequestReviewRejected, models.HookEventPullRequestReviewApproved, models.HookEventPullRequestReviewComment:
 | 
				
			||||||
		return getSlackPullRequestApprovalPayload(p.(*api.PullRequestPayload), slack, event)
 | 
							return getSlackPullRequestApprovalPayload(p.(*api.PullRequestPayload), slack, event)
 | 
				
			||||||
	case models.HookEventRepository:
 | 
						case models.HookEventRepository:
 | 
				
			||||||
		return getSlackRepositoryPayload(p.(*api.RepositoryPayload), slack)
 | 
							return getSlackRepositoryPayload(p.(*api.RepositoryPayload), slack)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -151,7 +151,7 @@ func getTelegramPullRequestPayload(p *api.PullRequestPayload) (*TelegramPayload,
 | 
				
			|||||||
func getTelegramPullRequestApprovalPayload(p *api.PullRequestPayload, event models.HookEventType) (*TelegramPayload, error) {
 | 
					func getTelegramPullRequestApprovalPayload(p *api.PullRequestPayload, event models.HookEventType) (*TelegramPayload, error) {
 | 
				
			||||||
	var text, attachmentText string
 | 
						var text, attachmentText string
 | 
				
			||||||
	switch p.Action {
 | 
						switch p.Action {
 | 
				
			||||||
	case api.HookIssueSynchronized:
 | 
						case api.HookIssueReviewed:
 | 
				
			||||||
		action, err := parseHookPullRequestEventType(event)
 | 
							action, err := parseHookPullRequestEventType(event)
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			return nil, err
 | 
								return nil, err
 | 
				
			||||||
@@ -203,15 +203,16 @@ func GetTelegramPayload(p api.Payloader, event models.HookEventType, meta string
 | 
				
			|||||||
		return getTelegramDeletePayload(p.(*api.DeletePayload))
 | 
							return getTelegramDeletePayload(p.(*api.DeletePayload))
 | 
				
			||||||
	case models.HookEventFork:
 | 
						case models.HookEventFork:
 | 
				
			||||||
		return getTelegramForkPayload(p.(*api.ForkPayload))
 | 
							return getTelegramForkPayload(p.(*api.ForkPayload))
 | 
				
			||||||
	case models.HookEventIssues:
 | 
						case models.HookEventIssues, models.HookEventIssueAssign, models.HookEventIssueLabel, models.HookEventIssueMilestone:
 | 
				
			||||||
		return getTelegramIssuesPayload(p.(*api.IssuePayload))
 | 
							return getTelegramIssuesPayload(p.(*api.IssuePayload))
 | 
				
			||||||
	case models.HookEventIssueComment:
 | 
						case models.HookEventIssueComment, models.HookEventPullRequestComment:
 | 
				
			||||||
		return getTelegramIssueCommentPayload(p.(*api.IssueCommentPayload))
 | 
							return getTelegramIssueCommentPayload(p.(*api.IssueCommentPayload))
 | 
				
			||||||
	case models.HookEventPush:
 | 
						case models.HookEventPush:
 | 
				
			||||||
		return getTelegramPushPayload(p.(*api.PushPayload))
 | 
							return getTelegramPushPayload(p.(*api.PushPayload))
 | 
				
			||||||
	case models.HookEventPullRequest:
 | 
						case models.HookEventPullRequest, models.HookEventPullRequestAssign, models.HookEventPullRequestLabel,
 | 
				
			||||||
 | 
							models.HookEventPullRequestMilestone, models.HookEventPullRequestSync:
 | 
				
			||||||
		return getTelegramPullRequestPayload(p.(*api.PullRequestPayload))
 | 
							return getTelegramPullRequestPayload(p.(*api.PullRequestPayload))
 | 
				
			||||||
	case models.HookEventPullRequestRejected, models.HookEventPullRequestApproved, models.HookEventPullRequestComment:
 | 
						case models.HookEventPullRequestReviewRejected, models.HookEventPullRequestReviewApproved, models.HookEventPullRequestReviewComment:
 | 
				
			||||||
		return getTelegramPullRequestApprovalPayload(p.(*api.PullRequestPayload), event)
 | 
							return getTelegramPullRequestApprovalPayload(p.(*api.PullRequestPayload), event)
 | 
				
			||||||
	case models.HookEventRepository:
 | 
						case models.HookEventRepository:
 | 
				
			||||||
		return getTelegramRepositoryPayload(p.(*api.RepositoryPayload))
 | 
							return getTelegramRepositoryPayload(p.(*api.RepositoryPayload))
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1380,26 +1380,47 @@ settings.event_desc = Trigger On:
 | 
				
			|||||||
settings.event_push_only = Push Events
 | 
					settings.event_push_only = Push Events
 | 
				
			||||||
settings.event_send_everything = All Events
 | 
					settings.event_send_everything = All Events
 | 
				
			||||||
settings.event_choose = Custom Events…
 | 
					settings.event_choose = Custom Events…
 | 
				
			||||||
 | 
					settings.event_header_repository = Repository Events
 | 
				
			||||||
settings.event_create = Create
 | 
					settings.event_create = Create
 | 
				
			||||||
settings.event_create_desc = Branch or tag created.
 | 
					settings.event_create_desc = Branch or tag created.
 | 
				
			||||||
settings.event_delete = Delete
 | 
					settings.event_delete = Delete
 | 
				
			||||||
settings.event_delete_desc = Branch or tag deleted
 | 
					settings.event_delete_desc = Branch or tag deleted.
 | 
				
			||||||
settings.event_fork = Fork
 | 
					settings.event_fork = Fork
 | 
				
			||||||
settings.event_fork_desc = Repository forked
 | 
					settings.event_fork_desc = Repository forked.
 | 
				
			||||||
settings.event_issues = Issues
 | 
					 | 
				
			||||||
settings.event_issues_desc = Issue opened, closed, reopened, edited, assigned, unassigned, label updated, label cleared, milestoned, or demilestoned.
 | 
					 | 
				
			||||||
settings.event_issue_comment = Issue Comment
 | 
					 | 
				
			||||||
settings.event_issue_comment_desc = Issue comment created, edited, or deleted.
 | 
					 | 
				
			||||||
settings.event_release = Release
 | 
					settings.event_release = Release
 | 
				
			||||||
settings.event_release_desc = Release published, updated or deleted in a repository.
 | 
					settings.event_release_desc = Release published, updated or deleted in a repository.
 | 
				
			||||||
settings.event_pull_request = Pull Request
 | 
					 | 
				
			||||||
settings.event_pull_request_desc = Pull request opened, closed, reopened, edited, approved, rejected, review comment, assigned, unassigned, label updated, label cleared or synchronized.
 | 
					 | 
				
			||||||
settings.event_push = Push
 | 
					settings.event_push = Push
 | 
				
			||||||
settings.event_push_desc = Git push to a repository.
 | 
					settings.event_push_desc = Git push to a repository.
 | 
				
			||||||
settings.branch_filter = Branch filter
 | 
					 | 
				
			||||||
settings.branch_filter_desc = Branch whitelist for push, branch creation and branch deletion events, specified as glob pattern. If empty or <code>*</code>, events for all branches are reported. See <a href="https://godoc.org/github.com/gobwas/glob#Compile">github.com/gobwas/glob</a> documentation for syntax. Examples: <code>master</code>, <code>{master,release*}</code>.
 | 
					 | 
				
			||||||
settings.event_repository = Repository
 | 
					settings.event_repository = Repository
 | 
				
			||||||
settings.event_repository_desc = Repository created or deleted.
 | 
					settings.event_repository_desc = Repository created or deleted.
 | 
				
			||||||
 | 
					settings.event_header_issue = Issue Events
 | 
				
			||||||
 | 
					settings.event_issues = Issues
 | 
				
			||||||
 | 
					settings.event_issues_desc = Issue opened, closed, reopened, or edited.
 | 
				
			||||||
 | 
					settings.event_issue_assign = Issue Assigned
 | 
				
			||||||
 | 
					settings.event_issue_assign_desc = Issue assigned or unassigned.
 | 
				
			||||||
 | 
					settings.event_issue_label = Issue Labeled
 | 
				
			||||||
 | 
					settings.event_issue_label_desc = Issue labels updated or cleared.
 | 
				
			||||||
 | 
					settings.event_issue_milestone = Issue Milestoned
 | 
				
			||||||
 | 
					settings.event_issue_milestone_desc = Issue milestoned or demilestoned.
 | 
				
			||||||
 | 
					settings.event_issue_comment = Issue Comment
 | 
				
			||||||
 | 
					settings.event_issue_comment_desc = Issue comment created, edited, or deleted.
 | 
				
			||||||
 | 
					settings.event_header_pull_request = Pull Request Events
 | 
				
			||||||
 | 
					settings.event_pull_request = Pull Request
 | 
				
			||||||
 | 
					settings.event_pull_request_desc = Pull request opened, closed, reopened, or edited.
 | 
				
			||||||
 | 
					settings.event_pull_request_assign = Pull Request Assigned
 | 
				
			||||||
 | 
					settings.event_pull_request_assign_desc = Pull request assigned or unassigned.
 | 
				
			||||||
 | 
					settings.event_pull_request_label = Pull Request Labeled
 | 
				
			||||||
 | 
					settings.event_pull_request_label_desc = Pull request labels updated or cleared.
 | 
				
			||||||
 | 
					settings.event_pull_request_milestone = Pull Request Milestoned
 | 
				
			||||||
 | 
					settings.event_pull_request_milestone_desc = Pull request milestoned or demilestoned.
 | 
				
			||||||
 | 
					settings.event_pull_request_comment = Pull Request Comment
 | 
				
			||||||
 | 
					settings.event_pull_request_comment_desc = Pull request comment created, edited, or deleted.
 | 
				
			||||||
 | 
					settings.event_pull_request_review = Pull Request Reviewed
 | 
				
			||||||
 | 
					settings.event_pull_request_review_desc = Pull request approved, rejected, or review comment.
 | 
				
			||||||
 | 
					settings.event_pull_request_sync = Pull Request Synchronized
 | 
				
			||||||
 | 
					settings.event_pull_request_sync_desc = Pull request synchronized.
 | 
				
			||||||
 | 
					settings.branch_filter = Branch filter
 | 
				
			||||||
 | 
					settings.branch_filter_desc = Branch whitelist for push, branch creation and branch deletion events, specified as glob pattern. If empty or <code>*</code>, events for all branches are reported. See <a href="https://godoc.org/github.com/gobwas/glob#Compile">github.com/gobwas/glob</a> documentation for syntax. Examples: <code>master</code>, <code>{master,release*}</code>.
 | 
				
			||||||
settings.active = Active
 | 
					settings.active = Active
 | 
				
			||||||
settings.active_helper = Information about triggered events will be sent to this webhook URL.
 | 
					settings.active_helper = Information about triggered events will be sent to this webhook URL.
 | 
				
			||||||
settings.add_hook_success = The webhook has been added.
 | 
					settings.add_hook_success = The webhook has been added.
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -87,6 +87,14 @@ func AddRepoHook(ctx *context.APIContext, form *api.CreateHookOption) {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func issuesHook(events []string, event string) bool {
 | 
				
			||||||
 | 
						return com.IsSliceContainsStr(events, event) || com.IsSliceContainsStr(events, string(models.HookEventIssues))
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func pullHook(events []string, event string) bool {
 | 
				
			||||||
 | 
						return com.IsSliceContainsStr(events, event) || com.IsSliceContainsStr(events, string(models.HookEventPullRequest))
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// addHook add the hook specified by `form`, `orgID` and `repoID`. If there is
 | 
					// addHook add the hook specified by `form`, `orgID` and `repoID`. If there is
 | 
				
			||||||
// an error, write to `ctx` accordingly. Return (webhook, ok)
 | 
					// an error, write to `ctx` accordingly. Return (webhook, ok)
 | 
				
			||||||
func addHook(ctx *context.APIContext, form *api.CreateHookOption, orgID, repoID int64) (*models.Webhook, bool) {
 | 
					func addHook(ctx *context.APIContext, form *api.CreateHookOption, orgID, repoID int64) (*models.Webhook, bool) {
 | 
				
			||||||
@@ -103,15 +111,24 @@ func addHook(ctx *context.APIContext, form *api.CreateHookOption, orgID, repoID
 | 
				
			|||||||
		HookEvent: &models.HookEvent{
 | 
							HookEvent: &models.HookEvent{
 | 
				
			||||||
			ChooseEvents: true,
 | 
								ChooseEvents: true,
 | 
				
			||||||
			HookEvents: models.HookEvents{
 | 
								HookEvents: models.HookEvents{
 | 
				
			||||||
				Create:       com.IsSliceContainsStr(form.Events, string(models.HookEventCreate)),
 | 
									Create:               com.IsSliceContainsStr(form.Events, string(models.HookEventCreate)),
 | 
				
			||||||
				Delete:       com.IsSliceContainsStr(form.Events, string(models.HookEventDelete)),
 | 
									Delete:               com.IsSliceContainsStr(form.Events, string(models.HookEventDelete)),
 | 
				
			||||||
				Fork:         com.IsSliceContainsStr(form.Events, string(models.HookEventFork)),
 | 
									Fork:                 com.IsSliceContainsStr(form.Events, string(models.HookEventFork)),
 | 
				
			||||||
				Issues:       com.IsSliceContainsStr(form.Events, string(models.HookEventIssues)),
 | 
									Issues:               issuesHook(form.Events, "issues_only"),
 | 
				
			||||||
				IssueComment: com.IsSliceContainsStr(form.Events, string(models.HookEventIssueComment)),
 | 
									IssueAssign:          issuesHook(form.Events, string(models.HookEventIssueAssign)),
 | 
				
			||||||
				Push:         com.IsSliceContainsStr(form.Events, string(models.HookEventPush)),
 | 
									IssueLabel:           issuesHook(form.Events, string(models.HookEventIssueLabel)),
 | 
				
			||||||
				PullRequest:  com.IsSliceContainsStr(form.Events, string(models.HookEventPullRequest)),
 | 
									IssueMilestone:       issuesHook(form.Events, string(models.HookEventIssueMilestone)),
 | 
				
			||||||
				Repository:   com.IsSliceContainsStr(form.Events, string(models.HookEventRepository)),
 | 
									IssueComment:         issuesHook(form.Events, string(models.HookEventIssueComment)),
 | 
				
			||||||
				Release:      com.IsSliceContainsStr(form.Events, string(models.HookEventRelease)),
 | 
									Push:                 com.IsSliceContainsStr(form.Events, string(models.HookEventPush)),
 | 
				
			||||||
 | 
									PullRequest:          pullHook(form.Events, "pull_request_only"),
 | 
				
			||||||
 | 
									PullRequestAssign:    pullHook(form.Events, string(models.HookEventPullRequestAssign)),
 | 
				
			||||||
 | 
									PullRequestLabel:     pullHook(form.Events, string(models.HookEventPullRequestLabel)),
 | 
				
			||||||
 | 
									PullRequestMilestone: pullHook(form.Events, string(models.HookEventPullRequestMilestone)),
 | 
				
			||||||
 | 
									PullRequestComment:   pullHook(form.Events, string(models.HookEventPullRequestComment)),
 | 
				
			||||||
 | 
									PullRequestReview:    pullHook(form.Events, "pull_request_review"),
 | 
				
			||||||
 | 
									PullRequestSync:      pullHook(form.Events, string(models.HookEventPullRequestSync)),
 | 
				
			||||||
 | 
									Repository:           com.IsSliceContainsStr(form.Events, string(models.HookEventRepository)),
 | 
				
			||||||
 | 
									Release:              com.IsSliceContainsStr(form.Events, string(models.HookEventRelease)),
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
			BranchFilter: form.BranchFilter,
 | 
								BranchFilter: form.BranchFilter,
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -136,15 +136,24 @@ func ParseHookEvent(form auth.WebhookForm) *models.HookEvent {
 | 
				
			|||||||
		SendEverything: form.SendEverything(),
 | 
							SendEverything: form.SendEverything(),
 | 
				
			||||||
		ChooseEvents:   form.ChooseEvents(),
 | 
							ChooseEvents:   form.ChooseEvents(),
 | 
				
			||||||
		HookEvents: models.HookEvents{
 | 
							HookEvents: models.HookEvents{
 | 
				
			||||||
			Create:       form.Create,
 | 
								Create:               form.Create,
 | 
				
			||||||
			Delete:       form.Delete,
 | 
								Delete:               form.Delete,
 | 
				
			||||||
			Fork:         form.Fork,
 | 
								Fork:                 form.Fork,
 | 
				
			||||||
			Issues:       form.Issues,
 | 
								Issues:               form.Issues,
 | 
				
			||||||
			IssueComment: form.IssueComment,
 | 
								IssueAssign:          form.IssueAssign,
 | 
				
			||||||
			Release:      form.Release,
 | 
								IssueLabel:           form.IssueLabel,
 | 
				
			||||||
			Push:         form.Push,
 | 
								IssueMilestone:       form.IssueMilestone,
 | 
				
			||||||
			PullRequest:  form.PullRequest,
 | 
								IssueComment:         form.IssueComment,
 | 
				
			||||||
			Repository:   form.Repository,
 | 
								Release:              form.Release,
 | 
				
			||||||
 | 
								Push:                 form.Push,
 | 
				
			||||||
 | 
								PullRequest:          form.PullRequest,
 | 
				
			||||||
 | 
								PullRequestAssign:    form.PullRequestAssign,
 | 
				
			||||||
 | 
								PullRequestLabel:     form.PullRequestLabel,
 | 
				
			||||||
 | 
								PullRequestMilestone: form.PullRequestMilestone,
 | 
				
			||||||
 | 
								PullRequestComment:   form.PullRequestComment,
 | 
				
			||||||
 | 
								PullRequestReview:    form.PullRequestReview,
 | 
				
			||||||
 | 
								PullRequestSync:      form.PullRequestSync,
 | 
				
			||||||
 | 
								Repository:           form.Repository,
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		BranchFilter: form.BranchFilter,
 | 
							BranchFilter: form.BranchFilter,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -23,6 +23,10 @@
 | 
				
			|||||||
	</div>
 | 
						</div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	<div class="events fields ui grid" {{if not .Webhook.ChooseEvents}}style="display:none"{{end}}>
 | 
						<div class="events fields ui grid" {{if not .Webhook.ChooseEvents}}style="display:none"{{end}}>
 | 
				
			||||||
 | 
							<!-- Repository Events -->
 | 
				
			||||||
 | 
							<div class="fourteen wide column">
 | 
				
			||||||
 | 
								<label>{{.i18n.Tr "repo.settings.event_header_repository"}}</label>
 | 
				
			||||||
 | 
							</div>
 | 
				
			||||||
		<!-- Create -->
 | 
							<!-- Create -->
 | 
				
			||||||
		<div class="seven wide column">
 | 
							<div class="seven wide column">
 | 
				
			||||||
			<div class="field">
 | 
								<div class="field">
 | 
				
			||||||
@@ -63,36 +67,6 @@
 | 
				
			|||||||
				</div>
 | 
									</div>
 | 
				
			||||||
			</div>
 | 
								</div>
 | 
				
			||||||
		</div>
 | 
							</div>
 | 
				
			||||||
		<!-- Issues -->
 | 
					 | 
				
			||||||
		<div class="seven wide column">
 | 
					 | 
				
			||||||
			<div class="field">
 | 
					 | 
				
			||||||
				<div class="ui checkbox">
 | 
					 | 
				
			||||||
					<input class="hidden" name="issues" type="checkbox" tabindex="0" {{if .Webhook.Issues}}checked{{end}}>
 | 
					 | 
				
			||||||
					<label>{{.i18n.Tr "repo.settings.event_issues"}}</label>
 | 
					 | 
				
			||||||
					<span class="help">{{.i18n.Tr "repo.settings.event_issues_desc"}}</span>
 | 
					 | 
				
			||||||
				</div>
 | 
					 | 
				
			||||||
			</div>
 | 
					 | 
				
			||||||
		</div>
 | 
					 | 
				
			||||||
		<!-- Issue Comment -->
 | 
					 | 
				
			||||||
		<div class="seven wide column">
 | 
					 | 
				
			||||||
			<div class="field">
 | 
					 | 
				
			||||||
				<div class="ui checkbox">
 | 
					 | 
				
			||||||
					<input class="hidden" name="issue_comment" type="checkbox" tabindex="0" {{if .Webhook.IssueComment}}checked{{end}}>
 | 
					 | 
				
			||||||
					<label>{{.i18n.Tr "repo.settings.event_issue_comment"}}</label>
 | 
					 | 
				
			||||||
					<span class="help">{{.i18n.Tr "repo.settings.event_issue_comment_desc"}}</span>
 | 
					 | 
				
			||||||
				</div>
 | 
					 | 
				
			||||||
			</div>
 | 
					 | 
				
			||||||
		</div>
 | 
					 | 
				
			||||||
		<!-- Pull Request -->
 | 
					 | 
				
			||||||
		<div class="seven wide column">
 | 
					 | 
				
			||||||
			<div class="field">
 | 
					 | 
				
			||||||
				<div class="ui checkbox">
 | 
					 | 
				
			||||||
					<input class="hidden" name="pull_request" type="checkbox" tabindex="0" {{if .Webhook.PullRequest}}checked{{end}}>
 | 
					 | 
				
			||||||
					<label>{{.i18n.Tr "repo.settings.event_pull_request"}}</label>
 | 
					 | 
				
			||||||
					<span class="help">{{.i18n.Tr "repo.settings.event_pull_request_desc"}}</span>
 | 
					 | 
				
			||||||
				</div>
 | 
					 | 
				
			||||||
			</div>
 | 
					 | 
				
			||||||
		</div>
 | 
					 | 
				
			||||||
		<!-- Repository -->
 | 
							<!-- Repository -->
 | 
				
			||||||
		<div class="seven wide column">
 | 
							<div class="seven wide column">
 | 
				
			||||||
			<div class="field">
 | 
								<div class="field">
 | 
				
			||||||
@@ -113,6 +87,136 @@
 | 
				
			|||||||
				</div>
 | 
									</div>
 | 
				
			||||||
			</div>
 | 
								</div>
 | 
				
			||||||
		</div>
 | 
							</div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							<!-- Issue Events -->
 | 
				
			||||||
 | 
							<div class="fourteen wide column">
 | 
				
			||||||
 | 
								<label>{{.i18n.Tr "repo.settings.event_header_issue"}}</label>
 | 
				
			||||||
 | 
							</div>
 | 
				
			||||||
 | 
							<!-- Issues -->
 | 
				
			||||||
 | 
							<div class="seven wide column">
 | 
				
			||||||
 | 
								<div class="field">
 | 
				
			||||||
 | 
									<div class="ui checkbox">
 | 
				
			||||||
 | 
										<input class="hidden" name="issues" type="checkbox" tabindex="0" {{if .Webhook.Issues}}checked{{end}}>
 | 
				
			||||||
 | 
										<label>{{.i18n.Tr "repo.settings.event_issues"}}</label>
 | 
				
			||||||
 | 
										<span class="help">{{.i18n.Tr "repo.settings.event_issues_desc"}}</span>
 | 
				
			||||||
 | 
									</div>
 | 
				
			||||||
 | 
								</div>
 | 
				
			||||||
 | 
							</div>
 | 
				
			||||||
 | 
							<!-- Issue Assign -->
 | 
				
			||||||
 | 
							<div class="seven wide column">
 | 
				
			||||||
 | 
								<div class="field">
 | 
				
			||||||
 | 
									<div class="ui checkbox">
 | 
				
			||||||
 | 
										<input class="hidden" name="issue_assign" type="checkbox" tabindex="0" {{if .Webhook.IssueAssign}}checked{{end}}>
 | 
				
			||||||
 | 
										<label>{{.i18n.Tr "repo.settings.event_issue_assign"}}</label>
 | 
				
			||||||
 | 
										<span class="help">{{.i18n.Tr "repo.settings.event_issue_assign_desc"}}</span>
 | 
				
			||||||
 | 
									</div>
 | 
				
			||||||
 | 
								</div>
 | 
				
			||||||
 | 
							</div>
 | 
				
			||||||
 | 
							<!-- Issue Label -->
 | 
				
			||||||
 | 
							<div class="seven wide column">
 | 
				
			||||||
 | 
								<div class="field">
 | 
				
			||||||
 | 
									<div class="ui checkbox">
 | 
				
			||||||
 | 
										<input class="hidden" name="issue_label" type="checkbox" tabindex="0" {{if .Webhook.IssueLabel}}checked{{end}}>
 | 
				
			||||||
 | 
										<label>{{.i18n.Tr "repo.settings.event_issue_label"}}</label>
 | 
				
			||||||
 | 
										<span class="help">{{.i18n.Tr "repo.settings.event_issue_label_desc"}}</span>
 | 
				
			||||||
 | 
									</div>
 | 
				
			||||||
 | 
								</div>
 | 
				
			||||||
 | 
							</div>
 | 
				
			||||||
 | 
							<!-- Issue Milestone -->
 | 
				
			||||||
 | 
							<div class="seven wide column">
 | 
				
			||||||
 | 
								<div class="field">
 | 
				
			||||||
 | 
									<div class="ui checkbox">
 | 
				
			||||||
 | 
										<input class="hidden" name="issue_milestone" type="checkbox" tabindex="0" {{if .Webhook.IssueMilestone}}checked{{end}}>
 | 
				
			||||||
 | 
										<label>{{.i18n.Tr "repo.settings.event_issue_milestone"}}</label>
 | 
				
			||||||
 | 
										<span class="help">{{.i18n.Tr "repo.settings.event_issue_milestone_desc"}}</span>
 | 
				
			||||||
 | 
									</div>
 | 
				
			||||||
 | 
								</div>
 | 
				
			||||||
 | 
							</div>
 | 
				
			||||||
 | 
							<!-- Issue Comment -->
 | 
				
			||||||
 | 
							<div class="seven wide column">
 | 
				
			||||||
 | 
								<div class="field">
 | 
				
			||||||
 | 
									<div class="ui checkbox">
 | 
				
			||||||
 | 
										<input class="hidden" name="issue_comment" type="checkbox" tabindex="0" {{if .Webhook.IssueComment}}checked{{end}}>
 | 
				
			||||||
 | 
										<label>{{.i18n.Tr "repo.settings.event_issue_comment"}}</label>
 | 
				
			||||||
 | 
										<span class="help">{{.i18n.Tr "repo.settings.event_issue_comment_desc"}}</span>
 | 
				
			||||||
 | 
									</div>
 | 
				
			||||||
 | 
								</div>
 | 
				
			||||||
 | 
							</div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							<!-- Pull Request Events -->
 | 
				
			||||||
 | 
							<div class="fourteen wide column">
 | 
				
			||||||
 | 
								<label>{{.i18n.Tr "repo.settings.event_header_pull_request"}}</label>
 | 
				
			||||||
 | 
							</div>
 | 
				
			||||||
 | 
							<!-- Pull Request -->
 | 
				
			||||||
 | 
							<div class="seven wide column">
 | 
				
			||||||
 | 
								<div class="field">
 | 
				
			||||||
 | 
									<div class="ui checkbox">
 | 
				
			||||||
 | 
										<input class="hidden" name="pull_request" type="checkbox" tabindex="0" {{if .Webhook.PullRequest}}checked{{end}}>
 | 
				
			||||||
 | 
										<label>{{.i18n.Tr "repo.settings.event_pull_request"}}</label>
 | 
				
			||||||
 | 
										<span class="help">{{.i18n.Tr "repo.settings.event_pull_request_desc"}}</span>
 | 
				
			||||||
 | 
									</div>
 | 
				
			||||||
 | 
								</div>
 | 
				
			||||||
 | 
							</div>
 | 
				
			||||||
 | 
							<!-- Pull Request Assign -->
 | 
				
			||||||
 | 
							<div class="seven wide column">
 | 
				
			||||||
 | 
								<div class="field">
 | 
				
			||||||
 | 
									<div class="ui checkbox">
 | 
				
			||||||
 | 
										<input class="hidden" name="pull_request_assign" type="checkbox" tabindex="0" {{if .Webhook.PullRequestAssign}}checked{{end}}>
 | 
				
			||||||
 | 
										<label>{{.i18n.Tr "repo.settings.event_pull_request_assign"}}</label>
 | 
				
			||||||
 | 
										<span class="help">{{.i18n.Tr "repo.settings.event_pull_request_assign_desc"}}</span>
 | 
				
			||||||
 | 
									</div>
 | 
				
			||||||
 | 
								</div>
 | 
				
			||||||
 | 
							</div>
 | 
				
			||||||
 | 
							<!-- Pull Request Label -->
 | 
				
			||||||
 | 
							<div class="seven wide column">
 | 
				
			||||||
 | 
								<div class="field">
 | 
				
			||||||
 | 
									<div class="ui checkbox">
 | 
				
			||||||
 | 
										<input class="hidden" name="pull_request_label" type="checkbox" tabindex="0" {{if .Webhook.PullRequestLabel}}checked{{end}}>
 | 
				
			||||||
 | 
										<label>{{.i18n.Tr "repo.settings.event_pull_request_label"}}</label>
 | 
				
			||||||
 | 
										<span class="help">{{.i18n.Tr "repo.settings.event_pull_request_label_desc"}}</span>
 | 
				
			||||||
 | 
									</div>
 | 
				
			||||||
 | 
								</div>
 | 
				
			||||||
 | 
							</div>
 | 
				
			||||||
 | 
							<!-- Pull Request Milestone -->
 | 
				
			||||||
 | 
							<div class="seven wide column">
 | 
				
			||||||
 | 
								<div class="field">
 | 
				
			||||||
 | 
									<div class="ui checkbox">
 | 
				
			||||||
 | 
										<input class="hidden" name="pull_request_milestone" type="checkbox" tabindex="0" {{if .Webhook.PullRequestMilestone}}checked{{end}}>
 | 
				
			||||||
 | 
										<label>{{.i18n.Tr "repo.settings.event_pull_request_milestone"}}</label>
 | 
				
			||||||
 | 
										<span class="help">{{.i18n.Tr "repo.settings.event_pull_request_milestone_desc"}}</span>
 | 
				
			||||||
 | 
									</div>
 | 
				
			||||||
 | 
								</div>
 | 
				
			||||||
 | 
							</div>
 | 
				
			||||||
 | 
							<!-- Pull Request Comment -->
 | 
				
			||||||
 | 
							<div class="seven wide column">
 | 
				
			||||||
 | 
								<div class="field">
 | 
				
			||||||
 | 
									<div class="ui checkbox">
 | 
				
			||||||
 | 
										<input class="hidden" name="pull_request_comment" type="checkbox" tabindex="0" {{if .Webhook.PullRequestComment}}checked{{end}}>
 | 
				
			||||||
 | 
										<label>{{.i18n.Tr "repo.settings.event_pull_request_comment"}}</label>
 | 
				
			||||||
 | 
										<span class="help">{{.i18n.Tr "repo.settings.event_pull_request_comment_desc"}}</span>
 | 
				
			||||||
 | 
									</div>
 | 
				
			||||||
 | 
								</div>
 | 
				
			||||||
 | 
							</div>
 | 
				
			||||||
 | 
							<!-- Pull Request Review -->
 | 
				
			||||||
 | 
							<div class="seven wide column">
 | 
				
			||||||
 | 
								<div class="field">
 | 
				
			||||||
 | 
									<div class="ui checkbox">
 | 
				
			||||||
 | 
										<input class="hidden" name="pull_request_review" type="checkbox" tabindex="0" {{if .Webhook.PullRequestReview}}checked{{end}}>
 | 
				
			||||||
 | 
										<label>{{.i18n.Tr "repo.settings.event_pull_request_review"}}</label>
 | 
				
			||||||
 | 
										<span class="help">{{.i18n.Tr "repo.settings.event_pull_request_review_desc"}}</span>
 | 
				
			||||||
 | 
									</div>
 | 
				
			||||||
 | 
								</div>
 | 
				
			||||||
 | 
							</div>
 | 
				
			||||||
 | 
							<!-- Pull Request Sync -->
 | 
				
			||||||
 | 
							<div class="seven wide column">
 | 
				
			||||||
 | 
								<div class="field">
 | 
				
			||||||
 | 
									<div class="ui checkbox">
 | 
				
			||||||
 | 
										<input class="hidden" name="pull_request_sync" type="checkbox" tabindex="0" {{if .Webhook.PullRequestSync}}checked{{end}}>
 | 
				
			||||||
 | 
										<label>{{.i18n.Tr "repo.settings.event_pull_request_sync"}}</label>
 | 
				
			||||||
 | 
										<span class="help">{{.i18n.Tr "repo.settings.event_pull_request_sync_desc"}}</span>
 | 
				
			||||||
 | 
									</div>
 | 
				
			||||||
 | 
								</div>
 | 
				
			||||||
 | 
							</div>
 | 
				
			||||||
	</div>
 | 
						</div>
 | 
				
			||||||
</div>
 | 
					</div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user