mirror of
https://github.com/go-task/task.git
synced 2025-01-06 03:53:54 +02:00
Refactoring startExecution
This commit is contained in:
parent
3e16ca37bc
commit
d28649b13d
121
task.go
121
task.go
@ -58,8 +58,8 @@ type Executor struct {
|
|||||||
concurrencySemaphore chan struct{}
|
concurrencySemaphore chan struct{}
|
||||||
taskCallCount map[string]*int32
|
taskCallCount map[string]*int32
|
||||||
mkdirMutexMap map[string]*sync.Mutex
|
mkdirMutexMap map[string]*sync.Mutex
|
||||||
execution map[string]context.Context
|
executionHashes map[string]context.Context
|
||||||
executionMutex sync.Mutex
|
executionHashesMutex sync.Mutex
|
||||||
}
|
}
|
||||||
|
|
||||||
// Run runs Task
|
// Run runs Task
|
||||||
@ -278,7 +278,7 @@ func (e *Executor) Setup() error {
|
|||||||
e.Taskfile.Run = "always"
|
e.Taskfile.Run = "always"
|
||||||
}
|
}
|
||||||
|
|
||||||
e.execution = make(map[string]context.Context)
|
e.executionHashes = make(map[string]context.Context)
|
||||||
|
|
||||||
e.taskCallCount = make(map[string]*int32, len(e.Taskfile.Tasks))
|
e.taskCallCount = make(map[string]*int32, len(e.Taskfile.Tasks))
|
||||||
e.mkdirMutexMap = make(map[string]*sync.Mutex, len(e.Taskfile.Tasks))
|
e.mkdirMutexMap = make(map[string]*sync.Mutex, len(e.Taskfile.Tasks))
|
||||||
@ -306,59 +306,50 @@ func (e *Executor) RunTask(ctx context.Context, call taskfile.Call) error {
|
|||||||
release := e.acquireConcurrencyLimit()
|
release := e.acquireConcurrencyLimit()
|
||||||
defer release()
|
defer release()
|
||||||
|
|
||||||
started, ctx, cancel, err := e.startExecution(ctx, t)
|
return e.startExecution(ctx, t, func(ctx context.Context) error {
|
||||||
if err != nil {
|
if err := e.runDeps(ctx, t); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
defer cancel()
|
|
||||||
|
|
||||||
if !started {
|
if !e.Force {
|
||||||
<-ctx.Done()
|
preCondMet, err := e.areTaskPreconditionsMet(ctx, t)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
upToDate, err := e.isTaskUpToDate(ctx, t)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if upToDate && preCondMet {
|
||||||
|
if !e.Silent {
|
||||||
|
e.Logger.Errf(logger.Magenta, `task: Task "%s" is up to date`, t.Name())
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := e.mkdir(t); err != nil {
|
||||||
|
e.Logger.Errf(logger.Red, "task: cannot make directory %q: %v", t.Dir, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
for i := range t.Cmds {
|
||||||
|
if err := e.runCommand(ctx, t, call, i); err != nil {
|
||||||
|
if err2 := e.statusOnError(t); err2 != nil {
|
||||||
|
e.Logger.VerboseErrf(logger.Yellow, "task: error cleaning status on error: %v", err2)
|
||||||
|
}
|
||||||
|
|
||||||
|
if execext.IsExitError(err) && t.IgnoreError {
|
||||||
|
e.Logger.VerboseErrf(logger.Yellow, "task: task error ignored: %v", err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
return &taskRunError{t.Task, err}
|
||||||
|
}
|
||||||
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
})
|
||||||
|
|
||||||
if err := e.runDeps(ctx, t); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
if !e.Force {
|
|
||||||
preCondMet, err := e.areTaskPreconditionsMet(ctx, t)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
upToDate, err := e.isTaskUpToDate(ctx, t)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
if upToDate && preCondMet {
|
|
||||||
if !e.Silent {
|
|
||||||
e.Logger.Errf(logger.Magenta, `task: Task "%s" is up to date`, t.Name())
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := e.mkdir(t); err != nil {
|
|
||||||
e.Logger.Errf(logger.Red, "task: cannot make directory %q: %v", t.Dir, err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := range t.Cmds {
|
|
||||||
if err := e.runCommand(ctx, t, call, i); err != nil {
|
|
||||||
if err2 := e.statusOnError(t); err2 != nil {
|
|
||||||
e.Logger.VerboseErrf(logger.Yellow, "task: error cleaning status on error: %v", err2)
|
|
||||||
}
|
|
||||||
|
|
||||||
if execext.IsExitError(err) && t.IgnoreError {
|
|
||||||
e.Logger.VerboseErrf(logger.Yellow, "task: task error ignored: %v", err)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
return &taskRunError{t.Task, err}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *Executor) mkdir(t *taskfile.Task) error {
|
func (e *Executor) mkdir(t *taskfile.Task) error {
|
||||||
@ -477,24 +468,26 @@ func getEnviron(t *taskfile.Task) []string {
|
|||||||
return environ
|
return environ
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *Executor) startExecution(innerCtx context.Context, t *taskfile.Task) (bool, context.Context, context.CancelFunc, error) {
|
func (e *Executor) startExecution(ctx context.Context, t *taskfile.Task, execute func(ctx context.Context) error) error {
|
||||||
h, err := e.GetHash(t)
|
h, err := e.GetHash(t)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return true, nil, nil, err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
if h == "" {
|
if h == "" {
|
||||||
return true, innerCtx, func() {}, nil
|
return execute(ctx)
|
||||||
}
|
}
|
||||||
|
|
||||||
e.executionMutex.Lock()
|
e.executionHashesMutex.Lock()
|
||||||
defer e.executionMutex.Unlock()
|
otherExecutionCtx, ok := e.executionHashes[h]
|
||||||
ctx, ok := e.execution[h]
|
e.executionHashesMutex.Unlock()
|
||||||
if ok {
|
if ok {
|
||||||
return false, ctx, func() {}, nil
|
<-otherExecutionCtx.Done()
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
ctx, cancel := context.WithCancel(innerCtx)
|
ctx, cancel := context.WithCancel(ctx)
|
||||||
e.execution[h] = ctx
|
defer cancel()
|
||||||
return true, ctx, cancel, nil
|
e.executionHashes[h] = ctx
|
||||||
|
return execute(ctx)
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user