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
This commit is contained in:
@@ -269,56 +269,105 @@ func ParseRawOn(rawOn *yaml.Node) ([]*Event, error) {
|
|||||||
}
|
}
|
||||||
return res, nil
|
return res, nil
|
||||||
case yaml.MappingNode:
|
case yaml.MappingNode:
|
||||||
events, triggers, err := parseMappingNode[interface{}](rawOn)
|
events, triggers, err := parseMappingNode[yaml.Node](rawOn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
res := make([]*Event, 0, len(events))
|
res := make([]*Event, 0, len(events))
|
||||||
for i, k := range events {
|
for i, k := range events {
|
||||||
v := triggers[i]
|
v := triggers[i]
|
||||||
if v == nil {
|
switch v.Kind {
|
||||||
|
case yaml.ScalarNode:
|
||||||
res = append(res, &Event{
|
res = append(res, &Event{
|
||||||
Name: k,
|
Name: k,
|
||||||
})
|
})
|
||||||
continue
|
case yaml.SequenceNode:
|
||||||
}
|
var t []interface{}
|
||||||
switch t := v.(type) {
|
err := v.Decode(&t)
|
||||||
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 {
|
|
||||||
var ok bool
|
|
||||||
if acts[act][i], ok = v.(string); !ok {
|
|
||||||
return nil, fmt.Errorf("unknown on type: %#v", branches)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
case map[string]interface{}:
|
|
||||||
if k != "workflow_dispatch" && act != "inputs" {
|
|
||||||
return nil, fmt.Errorf("unknown on type: %#v", branches)
|
|
||||||
}
|
|
||||||
inputs, err = parseWorkflowDispatchInputs(b)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
default:
|
schedules := make([]map[string]string, len(t))
|
||||||
return nil, fmt.Errorf("unknown on type: %#v", branches)
|
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 schedules[i][k], ok = vvv.(string); !ok {
|
||||||
|
return nil, fmt.Errorf("unknown on type(schedule): %#v", v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
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)
|
||||||
|
}
|
||||||
|
act = ""
|
||||||
|
err := content.Decode(&act)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
} 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 {
|
if len(inputs) == 0 {
|
||||||
inputs = nil
|
inputs = nil
|
||||||
@@ -331,33 +380,8 @@ func ParseRawOn(rawOn *yaml.Node) ([]*Event, error) {
|
|||||||
acts: acts,
|
acts: acts,
|
||||||
inputs: inputs,
|
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:
|
default:
|
||||||
return nil, fmt.Errorf("unknown on type: %#v", v)
|
return nil, fmt.Errorf("unknown on type: %v", v.Kind)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return res, nil
|
return res, nil
|
||||||
|
|||||||
Reference in New Issue
Block a user