@ -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 , trigg edE vent 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
}