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:
parent
c541356289
commit
05600601ff
@ -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
|
||||||
}
|
}
|
||||||
|
@ -4,4 +4,5 @@ package taskfile
|
|||||||
type Call struct {
|
type Call struct {
|
||||||
Task string
|
Task string
|
||||||
Vars Vars
|
Vars Vars
|
||||||
|
IgnoreError bool
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
5
task.go
5
task.go
@ -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
|
||||||
|
45
task_test.go
45
task_test.go
@ -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
15
testdata/ignore_errors/Taskfile.yml
vendored
Normal 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
|
@ -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 {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user