mirror of
https://github.com/go-task/task.git
synced 2025-06-15 00:15:10 +02:00
fix segmentation fault on nil slice element
This commit is contained in:
26
task_test.go
26
task_test.go
@ -990,3 +990,29 @@ func TestRunOnlyRunsJobsHashOnce(t *testing.T) {
|
|||||||
}
|
}
|
||||||
tt.Run(t)
|
tt.Run(t)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestIgnoreNilElements(t *testing.T) {
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
dir string
|
||||||
|
}{
|
||||||
|
{"nil cmd", "testdata/ignore_nil_elements/cmds"},
|
||||||
|
{"nil dep", "testdata/ignore_nil_elements/deps"},
|
||||||
|
{"nil precondition", "testdata/ignore_nil_elements/preconditions"},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, test := range tests {
|
||||||
|
t.Run(test.name, func(t *testing.T) {
|
||||||
|
var buff bytes.Buffer
|
||||||
|
e := task.Executor{
|
||||||
|
Dir: test.dir,
|
||||||
|
Stdout: &buff,
|
||||||
|
Stderr: &buff,
|
||||||
|
Silent: true,
|
||||||
|
}
|
||||||
|
assert.NoError(t, e.Setup())
|
||||||
|
assert.NoError(t, e.Run(context.Background(), taskfile.Call{Task: "default"}))
|
||||||
|
assert.Equal(t, "string-slice-1\n", buff.String())
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
7
testdata/ignore_nil_elements/cmds/Taskfile.yml
vendored
Normal file
7
testdata/ignore_nil_elements/cmds/Taskfile.yml
vendored
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
version: '3'
|
||||||
|
|
||||||
|
tasks:
|
||||||
|
default:
|
||||||
|
cmds:
|
||||||
|
- echo "string-slice-1"
|
||||||
|
-
|
11
testdata/ignore_nil_elements/deps/Taskfile.yml
vendored
Normal file
11
testdata/ignore_nil_elements/deps/Taskfile.yml
vendored
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
version: '3'
|
||||||
|
|
||||||
|
tasks:
|
||||||
|
default:
|
||||||
|
deps:
|
||||||
|
-
|
||||||
|
- task: dep
|
||||||
|
|
||||||
|
dep:
|
||||||
|
cmds:
|
||||||
|
- echo "string-slice-1"
|
9
testdata/ignore_nil_elements/preconditions/Taskfile.yml
vendored
Normal file
9
testdata/ignore_nil_elements/preconditions/Taskfile.yml
vendored
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
version: '3'
|
||||||
|
|
||||||
|
tasks:
|
||||||
|
default:
|
||||||
|
preconditions:
|
||||||
|
-
|
||||||
|
- sh: "[ 1 = 1 ]"
|
||||||
|
cmds:
|
||||||
|
- echo "string-slice-1"
|
33
variables.go
33
variables.go
@ -90,34 +90,43 @@ func (e *Executor) compiledTask(call taskfile.Call, evaluateShVars bool) (*taskf
|
|||||||
}
|
}
|
||||||
|
|
||||||
if len(origTask.Cmds) > 0 {
|
if len(origTask.Cmds) > 0 {
|
||||||
new.Cmds = make([]*taskfile.Cmd, len(origTask.Cmds))
|
new.Cmds = make([]*taskfile.Cmd, 0, len(origTask.Cmds))
|
||||||
for i, cmd := range origTask.Cmds {
|
for _, cmd := range origTask.Cmds {
|
||||||
new.Cmds[i] = &taskfile.Cmd{
|
if cmd == nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
new.Cmds = append(new.Cmds, &taskfile.Cmd{
|
||||||
Task: r.Replace(cmd.Task),
|
Task: r.Replace(cmd.Task),
|
||||||
Silent: cmd.Silent,
|
Silent: cmd.Silent,
|
||||||
Cmd: r.Replace(cmd.Cmd),
|
Cmd: r.Replace(cmd.Cmd),
|
||||||
Vars: r.ReplaceVars(cmd.Vars),
|
Vars: r.ReplaceVars(cmd.Vars),
|
||||||
IgnoreError: cmd.IgnoreError,
|
IgnoreError: cmd.IgnoreError,
|
||||||
}
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if len(origTask.Deps) > 0 {
|
if len(origTask.Deps) > 0 {
|
||||||
new.Deps = make([]*taskfile.Dep, len(origTask.Deps))
|
new.Deps = make([]*taskfile.Dep, 0, len(origTask.Deps))
|
||||||
for i, dep := range origTask.Deps {
|
for _, dep := range origTask.Deps {
|
||||||
new.Deps[i] = &taskfile.Dep{
|
if dep == nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
new.Deps = append(new.Deps, &taskfile.Dep{
|
||||||
Task: r.Replace(dep.Task),
|
Task: r.Replace(dep.Task),
|
||||||
Vars: r.ReplaceVars(dep.Vars),
|
Vars: r.ReplaceVars(dep.Vars),
|
||||||
}
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(origTask.Preconditions) > 0 {
|
if len(origTask.Preconditions) > 0 {
|
||||||
new.Preconditions = make([]*taskfile.Precondition, len(origTask.Preconditions))
|
new.Preconditions = make([]*taskfile.Precondition, 0, len(origTask.Preconditions))
|
||||||
for i, precond := range origTask.Preconditions {
|
for _, precond := range origTask.Preconditions {
|
||||||
new.Preconditions[i] = &taskfile.Precondition{
|
if precond == nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
new.Preconditions = append(new.Preconditions, &taskfile.Precondition{
|
||||||
Sh: r.Replace(precond.Sh),
|
Sh: r.Replace(precond.Sh),
|
||||||
Msg: r.Replace(precond.Msg),
|
Msg: r.Replace(precond.Msg),
|
||||||
}
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user