diff --git a/github/event.go b/github/event.go index eec905159fe..4b87142a8c7 100644 --- a/github/event.go +++ b/github/event.go @@ -98,6 +98,8 @@ func (e *Event) ParsePayload() (payload interface{}, err error) { payload = &PullRequestReviewEvent{} case "PullRequestReviewCommentEvent": payload = &PullRequestReviewCommentEvent{} + case "PullRequestTargetEvent": + payload = &PullRequestTargetEvent{} case "PushEvent": payload = &PushEvent{} case "ReleaseEvent": diff --git a/github/event_types.go b/github/event_types.go index eee919e2899..c5fedb25e7b 100644 --- a/github/event_types.go +++ b/github/event_types.go @@ -685,6 +685,48 @@ type PullRequestReviewCommentEvent struct { Installation *Installation `json:"installation,omitempty"` } +// PullRequestTargetEvent is triggered when a pull request is assigned, unassigned, labeled, +// unlabeled, opened, edited, closed, reopened, synchronize, ready_for_review, +// locked, unlocked, a pull request review is requested, or a review request is removed. +// The Webhook event name is "pull_request_target". +// +// GitHub API docs: https://docs.github.com/en/actions/reference/events-that-trigger-workflows#pull_request_target +type PullRequestTargetEvent struct { + // Action is the action that was performed. Possible values are: + // "assigned", "unassigned", "labeled", "unlabeled", "opened", "edited", "closed", "reopened", + // "ready_for_review", "locked", "unlocked", "review_requested" or "review_request_removed". + // If the action is "closed" and the "merged" key is "false", the pull request was closed with unmerged commits. + // If the action is "closed" and the "merged" key is "true", the pull request was merged. + // While webhooks are also triggered when a pull request is synchronized, Events API timelines + // don't include pull request events with the "synchronize" action. + Action *string `json:"action,omitempty"` + Assignee *User `json:"assignee,omitempty"` + Number *int `json:"number,omitempty"` + PullRequest *PullRequest `json:"pull_request,omitempty"` + + // The following fields are only populated by Webhook events. + Changes *EditChange `json:"changes,omitempty"` + // RequestedReviewer is populated in "review_requested", "review_request_removed" event deliveries. + // A request affecting multiple reviewers at once is split into multiple + // such event deliveries, each with a single, different RequestedReviewer. + RequestedReviewer *User `json:"requested_reviewer,omitempty"` + // In the event that a team is requested instead of a user, "requested_team" gets sent in place of + // "requested_user" with the same delivery behavior. + RequestedTeam *Team `json:"requested_team,omitempty"` + Repo *Repository `json:"repository,omitempty"` + Sender *User `json:"sender,omitempty"` + Installation *Installation `json:"installation,omitempty"` + Label *Label `json:"label,omitempty"` // Populated in "labeled" event deliveries. + + // The following field is only present when the webhook is triggered on + // a repository belonging to an organization. + Organization *Organization `json:"organization,omitempty"` + + // The following fields are only populated when the Action is "synchronize". + Before *string `json:"before,omitempty"` + After *string `json:"after,omitempty"` +} + // PushEvent represents a git push to a GitHub repository. // // GitHub API docs: https://docs.github.com/en/developers/webhooks-and-events/webhook-events-and-payloads#push diff --git a/github/github-accessors.go b/github/github-accessors.go index 92966561af1..c5d75249758 100644 --- a/github/github-accessors.go +++ b/github/github-accessors.go @@ -10724,6 +10724,118 @@ func (p *PullRequestReviewsEnforcementUpdate) GetDismissStaleReviews() bool { return *p.DismissStaleReviews } +// GetAction returns the Action field if it's non-nil, zero value otherwise. +func (p *PullRequestTargetEvent) GetAction() string { + if p == nil || p.Action == nil { + return "" + } + return *p.Action +} + +// GetAfter returns the After field if it's non-nil, zero value otherwise. +func (p *PullRequestTargetEvent) GetAfter() string { + if p == nil || p.After == nil { + return "" + } + return *p.After +} + +// GetAssignee returns the Assignee field. +func (p *PullRequestTargetEvent) GetAssignee() *User { + if p == nil { + return nil + } + return p.Assignee +} + +// GetBefore returns the Before field if it's non-nil, zero value otherwise. +func (p *PullRequestTargetEvent) GetBefore() string { + if p == nil || p.Before == nil { + return "" + } + return *p.Before +} + +// GetChanges returns the Changes field. +func (p *PullRequestTargetEvent) GetChanges() *EditChange { + if p == nil { + return nil + } + return p.Changes +} + +// GetInstallation returns the Installation field. +func (p *PullRequestTargetEvent) GetInstallation() *Installation { + if p == nil { + return nil + } + return p.Installation +} + +// GetLabel returns the Label field. +func (p *PullRequestTargetEvent) GetLabel() *Label { + if p == nil { + return nil + } + return p.Label +} + +// GetNumber returns the Number field if it's non-nil, zero value otherwise. +func (p *PullRequestTargetEvent) GetNumber() int { + if p == nil || p.Number == nil { + return 0 + } + return *p.Number +} + +// GetOrganization returns the Organization field. +func (p *PullRequestTargetEvent) GetOrganization() *Organization { + if p == nil { + return nil + } + return p.Organization +} + +// GetPullRequest returns the PullRequest field. +func (p *PullRequestTargetEvent) GetPullRequest() *PullRequest { + if p == nil { + return nil + } + return p.PullRequest +} + +// GetRepo returns the Repo field. +func (p *PullRequestTargetEvent) GetRepo() *Repository { + if p == nil { + return nil + } + return p.Repo +} + +// GetRequestedReviewer returns the RequestedReviewer field. +func (p *PullRequestTargetEvent) GetRequestedReviewer() *User { + if p == nil { + return nil + } + return p.RequestedReviewer +} + +// GetRequestedTeam returns the RequestedTeam field. +func (p *PullRequestTargetEvent) GetRequestedTeam() *Team { + if p == nil { + return nil + } + return p.RequestedTeam +} + +// GetSender returns the Sender field. +func (p *PullRequestTargetEvent) GetSender() *User { + if p == nil { + return nil + } + return p.Sender +} + // GetMergablePulls returns the MergablePulls field if it's non-nil, zero value otherwise. func (p *PullStats) GetMergablePulls() int { if p == nil || p.MergablePulls == nil { diff --git a/github/github-accessors_test.go b/github/github-accessors_test.go index 1e1cf2f95bc..a5ca6e16ba4 100644 --- a/github/github-accessors_test.go +++ b/github/github-accessors_test.go @@ -12506,6 +12506,116 @@ func TestPullRequestReviewsEnforcementUpdate_GetDismissStaleReviews(tt *testing. p.GetDismissStaleReviews() } +func TestPullRequestTargetEvent_GetAction(tt *testing.T) { + var zeroValue string + p := &PullRequestTargetEvent{Action: &zeroValue} + p.GetAction() + p = &PullRequestTargetEvent{} + p.GetAction() + p = nil + p.GetAction() +} + +func TestPullRequestTargetEvent_GetAfter(tt *testing.T) { + var zeroValue string + p := &PullRequestTargetEvent{After: &zeroValue} + p.GetAfter() + p = &PullRequestTargetEvent{} + p.GetAfter() + p = nil + p.GetAfter() +} + +func TestPullRequestTargetEvent_GetAssignee(tt *testing.T) { + p := &PullRequestTargetEvent{} + p.GetAssignee() + p = nil + p.GetAssignee() +} + +func TestPullRequestTargetEvent_GetBefore(tt *testing.T) { + var zeroValue string + p := &PullRequestTargetEvent{Before: &zeroValue} + p.GetBefore() + p = &PullRequestTargetEvent{} + p.GetBefore() + p = nil + p.GetBefore() +} + +func TestPullRequestTargetEvent_GetChanges(tt *testing.T) { + p := &PullRequestTargetEvent{} + p.GetChanges() + p = nil + p.GetChanges() +} + +func TestPullRequestTargetEvent_GetInstallation(tt *testing.T) { + p := &PullRequestTargetEvent{} + p.GetInstallation() + p = nil + p.GetInstallation() +} + +func TestPullRequestTargetEvent_GetLabel(tt *testing.T) { + p := &PullRequestTargetEvent{} + p.GetLabel() + p = nil + p.GetLabel() +} + +func TestPullRequestTargetEvent_GetNumber(tt *testing.T) { + var zeroValue int + p := &PullRequestTargetEvent{Number: &zeroValue} + p.GetNumber() + p = &PullRequestTargetEvent{} + p.GetNumber() + p = nil + p.GetNumber() +} + +func TestPullRequestTargetEvent_GetOrganization(tt *testing.T) { + p := &PullRequestTargetEvent{} + p.GetOrganization() + p = nil + p.GetOrganization() +} + +func TestPullRequestTargetEvent_GetPullRequest(tt *testing.T) { + p := &PullRequestTargetEvent{} + p.GetPullRequest() + p = nil + p.GetPullRequest() +} + +func TestPullRequestTargetEvent_GetRepo(tt *testing.T) { + p := &PullRequestTargetEvent{} + p.GetRepo() + p = nil + p.GetRepo() +} + +func TestPullRequestTargetEvent_GetRequestedReviewer(tt *testing.T) { + p := &PullRequestTargetEvent{} + p.GetRequestedReviewer() + p = nil + p.GetRequestedReviewer() +} + +func TestPullRequestTargetEvent_GetRequestedTeam(tt *testing.T) { + p := &PullRequestTargetEvent{} + p.GetRequestedTeam() + p = nil + p.GetRequestedTeam() +} + +func TestPullRequestTargetEvent_GetSender(tt *testing.T) { + p := &PullRequestTargetEvent{} + p.GetSender() + p = nil + p.GetSender() +} + func TestPullStats_GetMergablePulls(tt *testing.T) { var zeroValue int p := &PullStats{MergablePulls: &zeroValue} diff --git a/github/messages.go b/github/messages.go index 428684d69c7..98a76da644d 100644 --- a/github/messages.go +++ b/github/messages.go @@ -74,9 +74,10 @@ var ( "project_card": "ProjectCardEvent", "project_column": "ProjectColumnEvent", "public": "PublicEvent", + "pull_request": "PullRequestEvent", "pull_request_review": "PullRequestReviewEvent", "pull_request_review_comment": "PullRequestReviewCommentEvent", - "pull_request": "PullRequestEvent", + "pull_request_target": "PullRequestTargetEvent", "push": "PushEvent", "repository": "RepositoryEvent", "repository_dispatch": "RepositoryDispatchEvent", diff --git a/github/messages_test.go b/github/messages_test.go index 8b31b9d0f48..4eb154ec91f 100644 --- a/github/messages_test.go +++ b/github/messages_test.go @@ -370,6 +370,10 @@ func TestParseWebHook(t *testing.T) { payload: &PullRequestReviewCommentEvent{}, messageType: "pull_request_review_comment", }, + { + payload: &PullRequestTargetEvent{}, + messageType: "pull_request_target", + }, { payload: &PushEvent{}, messageType: "push",