]> source.dussan.org Git - gitea.git/commitdiff
Implement some action notifier functions (#29173)
authoryp05327 <576951401@qq.com>
Sun, 18 Feb 2024 10:58:46 +0000 (19:58 +0900)
committerGitHub <noreply@github.com>
Sun, 18 Feb 2024 10:58:46 +0000 (10:58 +0000)
Fix #29166

Add support for the following activity types of `pull_request`
- assigned
- unassigned
- review_requested
- review_request_removed
- milestoned
- demilestoned

modules/actions/github.go
modules/actions/workflows.go
services/actions/notifier.go

index fafea4e11a805859cb055bcf39c8c882234bc1f5..18917c5118d6639a92b22c392807dbbbcb05b14b 100644 (file)
@@ -52,7 +52,9 @@ func canGithubEventMatch(eventName string, triggedEvent webhook_module.HookEvent
                case webhook_module.HookEventPullRequest,
                        webhook_module.HookEventPullRequestSync,
                        webhook_module.HookEventPullRequestAssign,
-                       webhook_module.HookEventPullRequestLabel:
+                       webhook_module.HookEventPullRequestLabel,
+                       webhook_module.HookEventPullRequestReviewRequest,
+                       webhook_module.HookEventPullRequestMilestone:
                        return true
 
                default:
index a883f4181b2c84b92677d0e683fb6a0ca8035e61..2db4a9296f0e834c7aad2efbb33cd05abdc016bf 100644 (file)
@@ -221,7 +221,9 @@ func detectMatched(gitRepo *git.Repository, commit *git.Commit, triggedEvent web
                webhook_module.HookEventPullRequest,
                webhook_module.HookEventPullRequestSync,
                webhook_module.HookEventPullRequestAssign,
-               webhook_module.HookEventPullRequestLabel:
+               webhook_module.HookEventPullRequestLabel,
+               webhook_module.HookEventPullRequestReviewRequest,
+               webhook_module.HookEventPullRequestMilestone:
                return matchPullRequestEvent(gitRepo, commit, payload.(*api.PullRequestPayload), evt)
 
        case // pull_request_review
@@ -397,13 +399,13 @@ func matchPullRequestEvent(gitRepo *git.Repository, commit *git.Commit, prPayloa
        } else {
                // See https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#pull_request
                // Actions with the same name:
-               // opened, edited, closed, reopened, assigned, unassigned
+               // opened, edited, closed, reopened, assigned, unassigned, review_requested, review_request_removed, milestoned, demilestoned
                // Actions need to be converted:
                // synchronized -> synchronize
                // label_updated -> labeled
                // label_cleared -> unlabeled
                // Unsupported activity types:
-               // converted_to_draft, ready_for_review, locked, unlocked, review_requested, review_request_removed, auto_merge_enabled, auto_merge_disabled
+               // converted_to_draft, ready_for_review, locked, unlocked, auto_merge_enabled, auto_merge_disabled, enqueued, dequeued
 
                action := prPayload.Action
                switch action {
index 0b4fed5db1282faf18b68a90d038080fc7ef5545..093607f05cc58623ecf2b31d22a29e88e218a97e 100644 (file)
@@ -101,11 +101,40 @@ func (n *actionsNotifier) IssueChangeStatus(ctx context.Context, doer *user_mode
                Notify(ctx)
 }
 
+// IssueChangeAssignee notifies assigned or unassigned to notifiers
+func (n *actionsNotifier) IssueChangeAssignee(ctx context.Context, doer *user_model.User, issue *issues_model.Issue, assignee *user_model.User, removed bool, comment *issues_model.Comment) {
+       ctx = withMethod(ctx, "IssueChangeAssignee")
+
+       var action api.HookIssueAction
+       if removed {
+               action = api.HookIssueUnassigned
+       } else {
+               action = api.HookIssueAssigned
+       }
+       notifyIssueChange(ctx, doer, issue, webhook_module.HookEventPullRequestAssign, action)
+}
+
+// IssueChangeMilestone notifies assignee to notifiers
+func (n *actionsNotifier) IssueChangeMilestone(ctx context.Context, doer *user_model.User, issue *issues_model.Issue, oldMilestoneID int64) {
+       ctx = withMethod(ctx, "IssueChangeMilestone")
+
+       var action api.HookIssueAction
+       if issue.MilestoneID > 0 {
+               action = api.HookIssueMilestoned
+       } else {
+               action = api.HookIssueDemilestoned
+       }
+       notifyIssueChange(ctx, doer, issue, webhook_module.HookEventPullRequestMilestone, action)
+}
+
 func (n *actionsNotifier) IssueChangeLabels(ctx context.Context, doer *user_model.User, issue *issues_model.Issue,
        _, _ []*issues_model.Label,
 ) {
        ctx = withMethod(ctx, "IssueChangeLabels")
+       notifyIssueChange(ctx, doer, issue, webhook_module.HookEventPullRequestLabel, api.HookIssueLabelUpdated)
+}
 
+func notifyIssueChange(ctx context.Context, doer *user_model.User, issue *issues_model.Issue, event webhook_module.HookEventType, action api.HookIssueAction) {
        var err error
        if err = issue.LoadRepo(ctx); err != nil {
                log.Error("LoadRepo: %v", err)
@@ -117,20 +146,15 @@ func (n *actionsNotifier) IssueChangeLabels(ctx context.Context, doer *user_mode
                return
        }
 
-       permission, _ := access_model.GetUserRepoPermission(ctx, issue.Repo, issue.Poster)
        if issue.IsPull {
                if err = issue.LoadPullRequest(ctx); err != nil {
                        log.Error("loadPullRequest: %v", err)
                        return
                }
-               if err = issue.PullRequest.LoadIssue(ctx); err != nil {
-                       log.Error("LoadIssue: %v", err)
-                       return
-               }
-               newNotifyInputFromIssue(issue, webhook_module.HookEventPullRequestLabel).
+               newNotifyInputFromIssue(issue, event).
                        WithDoer(doer).
                        WithPayload(&api.PullRequestPayload{
-                               Action:      api.HookIssueLabelUpdated,
+                               Action:      action,
                                Index:       issue.Index,
                                PullRequest: convert.ToAPIPullRequest(ctx, issue.PullRequest, nil),
                                Repository:  convert.ToRepo(ctx, issue.Repo, access_model.Permission{AccessMode: perm_model.AccessModeNone}),
@@ -140,10 +164,11 @@ func (n *actionsNotifier) IssueChangeLabels(ctx context.Context, doer *user_mode
                        Notify(ctx)
                return
        }
-       newNotifyInputFromIssue(issue, webhook_module.HookEventIssueLabel).
+       permission, _ := access_model.GetUserRepoPermission(ctx, issue.Repo, issue.Poster)
+       newNotifyInputFromIssue(issue, event).
                WithDoer(doer).
                WithPayload(&api.IssuePayload{
-                       Action:     api.HookIssueLabelUpdated,
+                       Action:     action,
                        Index:      issue.Index,
                        Issue:      convert.ToAPIIssue(ctx, issue),
                        Repository: convert.ToRepo(ctx, issue.Repo, permission),
@@ -305,6 +330,39 @@ func (n *actionsNotifier) PullRequestReview(ctx context.Context, pr *issues_mode
                }).Notify(ctx)
 }
 
+func (n *actionsNotifier) PullRequestReviewRequest(ctx context.Context, doer *user_model.User, issue *issues_model.Issue, reviewer *user_model.User, isRequest bool, comment *issues_model.Comment) {
+       if !issue.IsPull {
+               log.Warn("PullRequestReviewRequest: issue is not a pull request: %v", issue.ID)
+               return
+       }
+
+       ctx = withMethod(ctx, "PullRequestReviewRequest")
+
+       permission, _ := access_model.GetUserRepoPermission(ctx, issue.Repo, doer)
+       if err := issue.LoadPullRequest(ctx); err != nil {
+               log.Error("LoadPullRequest failed: %v", err)
+               return
+       }
+       var action api.HookIssueAction
+       if isRequest {
+               action = api.HookIssueReviewRequested
+       } else {
+               action = api.HookIssueReviewRequestRemoved
+       }
+       newNotifyInputFromIssue(issue, webhook_module.HookEventPullRequestReviewRequest).
+               WithDoer(doer).
+               WithPayload(&api.PullRequestPayload{
+                       Action:            action,
+                       Index:             issue.Index,
+                       PullRequest:       convert.ToAPIPullRequest(ctx, issue.PullRequest, nil),
+                       RequestedReviewer: convert.ToUser(ctx, reviewer, nil),
+                       Repository:        convert.ToRepo(ctx, issue.Repo, permission),
+                       Sender:            convert.ToUser(ctx, doer, nil),
+               }).
+               WithPullRequest(issue.PullRequest).
+               Notify(ctx)
+}
+
 func (*actionsNotifier) MergePullRequest(ctx context.Context, doer *user_model.User, pr *issues_model.PullRequest) {
        ctx = withMethod(ctx, "MergePullRequest")