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
 | 
			
		||||
	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
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user