From 6cdf1e5788dbfa8fe9787a07178c28b64837a61f Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Sat, 5 Oct 2024 19:29:55 +0000 Subject: [PATCH] Fix ParseRawOn sequence problem (#119) Fix https://gitea.com/gitea/act/actions/runs/277/jobs/0 Reviewed-on: https://gitea.com/gitea/act/pulls/119 --- pkg/jobparser/model.go | 142 ++++++++++++++++++++++++----------------- 1 file changed, 83 insertions(+), 59 deletions(-) diff --git a/pkg/jobparser/model.go b/pkg/jobparser/model.go index e5bbbcd..08c5810 100644 --- a/pkg/jobparser/model.go +++ b/pkg/jobparser/model.go @@ -269,56 +269,105 @@ func ParseRawOn(rawOn *yaml.Node) ([]*Event, error) { } return res, nil case yaml.MappingNode: - events, triggers, err := parseMappingNode[interface{}](rawOn) + events, triggers, err := parseMappingNode[yaml.Node](rawOn) if err != nil { return nil, err } res := make([]*Event, 0, len(events)) for i, k := range events { v := triggers[i] - if v == nil { + switch v.Kind { + case yaml.ScalarNode: res = append(res, &Event{ Name: k, }) - continue - } - switch t := v.(type) { - case string: - res = append(res, &Event{ - Name: k, - }) - case []string: - res = append(res, &Event{ - Name: k, - }) - case map[string]interface{}: - acts := make(map[string][]string, len(t)) - var inputs []WorkflowDispatchInput - for act, branches := range t { - switch b := branches.(type) { - case string: - acts[act] = []string{b} - case []string: - acts[act] = b - case []interface{}: - acts[act] = make([]string, len(b)) - for i, v := range b { + case yaml.SequenceNode: + var t []interface{} + err := v.Decode(&t) + if err != nil { + return nil, err + } + schedules := make([]map[string]string, len(t)) + if k == "schedule" { + for i, tt := range t { + vv, ok := tt.(map[string]interface{}) + if !ok { + return nil, fmt.Errorf("unknown on type(schedule): %#v", v) + } + schedules[i] = make(map[string]string, len(vv)) + for k, vvv := range vv { var ok bool - if acts[act][i], ok = v.(string); !ok { - return nil, fmt.Errorf("unknown on type: %#v", branches) + if schedules[i][k], ok = vvv.(string); !ok { + return nil, fmt.Errorf("unknown on type(schedule): %#v", v) } } - case map[string]interface{}: - if k != "workflow_dispatch" && act != "inputs" { - return nil, fmt.Errorf("unknown on type: %#v", branches) + } + } + + if len(schedules) == 0 { + schedules = nil + } + res = append(res, &Event{ + Name: k, + schedules: schedules, + }) + case yaml.MappingNode: + acts := make(map[string][]string, len(v.Content)/2) + var inputs []WorkflowDispatchInput + expectedKey := true + var act string + for _, content := range v.Content { + if expectedKey { + if content.Kind != yaml.ScalarNode { + return nil, fmt.Errorf("key type not string: %#v", content) } - inputs, err = parseWorkflowDispatchInputs(b) + act = "" + err := content.Decode(&act) if err != nil { return nil, err } - default: - return nil, fmt.Errorf("unknown on type: %#v", branches) + } else { + switch content.Kind { + case yaml.SequenceNode: + var t []string + err := content.Decode(&t) + if err != nil { + return nil, err + } + acts[act] = t + case yaml.MappingNode: + if k != "workflow_dispatch" || act != "inputs" { + return nil, fmt.Errorf("map should only for workflow_dispatch but %s: %#v", act, content) + } + + var key string + for i, vv := range content.Content { + if i%2 == 0 { + if vv.Kind != yaml.ScalarNode { + return nil, fmt.Errorf("key type not string: %#v", vv) + } + key = "" + if err := vv.Decode(&key); err != nil { + return nil, err + } + } else { + if vv.Kind != yaml.MappingNode { + return nil, fmt.Errorf("key type not map(%s): %#v", key, vv) + } + + input := WorkflowDispatchInput{} + if err := vv.Decode(&input); err != nil { + return nil, err + } + input.Name = key + inputs = append(inputs, input) + } + } + default: + return nil, fmt.Errorf("unknown on type: %#v", content) + } } + expectedKey = !expectedKey } if len(inputs) == 0 { inputs = nil @@ -331,33 +380,8 @@ func ParseRawOn(rawOn *yaml.Node) ([]*Event, error) { acts: acts, inputs: inputs, }) - case []interface{}: - if k != "schedule" { - return nil, fmt.Errorf("unknown on type: %#v", v) - } - schedules := make([]map[string]string, len(t)) - for i, tt := range t { - vv, ok := tt.(map[string]interface{}) - if !ok { - return nil, fmt.Errorf("unknown on type: %#v", v) - } - schedules[i] = make(map[string]string, len(vv)) - for k, vvv := range vv { - var ok bool - if schedules[i][k], ok = vvv.(string); !ok { - return nil, fmt.Errorf("unknown on type: %#v", v) - } - } - } - if len(schedules) == 0 { - schedules = nil - } - res = append(res, &Event{ - Name: k, - schedules: schedules, - }) default: - return nil, fmt.Errorf("unknown on type: %#v", v) + return nil, fmt.Errorf("unknown on type: %v", v.Kind) } } return res, nil