From 58c69e36a1177d51e734fd57ca9e1a154d9aa63b Mon Sep 17 00:00:00 2001 From: mrngsht Date: Tue, 20 Apr 2021 22:04:21 +0900 Subject: [PATCH] Evaluate sources also if status is up-to-date --- status.go | 29 ++++++++++++++++++++----- task_test.go | 42 +++++++++++++++++++++++++++--------- testdata/status/Taskfile.yml | 12 ++++++++++- 3 files changed, 67 insertions(+), 16 deletions(-) diff --git a/status.go b/status.go index fcffa456..95aabafd 100644 --- a/status.go +++ b/status.go @@ -29,16 +29,35 @@ func (e *Executor) Status(ctx context.Context, calls ...taskfile.Call) error { } func (e *Executor) isTaskUpToDate(ctx context.Context, t *taskfile.Task) (bool, error) { + areChecksGiven := false + if len(t.Status) > 0 { - return e.isTaskUpToDateStatus(ctx, t) + areChecksGiven = true + isUpToDate, err := e.isTaskUpToDateStatus(ctx, t) + if err != nil { + return false, err + } + if !isUpToDate { + return false, nil + } } - checker, err := e.getStatusChecker(t) - if err != nil { - return false, err + if len(t.Sources) > 0 { + areChecksGiven = true + checker, err := e.getStatusChecker(t) + if err != nil { + return false, err + } + isUpToDate, err := checker.IsUpToDate() + if err != nil { + return false, err + } + if !isUpToDate { + return false, nil + } } - return checker.IsUpToDate() + return areChecksGiven, nil } func (e *Executor) statusOnError(t *taskfile.Task) error { diff --git a/task_test.go b/task_test.go index 6eed315e..7f7767c7 100644 --- a/task_test.go +++ b/task_test.go @@ -248,12 +248,18 @@ func TestDeps(t *testing.T) { func TestStatus(t *testing.T) { const dir = "testdata/status" - var file = filepath.Join(dir, "foo.txt") - _ = os.Remove(file) + files := []string{ + "foo.txt", + "bar.txt", + } - if _, err := os.Stat(file); err == nil { - t.Errorf("File should not exist: %v", err) + for _, f := range files { + path := filepath.Join(dir, f) + _ = os.Remove(path) + if _, err := os.Stat(path); err == nil { + t.Errorf("File should not exist: %v", err) + } } var buff bytes.Buffer @@ -265,17 +271,33 @@ func TestStatus(t *testing.T) { } assert.NoError(t, e.Setup()) assert.NoError(t, e.Run(context.Background(), taskfile.Call{Task: "gen-foo"})) + assert.NoError(t, e.Run(context.Background(), taskfile.Call{Task: "gen-bar"})) - if _, err := os.Stat(file); err != nil { - t.Errorf("File should exist: %v", err) + for _, f := range files { + if _, err := os.Stat(filepath.Join(dir, f)); err != nil { + t.Errorf("File should exist: %v", err) + } } e.Silent = false - assert.NoError(t, e.Run(context.Background(), taskfile.Call{Task: "gen-foo"})) - if buff.String() != `task: Task "gen-foo" is up to date`+"\n" { - t.Errorf("Wrong output message: %s", buff.String()) - } + // all: not up-to-date + assert.NoError(t, e.Run(context.Background(), taskfile.Call{Task: "gen-foo"})) + assert.Equal(t, "task: [gen-foo] touch foo.txt", strings.TrimSpace(buff.String())) + buff.Reset() + // status: not up-to-date + assert.NoError(t, e.Run(context.Background(), taskfile.Call{Task: "gen-foo"})) + assert.Equal(t, "task: [gen-foo] touch foo.txt", strings.TrimSpace(buff.String())) + buff.Reset() + + // sources: not up-to-date + assert.NoError(t, e.Run(context.Background(), taskfile.Call{Task: "gen-bar"})) + assert.Equal(t, "task: [gen-bar] touch bar.txt", strings.TrimSpace(buff.String())) + buff.Reset() + // all: up-to-date + assert.NoError(t, e.Run(context.Background(), taskfile.Call{Task: "gen-bar"})) + assert.Equal(t, `task: Task "gen-bar" is up to date`, strings.TrimSpace(buff.String())) + buff.Reset() } func TestPrecondition(t *testing.T) { diff --git a/testdata/status/Taskfile.yml b/testdata/status/Taskfile.yml index 7923c426..c7ddfcb5 100644 --- a/testdata/status/Taskfile.yml +++ b/testdata/status/Taskfile.yml @@ -4,5 +4,15 @@ tasks: gen-foo: cmds: - touch foo.txt + sources: + - ./foo.txt status: - - test -f foo.txt + - test 1 = 0 + + gen-bar: + cmds: + - touch bar.txt + sources: + - ./bar.txt + status: + - test 1 = 1