Skip to content

Commit 8072a00

Browse files
WorkflowDispatchConfig supports multiple yaml node kinds (#2123)
* WorkflowDispatchConfig supports ScalarNode and SequenceNode yaml node kinds * Avoid using log.Fatal * package slices is not in golang 1.20 --------- Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
1 parent 7f7d84b commit 8072a00

File tree

2 files changed

+135
-13
lines changed

2 files changed

+135
-13
lines changed

pkg/model/workflow.go

+31-13
Original file line numberDiff line numberDiff line change
@@ -79,22 +79,40 @@ type WorkflowDispatch struct {
7979
}
8080

8181
func (w *Workflow) WorkflowDispatchConfig() *WorkflowDispatch {
82-
if w.RawOn.Kind != yaml.MappingNode {
83-
return nil
84-
}
85-
86-
var val map[string]yaml.Node
87-
if !decodeNode(w.RawOn, &val) {
88-
return nil
89-
}
82+
switch w.RawOn.Kind {
83+
case yaml.ScalarNode:
84+
var val string
85+
if !decodeNode(w.RawOn, &val) {
86+
return nil
87+
}
88+
if val == "workflow_dispatch" {
89+
return &WorkflowDispatch{}
90+
}
91+
case yaml.SequenceNode:
92+
var val []string
93+
if !decodeNode(w.RawOn, &val) {
94+
return nil
95+
}
96+
for _, v := range val {
97+
if v == "workflow_dispatch" {
98+
return &WorkflowDispatch{}
99+
}
100+
}
101+
case yaml.MappingNode:
102+
var val map[string]yaml.Node
103+
if !decodeNode(w.RawOn, &val) {
104+
return nil
105+
}
90106

91-
var config WorkflowDispatch
92-
node := val["workflow_dispatch"]
93-
if !decodeNode(node, &config) {
107+
n, found := val["workflow_dispatch"]
108+
var workflowDispatch WorkflowDispatch
109+
if found && decodeNode(n, &workflowDispatch) {
110+
return &workflowDispatch
111+
}
112+
default:
94113
return nil
95114
}
96-
97-
return &config
115+
return nil
98116
}
99117

100118
type WorkflowCallInput struct {

pkg/model/workflow_test.go

+104
Original file line numberDiff line numberDiff line change
@@ -417,3 +417,107 @@ func TestStep_ShellCommand(t *testing.T) {
417417
})
418418
}
419419
}
420+
421+
func TestReadWorkflow_WorkflowDispatchConfig(t *testing.T) {
422+
yaml := `
423+
name: local-action-docker-url
424+
`
425+
workflow, err := ReadWorkflow(strings.NewReader(yaml))
426+
assert.NoError(t, err, "read workflow should succeed")
427+
workflowDispatch := workflow.WorkflowDispatchConfig()
428+
assert.Nil(t, workflowDispatch)
429+
430+
yaml = `
431+
name: local-action-docker-url
432+
on: push
433+
`
434+
workflow, err = ReadWorkflow(strings.NewReader(yaml))
435+
assert.NoError(t, err, "read workflow should succeed")
436+
workflowDispatch = workflow.WorkflowDispatchConfig()
437+
assert.Nil(t, workflowDispatch)
438+
439+
yaml = `
440+
name: local-action-docker-url
441+
on: workflow_dispatch
442+
`
443+
workflow, err = ReadWorkflow(strings.NewReader(yaml))
444+
assert.NoError(t, err, "read workflow should succeed")
445+
workflowDispatch = workflow.WorkflowDispatchConfig()
446+
assert.NotNil(t, workflowDispatch)
447+
assert.Nil(t, workflowDispatch.Inputs)
448+
449+
yaml = `
450+
name: local-action-docker-url
451+
on: [push, pull_request]
452+
`
453+
workflow, err = ReadWorkflow(strings.NewReader(yaml))
454+
assert.NoError(t, err, "read workflow should succeed")
455+
workflowDispatch = workflow.WorkflowDispatchConfig()
456+
assert.Nil(t, workflowDispatch)
457+
458+
yaml = `
459+
name: local-action-docker-url
460+
on: [push, workflow_dispatch]
461+
`
462+
workflow, err = ReadWorkflow(strings.NewReader(yaml))
463+
assert.NoError(t, err, "read workflow should succeed")
464+
workflowDispatch = workflow.WorkflowDispatchConfig()
465+
assert.NotNil(t, workflowDispatch)
466+
assert.Nil(t, workflowDispatch.Inputs)
467+
468+
yaml = `
469+
name: local-action-docker-url
470+
on:
471+
- push
472+
- workflow_dispatch
473+
`
474+
workflow, err = ReadWorkflow(strings.NewReader(yaml))
475+
assert.NoError(t, err, "read workflow should succeed")
476+
workflowDispatch = workflow.WorkflowDispatchConfig()
477+
assert.NotNil(t, workflowDispatch)
478+
assert.Nil(t, workflowDispatch.Inputs)
479+
480+
yaml = `
481+
name: local-action-docker-url
482+
on:
483+
push:
484+
pull_request:
485+
`
486+
workflow, err = ReadWorkflow(strings.NewReader(yaml))
487+
assert.NoError(t, err, "read workflow should succeed")
488+
workflowDispatch = workflow.WorkflowDispatchConfig()
489+
assert.Nil(t, workflowDispatch)
490+
491+
yaml = `
492+
name: local-action-docker-url
493+
on:
494+
push:
495+
pull_request:
496+
workflow_dispatch:
497+
inputs:
498+
logLevel:
499+
description: 'Log level'
500+
required: true
501+
default: 'warning'
502+
type: choice
503+
options:
504+
- info
505+
- warning
506+
- debug
507+
`
508+
workflow, err = ReadWorkflow(strings.NewReader(yaml))
509+
assert.NoError(t, err, "read workflow should succeed")
510+
workflowDispatch = workflow.WorkflowDispatchConfig()
511+
assert.NotNil(t, workflowDispatch)
512+
assert.Equal(t, WorkflowDispatchInput{
513+
Default: "warning",
514+
Description: "Log level",
515+
Options: []string{
516+
"info",
517+
"warning",
518+
"debug",
519+
},
520+
Required: true,
521+
Type: "choice",
522+
}, workflowDispatch.Inputs["logLevel"])
523+
}

0 commit comments

Comments
 (0)