mirror of
				https://github.com/go-gitea/gitea
				synced 2025-10-31 03:18:24 +00:00 
			
		
		
		
	Convert GitHub event on actions and fix some pull_request events. (#23037)
Follow #22680 Partially Fix #22958, on pull_request, `opened`, `reopened`, `synchronize` supported, `edited` hasn't been supported yet because Gitea doesn't trigger that events. --------- Co-authored-by: yp05327 <576951401@qq.com>
This commit is contained in:
		
							
								
								
									
										41
									
								
								modules/actions/github.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								modules/actions/github.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,41 @@ | |||||||
|  | // Copyright 2023 The Gitea Authors. All rights reserved. | ||||||
|  | // SPDX-License-Identifier: MIT | ||||||
|  |  | ||||||
|  | package actions | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	webhook_module "code.gitea.io/gitea/modules/webhook" | ||||||
|  |  | ||||||
|  | 	"github.com/nektos/act/pkg/jobparser" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | const ( | ||||||
|  | 	githubEventPullRequest              = "pull_request" | ||||||
|  | 	githubEventPullRequestTarget        = "pull_request_target" | ||||||
|  | 	githubEventPullRequestReviewComment = "pull_request_review_comment" | ||||||
|  | 	githubEventPullRequestReview        = "pull_request_review" | ||||||
|  | 	githubEventRegistryPackage          = "registry_package" | ||||||
|  | 	githubEventCreate                   = "create" | ||||||
|  | 	githubEventDelete                   = "delete" | ||||||
|  | 	githubEventFork                     = "fork" | ||||||
|  | 	githubEventPush                     = "push" | ||||||
|  | 	githubEventIssues                   = "issues" | ||||||
|  | 	githubEventIssueComment             = "issue_comment" | ||||||
|  | 	githubEventRelease                  = "release" | ||||||
|  | 	githubEventPullRequestComment       = "pull_request_comment" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | func convertFromGithubEvent(evt *jobparser.Event) string { | ||||||
|  | 	switch evt.Name { | ||||||
|  | 	case githubEventPullRequest, githubEventPullRequestTarget, githubEventPullRequestReview, | ||||||
|  | 		githubEventPullRequestReviewComment: | ||||||
|  | 		return string(webhook_module.HookEventPullRequest) | ||||||
|  | 	case githubEventRegistryPackage: | ||||||
|  | 		return string(webhook_module.HookEventPackage) | ||||||
|  | 	case githubEventCreate, githubEventDelete, githubEventFork, githubEventPush, | ||||||
|  | 		githubEventIssues, githubEventIssueComment, githubEventRelease, githubEventPullRequestComment: | ||||||
|  | 		fallthrough | ||||||
|  | 	default: | ||||||
|  | 		return evt.Name | ||||||
|  | 	} | ||||||
|  | } | ||||||
| @@ -88,9 +88,7 @@ func DetectWorkflows(commit *git.Commit, triggedEvent webhook_module.HookEventTy | |||||||
| 			continue | 			continue | ||||||
| 		} | 		} | ||||||
| 		for _, evt := range events { | 		for _, evt := range events { | ||||||
| 			if evt.Name != triggedEvent.Event() { | 			log.Trace("detect workflow %q for event %#v matching %q", entry.Name(), evt, triggedEvent) | ||||||
| 				continue |  | ||||||
| 			} |  | ||||||
| 			if detectMatched(commit, triggedEvent, payload, evt) { | 			if detectMatched(commit, triggedEvent, payload, evt) { | ||||||
| 				workflows[entry.Name()] = content | 				workflows[entry.Name()] = content | ||||||
| 			} | 			} | ||||||
| @@ -101,20 +99,58 @@ func DetectWorkflows(commit *git.Commit, triggedEvent webhook_module.HookEventTy | |||||||
| } | } | ||||||
|  |  | ||||||
| func detectMatched(commit *git.Commit, triggedEvent webhook_module.HookEventType, payload api.Payloader, evt *jobparser.Event) bool { | func detectMatched(commit *git.Commit, triggedEvent webhook_module.HookEventType, payload api.Payloader, evt *jobparser.Event) bool { | ||||||
|  | 	if convertFromGithubEvent(evt) != string(triggedEvent) { | ||||||
|  | 		return false | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	switch triggedEvent { | ||||||
|  | 	case webhook_module.HookEventCreate, | ||||||
|  | 		webhook_module.HookEventDelete, | ||||||
|  | 		webhook_module.HookEventFork, | ||||||
|  | 		webhook_module.HookEventIssueAssign, | ||||||
|  | 		webhook_module.HookEventIssueLabel, | ||||||
|  | 		webhook_module.HookEventIssueMilestone, | ||||||
|  | 		webhook_module.HookEventPullRequestAssign, | ||||||
|  | 		webhook_module.HookEventPullRequestLabel, | ||||||
|  | 		webhook_module.HookEventPullRequestMilestone, | ||||||
|  | 		webhook_module.HookEventPullRequestComment, | ||||||
|  | 		webhook_module.HookEventPullRequestReviewApproved, | ||||||
|  | 		webhook_module.HookEventPullRequestReviewRejected, | ||||||
|  | 		webhook_module.HookEventPullRequestReviewComment, | ||||||
|  | 		webhook_module.HookEventWiki, | ||||||
|  | 		webhook_module.HookEventRepository, | ||||||
|  | 		webhook_module.HookEventRelease, | ||||||
|  | 		webhook_module.HookEventPackage: | ||||||
|  | 		if len(evt.Acts) != 0 { | ||||||
|  | 			log.Warn("Ignore unsupported %s event arguments %q", triggedEvent, evt.Acts) | ||||||
|  | 		} | ||||||
|  | 		// no special filter parameters for these events, just return true if name matched | ||||||
|  | 		return true | ||||||
|  |  | ||||||
|  | 	case webhook_module.HookEventPush: | ||||||
|  | 		return matchPushEvent(commit, payload.(*api.PushPayload), evt) | ||||||
|  |  | ||||||
|  | 	case webhook_module.HookEventIssues: | ||||||
|  | 		return matchIssuesEvent(commit, payload.(*api.IssuePayload), evt) | ||||||
|  |  | ||||||
|  | 	case webhook_module.HookEventPullRequest, webhook_module.HookEventPullRequestSync: | ||||||
|  | 		return matchPullRequestEvent(commit, payload.(*api.PullRequestPayload), evt) | ||||||
|  |  | ||||||
|  | 	case webhook_module.HookEventIssueComment: | ||||||
|  | 		return matchIssueCommentEvent(commit, payload.(*api.IssueCommentPayload), evt) | ||||||
|  |  | ||||||
|  | 	default: | ||||||
|  | 		log.Warn("unsupported event %q", triggedEvent) | ||||||
|  | 		return false | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func matchPushEvent(commit *git.Commit, pushPayload *api.PushPayload, evt *jobparser.Event) bool { | ||||||
|  | 	// with no special filter parameters | ||||||
| 	if len(evt.Acts) == 0 { | 	if len(evt.Acts) == 0 { | ||||||
| 		return true | 		return true | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	switch triggedEvent { |  | ||||||
| 	case webhook_module.HookEventCreate: |  | ||||||
| 		fallthrough |  | ||||||
| 	case webhook_module.HookEventDelete: |  | ||||||
| 		fallthrough |  | ||||||
| 	case webhook_module.HookEventFork: |  | ||||||
| 		log.Warn("unsupported event %q", triggedEvent.Event()) |  | ||||||
| 		return false |  | ||||||
| 	case webhook_module.HookEventPush: |  | ||||||
| 		pushPayload := payload.(*api.PushPayload) |  | ||||||
| 	matchTimes := 0 | 	matchTimes := 0 | ||||||
| 	// all acts conditions should be satisfied | 	// all acts conditions should be satisfied | ||||||
| 	for cond, vals := range evt.Acts { | 	for cond, vals := range evt.Acts { | ||||||
| @@ -147,30 +183,55 @@ func detectMatched(commit *git.Commit, triggedEvent webhook_module.HookEventType | |||||||
| 				} | 				} | ||||||
| 			} | 			} | ||||||
| 		default: | 		default: | ||||||
| 				log.Warn("unsupported condition %q", cond) | 			log.Warn("push event unsupported condition %q", cond) | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	return matchTimes == len(evt.Acts) | 	return matchTimes == len(evt.Acts) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func matchIssuesEvent(commit *git.Commit, issuePayload *api.IssuePayload, evt *jobparser.Event) bool { | ||||||
|  | 	// with no special filter parameters | ||||||
|  | 	if len(evt.Acts) == 0 { | ||||||
|  | 		return true | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	case webhook_module.HookEventIssues: |  | ||||||
| 		fallthrough |  | ||||||
| 	case webhook_module.HookEventIssueAssign: |  | ||||||
| 		fallthrough |  | ||||||
| 	case webhook_module.HookEventIssueLabel: |  | ||||||
| 		fallthrough |  | ||||||
| 	case webhook_module.HookEventIssueMilestone: |  | ||||||
| 		fallthrough |  | ||||||
| 	case webhook_module.HookEventIssueComment: |  | ||||||
| 		fallthrough |  | ||||||
| 	case webhook_module.HookEventPullRequest: |  | ||||||
| 		prPayload := payload.(*api.PullRequestPayload) |  | ||||||
| 	matchTimes := 0 | 	matchTimes := 0 | ||||||
| 	// all acts conditions should be satisfied | 	// all acts conditions should be satisfied | ||||||
| 	for cond, vals := range evt.Acts { | 	for cond, vals := range evt.Acts { | ||||||
| 		switch cond { | 		switch cond { | ||||||
| 		case "types": | 		case "types": | ||||||
| 			for _, val := range vals { | 			for _, val := range vals { | ||||||
| 					if glob.MustCompile(val, '/').Match(string(prPayload.Action)) { | 				if glob.MustCompile(val, '/').Match(string(issuePayload.Action)) { | ||||||
|  | 					matchTimes++ | ||||||
|  | 					break | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 		default: | ||||||
|  | 			log.Warn("issue event unsupported condition %q", cond) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return matchTimes == len(evt.Acts) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func matchPullRequestEvent(commit *git.Commit, prPayload *api.PullRequestPayload, evt *jobparser.Event) bool { | ||||||
|  | 	// with no special filter parameters | ||||||
|  | 	if len(evt.Acts) == 0 { | ||||||
|  | 		// defaultly, only pull request opened and synchronized will trigger workflow | ||||||
|  | 		return prPayload.Action == api.HookIssueSynchronized || prPayload.Action == api.HookIssueOpened | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	matchTimes := 0 | ||||||
|  | 	// all acts conditions should be satisfied | ||||||
|  | 	for cond, vals := range evt.Acts { | ||||||
|  | 		switch cond { | ||||||
|  | 		case "types": | ||||||
|  | 			action := prPayload.Action | ||||||
|  | 			if prPayload.Action == api.HookIssueSynchronized { | ||||||
|  | 				action = "synchronize" | ||||||
|  | 			} | ||||||
|  | 			log.Trace("matching pull_request %s with %v", action, vals) | ||||||
|  | 			for _, val := range vals { | ||||||
|  | 				if glob.MustCompile(val, '/').Match(string(action)) { | ||||||
| 					matchTimes++ | 					matchTimes++ | ||||||
| 					break | 					break | ||||||
| 				} | 				} | ||||||
| @@ -203,36 +264,32 @@ func detectMatched(commit *git.Commit, triggedEvent webhook_module.HookEventType | |||||||
| 				} | 				} | ||||||
| 			} | 			} | ||||||
| 		default: | 		default: | ||||||
| 				log.Warn("unsupported condition %q", cond) | 			log.Warn("pull request event unsupported condition %q", cond) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return matchTimes == len(evt.Acts) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func matchIssueCommentEvent(commit *git.Commit, issueCommentPayload *api.IssueCommentPayload, evt *jobparser.Event) bool { | ||||||
|  | 	// with no special filter parameters | ||||||
|  | 	if len(evt.Acts) == 0 { | ||||||
|  | 		return true | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	matchTimes := 0 | ||||||
|  | 	// all acts conditions should be satisfied | ||||||
|  | 	for cond, vals := range evt.Acts { | ||||||
|  | 		switch cond { | ||||||
|  | 		case "types": | ||||||
|  | 			for _, val := range vals { | ||||||
|  | 				if glob.MustCompile(val, '/').Match(string(issueCommentPayload.Action)) { | ||||||
|  | 					matchTimes++ | ||||||
|  | 					break | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 		default: | ||||||
|  | 			log.Warn("issue comment unsupported condition %q", cond) | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	return matchTimes == len(evt.Acts) | 	return matchTimes == len(evt.Acts) | ||||||
| 	case webhook_module.HookEventPullRequestAssign: |  | ||||||
| 		fallthrough |  | ||||||
| 	case webhook_module.HookEventPullRequestLabel: |  | ||||||
| 		fallthrough |  | ||||||
| 	case webhook_module.HookEventPullRequestMilestone: |  | ||||||
| 		fallthrough |  | ||||||
| 	case webhook_module.HookEventPullRequestComment: |  | ||||||
| 		fallthrough |  | ||||||
| 	case webhook_module.HookEventPullRequestReviewApproved: |  | ||||||
| 		fallthrough |  | ||||||
| 	case webhook_module.HookEventPullRequestReviewRejected: |  | ||||||
| 		fallthrough |  | ||||||
| 	case webhook_module.HookEventPullRequestReviewComment: |  | ||||||
| 		fallthrough |  | ||||||
| 	case webhook_module.HookEventPullRequestSync: |  | ||||||
| 		fallthrough |  | ||||||
| 	case webhook_module.HookEventWiki: |  | ||||||
| 		fallthrough |  | ||||||
| 	case webhook_module.HookEventRepository: |  | ||||||
| 		fallthrough |  | ||||||
| 	case webhook_module.HookEventRelease: |  | ||||||
| 		fallthrough |  | ||||||
| 	case webhook_module.HookEventPackage: |  | ||||||
| 		fallthrough |  | ||||||
| 	default: |  | ||||||
| 		log.Warn("unsupported event %q", triggedEvent.Event()) |  | ||||||
| 	} |  | ||||||
| 	return false |  | ||||||
| } | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user