summaryrefslogtreecommitdiffstats
path: root/modules
diff options
context:
space:
mode:
authorLunny Xiao <xiaolunwen@gmail.com>2023-02-01 13:32:46 +0800
committerGitHub <noreply@github.com>2023-02-01 13:32:46 +0800
commit2871ea08096cba15546f357d0ec473734ee9d8be (patch)
tree3ef7f1187d3de0153cb9206132aecac4f44397e6 /modules
parent7fd5d38860a9aef1a2ba3b30e882492fde84c9be (diff)
downloadgitea-2871ea08096cba15546f357d0ec473734ee9d8be.tar.gz
gitea-2871ea08096cba15546f357d0ec473734ee9d8be.zip
Add more events details supports for actions (#22680)
#21937 implemented only basic events based on name because of `act`'s limitation. So I sent a PR to parse all possible events details in https://gitea.com/gitea/act/pulls/11 and it merged. The ref documentation is https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows This PR depends on that and make more detail responses for `push` events and `pull_request` events. And it lefts more events there for future PRs. --------- Co-authored-by: Jason Song <i@wolfogre.com>
Diffstat (limited to 'modules')
-rw-r--r--modules/actions/workflows.go154
1 files changed, 150 insertions, 4 deletions
diff --git a/modules/actions/workflows.go b/modules/actions/workflows.go
index d340a1aa65..c1c8e71f53 100644
--- a/modules/actions/workflows.go
+++ b/modules/actions/workflows.go
@@ -10,8 +10,11 @@ import (
"code.gitea.io/gitea/modules/git"
"code.gitea.io/gitea/modules/log"
+ api "code.gitea.io/gitea/modules/structs"
webhook_module "code.gitea.io/gitea/modules/webhook"
+ "github.com/gobwas/glob"
+ "github.com/nektos/act/pkg/jobparser"
"github.com/nektos/act/pkg/model"
)
@@ -41,7 +44,7 @@ func ListWorkflows(commit *git.Commit) (git.Entries, error) {
return ret, nil
}
-func DetectWorkflows(commit *git.Commit, event webhook_module.HookEventType) (map[string][]byte, error) {
+func DetectWorkflows(commit *git.Commit, triggedEvent webhook_module.HookEventType, payload api.Payloader) (map[string][]byte, error) {
entries, err := ListWorkflows(commit)
if err != nil {
return nil, err
@@ -63,13 +66,156 @@ func DetectWorkflows(commit *git.Commit, event webhook_module.HookEventType) (ma
log.Warn("ignore invalid workflow %q: %v", entry.Name(), err)
continue
}
- for _, e := range workflow.On() {
- if e == event.Event() {
+ events, err := jobparser.ParseRawOn(&workflow.RawOn)
+ if err != nil {
+ log.Warn("ignore invalid workflow %q: %v", entry.Name(), err)
+ continue
+ }
+ for _, evt := range events {
+ if evt.Name != triggedEvent.Event() {
+ continue
+ }
+
+ if detectMatched(commit, triggedEvent, payload, evt) {
workflows[entry.Name()] = content
- break
}
}
}
return workflows, nil
}
+
+func detectMatched(commit *git.Commit, triggedEvent webhook_module.HookEventType, payload api.Payloader, evt *jobparser.Event) bool {
+ if len(evt.Acts) == 0 {
+ 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
+ // all acts conditions should be satisfied
+ for cond, vals := range evt.Acts {
+ switch cond {
+ case "branches", "tags":
+ for _, val := range vals {
+ if glob.MustCompile(val, '/').Match(pushPayload.Ref) {
+ matchTimes++
+ break
+ }
+ }
+ case "paths":
+ filesChanged, err := commit.GetFilesChangedSinceCommit(pushPayload.Before)
+ if err != nil {
+ log.Error("GetFilesChangedSinceCommit [commit_sha1: %s]: %v", commit.ID.String(), err)
+ } else {
+ for _, val := range vals {
+ matched := false
+ for _, file := range filesChanged {
+ if glob.MustCompile(val, '/').Match(file) {
+ matched = true
+ break
+ }
+ }
+ if matched {
+ matchTimes++
+ break
+ }
+ }
+ }
+ default:
+ log.Warn("unsupported condition %q", cond)
+ }
+ }
+ return matchTimes == len(evt.Acts)
+
+ 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
+ // 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(prPayload.Action)) {
+ matchTimes++
+ break
+ }
+ }
+ case "branches":
+ for _, val := range vals {
+ if glob.MustCompile(val, '/').Match(prPayload.PullRequest.Base.Ref) {
+ matchTimes++
+ break
+ }
+ }
+ case "paths":
+ filesChanged, err := commit.GetFilesChangedSinceCommit(prPayload.PullRequest.Base.Ref)
+ if err != nil {
+ log.Error("GetFilesChangedSinceCommit [commit_sha1: %s]: %v", commit.ID.String(), err)
+ } else {
+ for _, val := range vals {
+ matched := false
+ for _, file := range filesChanged {
+ if glob.MustCompile(val, '/').Match(file) {
+ matched = true
+ break
+ }
+ }
+ if matched {
+ matchTimes++
+ break
+ }
+ }
+ }
+ default:
+ log.Warn("unsupported condition %q", cond)
+ }
+ }
+ 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
+}