MCPcopy
hub / github.com/go-task/task / runCommand

Method runCommand

task.go:364–438  ·  view source on GitHub ↗
(ctx context.Context, t *ast.Task, call *Call, i int)

Source from the content-addressed store, hash-verified

362}
363
364func (e *Executor) runCommand(ctx context.Context, t *ast.Task, call *Call, i int) error {
365 cmd := t.Cmds[i]
366
367 // Check if condition for any command type
368 if strings.TrimSpace(cmd.If) != "" {
369 if err := execext.RunCommand(ctx, &execext.RunCommandOptions{
370 Command: cmd.If,
371 Dir: t.Dir,
372 Env: env.Get(t),
373 }); err != nil {
374 e.Logger.VerboseOutf(logger.Yellow, "task: [%s] if condition not met - skipped\n", t.Name())
375 return nil
376 }
377 }
378
379 switch {
380 case cmd.Task != "":
381 reacquire := e.releaseConcurrencyLimit()
382 defer reacquire()
383
384 err := e.RunTask(ctx, &Call{Task: cmd.Task, Vars: cmd.Vars, Silent: cmd.Silent, Indirect: true})
385 var exitCode interp.ExitStatus
386 if errors.As(err, &exitCode) && cmd.IgnoreError {
387 e.Logger.VerboseErrf(logger.Yellow, "task: [%s] task error ignored: %v\n", t.Name(), err)
388 return nil
389 }
390 return err
391 case cmd.Cmd != "":
392 if !shouldRunOnCurrentPlatform(cmd.Platforms) {
393 e.Logger.VerboseOutf(logger.Yellow, "task: [%s] %s not for current platform - ignored\n", t.Name(), cmd.LogCmd)
394 return nil
395 }
396
397 if e.Verbose || (!call.Silent && !cmd.Silent && !t.IsSilent() && !e.Taskfile.Silent && !e.Silent) {
398 e.Logger.Errf(logger.Green, "task: [%s] %s\n", t.Name(), cmd.LogCmd)
399 }
400
401 if e.Dry {
402 return nil
403 }
404
405 outputWrapper := e.Output
406 if t.Interactive {
407 outputWrapper = output.Interleaved{}
408 }
409 vars, err := e.Compiler.FastGetVariables(t, call)
410 outputTemplater := &templater.Cache{Vars: vars}
411 if err != nil {
412 return fmt.Errorf("task: failed to get variables: %w", err)
413 }
414 stdOut, stdErr, closer := outputWrapper.WrapWriter(e.Stdout, e.Stderr, t.Prefix, outputTemplater)
415
416 err = execext.RunCommand(ctx, &execext.RunCommandOptions{
417 Command: cmd.Cmd,
418 Dir: t.Dir,
419 Env: env.Get(t),
420 PosixOpts: slicesext.UniqueJoin(e.Taskfile.Set, t.Set, cmd.Set),
421 BashOpts: slicesext.UniqueJoin(e.Taskfile.Shopt, t.Shopt, cmd.Shopt),

Callers 2

RunTaskMethod · 0.95
runDeferredMethod · 0.95

Calls 14

RunTaskMethod · 0.95
RunCommandFunction · 0.92
GetFunction · 0.92
AsFunction · 0.92
UniqueJoinFunction · 0.92
VerboseOutfMethod · 0.80
NameMethod · 0.80
VerboseErrfMethod · 0.80
IsSilentMethod · 0.80
ErrfMethod · 0.80

Tested by

no test coverage detected