diff options
Diffstat (limited to 'models/webhook.go')
-rw-r--r-- | models/webhook.go | 73 |
1 files changed, 47 insertions, 26 deletions
diff --git a/models/webhook.go b/models/webhook.go index 2eee5555..32c3ab34 100644 --- a/models/webhook.go +++ b/models/webhook.go @@ -62,12 +62,13 @@ func IsValidHookContentType(name string) bool { } type HookEvents struct { - Create bool `json:"create"` - Delete bool `json:"delete"` - Fork bool `json:"fork"` - Push bool `json:"push"` - Issues bool `json:"issues"` - PullRequest bool `json:"pull_request"` + Create bool `json:"create"` + Delete bool `json:"delete"` + Fork bool `json:"fork"` + Push bool `json:"push"` + Issues bool `json:"issues"` + IssueComment bool `json:"issue_comment"` + PullRequest bool `json:"pull_request"` } // HookEvent represents events that will delivery hook. @@ -183,28 +184,38 @@ func (w *Webhook) HasIssuesEvent() bool { (w.ChooseEvents && w.HookEvents.Issues) } +// HasIssueCommentEvent returns true if hook enabled issue comment event. +func (w *Webhook) HasIssueCommentEvent() bool { + return w.SendEverything || + (w.ChooseEvents && w.HookEvents.IssueComment) +} + // HasPullRequestEvent returns true if hook enabled pull request event. func (w *Webhook) HasPullRequestEvent() bool { return w.SendEverything || (w.ChooseEvents && w.HookEvents.PullRequest) } +type eventChecker struct { + checker func() bool + typ HookEventType +} + func (w *Webhook) EventsArray() []string { - events := make([]string, 0, 5) - if w.HasCreateEvent() { - events = append(events, string(HOOK_EVENT_CREATE)) - } - if w.HasDeleteEvent() { - events = append(events, string(HOOK_EVENT_DELETE)) - } - if w.HasForkEvent() { - events = append(events, string(HOOK_EVENT_FORK)) + events := make([]string, 0, 7) + eventCheckers := []eventChecker{ + {w.HasCreateEvent, HOOK_EVENT_CREATE}, + {w.HasDeleteEvent, HOOK_EVENT_DELETE}, + {w.HasForkEvent, HOOK_EVENT_FORK}, + {w.HasPushEvent, HOOK_EVENT_PUSH}, + {w.HasIssuesEvent, HOOK_EVENT_ISSUES}, + {w.HasIssueCommentEvent, HOOK_EVENT_ISSUE_COMMENT}, + {w.HasPullRequestEvent, HOOK_EVENT_PULL_REQUEST}, } - if w.HasPushEvent() { - events = append(events, string(HOOK_EVENT_PUSH)) - } - if w.HasPullRequestEvent() { - events = append(events, string(HOOK_EVENT_PULL_REQUEST)) + for _, c := range eventCheckers { + if c.checker() { + events = append(events, string(c.typ)) + } } return events } @@ -363,12 +374,13 @@ func IsValidHookTaskType(name string) bool { type HookEventType string const ( - HOOK_EVENT_CREATE HookEventType = "create" - HOOK_EVENT_DELETE HookEventType = "delete" - HOOK_EVENT_FORK HookEventType = "fork" - HOOK_EVENT_PUSH HookEventType = "push" - HOOK_EVENT_ISSUES HookEventType = "issues" - HOOK_EVENT_PULL_REQUEST HookEventType = "pull_request" + HOOK_EVENT_CREATE HookEventType = "create" + HOOK_EVENT_DELETE HookEventType = "delete" + HOOK_EVENT_FORK HookEventType = "fork" + HOOK_EVENT_PUSH HookEventType = "push" + HOOK_EVENT_ISSUES HookEventType = "issues" + HOOK_EVENT_ISSUE_COMMENT HookEventType = "issue_comment" + HOOK_EVENT_PULL_REQUEST HookEventType = "pull_request" ) // HookRequest represents hook task request information. @@ -496,6 +508,10 @@ func prepareHookTasks(e Engine, repo *Repository, event HookEventType, p api.Pay if !w.HasDeleteEvent() { continue } + case HOOK_EVENT_FORK: + if !w.HasForkEvent() { + continue + } case HOOK_EVENT_PUSH: if !w.HasPushEvent() { continue @@ -504,6 +520,10 @@ func prepareHookTasks(e Engine, repo *Repository, event HookEventType, p api.Pay if !w.HasIssuesEvent() { continue } + case HOOK_EVENT_ISSUE_COMMENT: + if !w.HasIssueCommentEvent() { + continue + } case HOOK_EVENT_PULL_REQUEST: if !w.HasPullRequestEvent() { continue @@ -554,6 +574,7 @@ func prepareHookTasks(e Engine, repo *Repository, event HookEventType, p api.Pay // It's safe to fail when the whole function is called during hook execution // because resource released after exit. + // FIXME: need a more safe way to not call this function if it's during hook execution. go HookQueue.Add(repo.ID) return nil } |