1
0
mirror of https://github.com/go-task/task.git synced 2025-04-27 12:32:25 +02:00

add ignoreError option

This commit is contained in:
Tobias Salzmann 2018-07-10 10:44:58 +02:00
parent c541356289
commit 05600601ff
7 changed files with 113 additions and 37 deletions

View File

@ -20,6 +20,7 @@ type RunCommandOptions struct {
Stdin io.Reader Stdin io.Reader
Stdout io.Writer Stdout io.Writer
Stderr io.Writer Stderr io.Writer
IgnoreErrorCode bool
} }
var ( var (
@ -62,5 +63,12 @@ func RunCommand(opts *RunCommandOptions) error {
if err = r.Reset(); err != nil { if err = r.Reset(); err != nil {
return err return err
} }
return r.Run(p) if err = r.Run(p); err != nil {
if opts.IgnoreErrorCode {
if _, ok := err.(interp.ExitCode); ok {
return nil
}
}
}
return err
} }

View File

@ -4,4 +4,5 @@ package taskfile
type Call struct { type Call struct {
Task string Task string
Vars Vars Vars Vars
IgnoreError bool
} }

View File

@ -11,12 +11,14 @@ type Cmd struct {
Silent bool Silent bool
Task string Task string
Vars Vars Vars Vars
IgnoreError bool
} }
// Dep is a task dependency // Dep is a task dependency
type Dep struct { type Dep struct {
Task string Task string
Vars Vars Vars Vars
IgnoreError bool
} }
var ( var (
@ -40,19 +42,23 @@ func (c *Cmd) UnmarshalYAML(unmarshal func(interface{}) error) error {
var cmdStruct struct { var cmdStruct struct {
Cmd string Cmd string
Silent bool Silent bool
IgnoreError bool `yaml:"ignoreError"`
} }
if err := unmarshal(&cmdStruct); err == nil && cmdStruct.Cmd != "" { if err := unmarshal(&cmdStruct); err == nil && cmdStruct.Cmd != "" {
c.Cmd = cmdStruct.Cmd c.Cmd = cmdStruct.Cmd
c.Silent = cmdStruct.Silent c.Silent = cmdStruct.Silent
c.IgnoreError = cmdStruct.IgnoreError
return nil return nil
} }
var taskCall struct { var taskCall struct {
Task string Task string
Vars Vars Vars Vars
IgnoreError bool `yaml:"ignoreError"`
} }
if err := unmarshal(&taskCall); err == nil { if err := unmarshal(&taskCall); err == nil {
c.Task = taskCall.Task c.Task = taskCall.Task
c.Vars = taskCall.Vars c.Vars = taskCall.Vars
c.IgnoreError = taskCall.IgnoreError
return nil return nil
} }
return ErrCantUnmarshalCmd return ErrCantUnmarshalCmd
@ -68,10 +74,12 @@ func (d *Dep) UnmarshalYAML(unmarshal func(interface{}) error) error {
var taskCall struct { var taskCall struct {
Task string Task string
Vars Vars Vars Vars
IgnoreError bool `yaml:"ignoreError"`
} }
if err := unmarshal(&taskCall); err == nil { if err := unmarshal(&taskCall); err == nil {
d.Task = taskCall.Task d.Task = taskCall.Task
d.Vars = taskCall.Vars d.Vars = taskCall.Vars
d.IgnoreError = taskCall.IgnoreError
return nil return nil
} }
return ErrCantUnmarshalDep return ErrCantUnmarshalDep

View File

@ -188,7 +188,7 @@ func (e *Executor) runDeps(ctx context.Context, t *taskfile.Task) error {
d := d d := d
g.Go(func() error { g.Go(func() error {
return e.RunTask(ctx, taskfile.Call{Task: d.Task, Vars: d.Vars}) return e.RunTask(ctx, taskfile.Call{Task: d.Task, Vars: d.Vars, IgnoreError: d.IgnoreError})
}) })
} }
@ -200,7 +200,7 @@ func (e *Executor) runCommand(ctx context.Context, t *taskfile.Task, call taskfi
switch { switch {
case cmd.Task != "": case cmd.Task != "":
return e.RunTask(ctx, taskfile.Call{Task: cmd.Task, Vars: cmd.Vars}) return e.RunTask(ctx, taskfile.Call{Task: cmd.Task, Vars: cmd.Vars, IgnoreError: cmd.IgnoreError || call.IgnoreError})
case cmd.Cmd != "": case cmd.Cmd != "":
if e.Verbose || (!cmd.Silent && !t.Silent && !e.Silent) { if e.Verbose || (!cmd.Silent && !t.Silent && !e.Silent) {
e.Logger.Errf(cmd.Cmd) e.Logger.Errf(cmd.Cmd)
@ -219,6 +219,7 @@ func (e *Executor) runCommand(ctx context.Context, t *taskfile.Task, call taskfi
Stdin: e.Stdin, Stdin: e.Stdin,
Stdout: stdOut, Stdout: stdOut,
Stderr: stdErr, Stderr: stdErr,
IgnoreErrorCode: cmd.IgnoreError || call.IgnoreError,
}) })
default: default:
return nil return nil

View File

@ -52,7 +52,6 @@ func (fct fileContentTest) Run(t *testing.T) {
assert.Equal(t, expectContent, s, "unexpected file content") assert.Equal(t, expectContent, s, "unexpected file content")
}) })
} }
} }
func TestEnv(t *testing.T) { func TestEnv(t *testing.T) {
@ -412,3 +411,47 @@ func TestTaskVersion(t *testing.T) {
}) })
} }
} }
func TestTaskIgnoreErrors(t *testing.T) {
const dir = "testdata/ignore_errors"
t.Run("CmdShouldPass", func(t *testing.T) {
e := task.Executor{
Dir: dir,
Stdout: ioutil.Discard,
Stderr: ioutil.Discard,
}
assert.NoError(t, e.Setup())
assert.NoError(t, e.Run(taskfile.Call{Task: "CmdShouldPass"}))
})
t.Run("CmdShouldFail", func(t *testing.T) {
e := task.Executor{
Dir: dir,
Stdout: ioutil.Discard,
Stderr: ioutil.Discard,
}
assert.NoError(t, e.Setup())
assert.Error(t, e.Run(taskfile.Call{Task: "CmdShouldFail"}))
})
t.Run("TaskShouldPass", func(t *testing.T) {
e := task.Executor{
Dir: dir,
Stdout: ioutil.Discard,
Stderr: ioutil.Discard,
}
assert.NoError(t, e.Setup())
assert.NoError(t, e.Run(taskfile.Call{Task: "TaskShouldPass"}))
})
t.Run("TaskShouldFail", func(t *testing.T) {
e := task.Executor{
Dir: dir,
Stdout: ioutil.Discard,
Stderr: ioutil.Discard,
}
assert.NoError(t, e.Setup())
assert.Error(t, e.Run(taskfile.Call{Task: "TaskShouldFail"}))
})
}

15
testdata/ignore_errors/Taskfile.yml vendored Normal file
View File

@ -0,0 +1,15 @@
CmdShouldPass:
cmds:
- cmd: UnknownCommandThatNeverWillExist
ignoreError: true
CmdShouldFail:
cmds:
- cmd: UnknownCommandThatNeverWillExist
TaskShouldPass:
cmds:
- task: CmdShouldFail
ignoreError: true
TaskShouldFail:
cmds:
- task: CmdShouldFail

View File

@ -66,8 +66,8 @@ func (e *Executor) CompiledTask(call taskfile.Call) (*taskfile.Task, error) {
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,
} }
} }
} }
if len(origTask.Deps) > 0 { if len(origTask.Deps) > 0 {