From 26e0c0887a92bd94fea241de69791e2f36b6ff05 Mon Sep 17 00:00:00 2001 From: Seiichi Uchida Date: Thu, 1 Aug 2019 12:51:27 +0900 Subject: [PATCH 1/6] Re-run the task if generated files do not exist --- internal/status/checksum.go | 19 +++++++++++++++---- status.go | 9 +++++---- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/internal/status/checksum.go b/internal/status/checksum.go index 44331047..6c08c58d 100644 --- a/internal/status/checksum.go +++ b/internal/status/checksum.go @@ -14,10 +14,11 @@ import ( // Checksum validades if a task is up to date by calculating its source // files checksum type Checksum struct { - Dir string - Task string - Sources []string - Dry bool + Dir string + Task string + Sources []string + Generates []string + Dry bool } // IsUpToDate implements the Checker interface @@ -32,6 +33,16 @@ func (c *Checksum) IsUpToDate() (bool, error) { return false, err } + generates, err := glob(c.Dir, c.Generates) + if err != nil || len(generates) == 0 { + return false, err + } + for _, generate := range generates { + if _, err := os.Stat(generate); err != nil { + return false, nil + } + } + newMd5, err := c.checksum(sources...) if err != nil { return false, nil diff --git a/status.go b/status.go index 7ebb5f84..51d0e4cb 100644 --- a/status.go +++ b/status.go @@ -58,10 +58,11 @@ func (e *Executor) getStatusChecker(t *taskfile.Task) (status.Checker, error) { }, nil case "checksum": return &status.Checksum{ - Dir: t.Dir, - Task: t.Task, - Sources: t.Sources, - Dry: e.Dry, + Dir: t.Dir, + Task: t.Task, + Sources: t.Sources, + Generates: t.Generates, + Dry: e.Dry, }, nil case "none": return status.None{}, nil From 0cb298ebdf4dbc94a13e8093e1d0ab2e07f5faa5 Mon Sep 17 00:00:00 2001 From: Seiichi Uchida Date: Mon, 19 Aug 2019 13:00:10 +0900 Subject: [PATCH 2/6] Separate error handlings for readability --- internal/status/checksum.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/internal/status/checksum.go b/internal/status/checksum.go index 6c08c58d..8ffdc466 100644 --- a/internal/status/checksum.go +++ b/internal/status/checksum.go @@ -34,7 +34,10 @@ func (c *Checksum) IsUpToDate() (bool, error) { } generates, err := glob(c.Dir, c.Generates) - if err != nil || len(generates) == 0 { + if err != nil { + return false, err + } + if len(generates) == 0 { return false, err } for _, generate := range generates { From d561e40817454c5e7641ec1051d057f4ff2708cf Mon Sep 17 00:00:00 2001 From: Seiichi Uchida Date: Wed, 21 Aug 2019 13:33:12 +0900 Subject: [PATCH 3/6] Update glob.go - Rename glob() to globs() - Add glob() which handles a single glob pattern - Change glob() and globs() so that they do not return directoreis --- internal/status/checksum.go | 2 +- internal/status/glob.go | 42 +++++++++++++++++++++++++++--------- internal/status/timestamp.go | 4 ++-- 3 files changed, 35 insertions(+), 13 deletions(-) diff --git a/internal/status/checksum.go b/internal/status/checksum.go index 8ffdc466..26ec493c 100644 --- a/internal/status/checksum.go +++ b/internal/status/checksum.go @@ -28,7 +28,7 @@ func (c *Checksum) IsUpToDate() (bool, error) { data, _ := ioutil.ReadFile(checksumFile) oldMd5 := strings.TrimSpace(string(data)) - sources, err := glob(c.Dir, c.Sources) + sources, err := globs(c.Dir, c.Sources) if err != nil { return false, err } diff --git a/internal/status/glob.go b/internal/status/glob.go index 305e0f9b..b46f7616 100644 --- a/internal/status/glob.go +++ b/internal/status/glob.go @@ -1,6 +1,7 @@ package status import ( + "os" "path/filepath" "sort" @@ -9,21 +10,42 @@ import ( "github.com/mattn/go-zglob" ) -func glob(dir string, globs []string) (files []string, err error) { +func globs(dir string, globs []string) ([]string, error){ + files := make([]string, 0) for _, g := range globs { - if !filepath.IsAbs(g) { - g = filepath.Join(dir, g) - } - g, err = execext.Expand(g) - if err != nil { - return nil, err - } - f, err := zglob.Glob(g) + f, err := glob(dir, g) if err != nil { continue } files = append(files, f...) } sort.Strings(files) - return + return files, nil +} + +func glob(dir string, g string) ([]string, error) { + files := make([]string, 0) + if !filepath.IsAbs(g) { + g = filepath.Join(dir, g) + } + g, err := execext.Expand(g) + if err != nil { + return nil, err + } + fs, err := zglob.Glob(g) + if err != nil { + return nil, err + } + for _, f := range fs { + info, err := os.Stat(f) + if err != nil { + continue + } + if info.IsDir() { + continue + } + files = append(files, f) + } + sort.Strings(files) + return files, nil } diff --git a/internal/status/timestamp.go b/internal/status/timestamp.go index 62b9aafb..fcc52f6a 100644 --- a/internal/status/timestamp.go +++ b/internal/status/timestamp.go @@ -19,11 +19,11 @@ func (t *Timestamp) IsUpToDate() (bool, error) { return false, nil } - sources, err := glob(t.Dir, t.Sources) + sources, err := globs(t.Dir, t.Sources) if err != nil { return false, nil } - generates, err := glob(t.Dir, t.Generates) + generates, err := globs(t.Dir, t.Generates) if err != nil { return false, nil } From 01101a4c9bc95f636a3c9f6612dd5eb8ff3011e6 Mon Sep 17 00:00:00 2001 From: Seiichi Uchida Date: Wed, 21 Aug 2019 13:34:58 +0900 Subject: [PATCH 4/6] Remove directory check --- internal/status/checksum.go | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/internal/status/checksum.go b/internal/status/checksum.go index 26ec493c..0434bc0c 100644 --- a/internal/status/checksum.go +++ b/internal/status/checksum.go @@ -64,21 +64,14 @@ func (c *Checksum) checksum(files ...string) (string, error) { h := md5.New() for _, f := range files { + // also sum the filename, so checksum changes for renaming a file + if _, err := io.Copy(h, strings.NewReader(filepath.Base(f))); err != nil { + return "", err + } f, err := os.Open(f) if err != nil { return "", err } - info, err := f.Stat() - if err != nil { - return "", err - } - if info.IsDir() { - continue - } - // also sum the filename, so checksum changes for renaming a file - if _, err = io.Copy(h, strings.NewReader(info.Name())); err != nil { - return "", err - } if _, err = io.Copy(h, f); err != nil { return "", err } From fac51dcf0397d8f4b46bdb1056f2410b5fb20650 Mon Sep 17 00:00:00 2001 From: Seiichi Uchida Date: Wed, 21 Aug 2019 13:35:16 +0900 Subject: [PATCH 5/6] Fix Checksum.IsUpToDate - Check whether generates exist after the creation of checksum file - Check whether generates exist if only the user specified generates fields - Check for each generates field instead of taking it as a whole --- internal/status/checksum.go | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/internal/status/checksum.go b/internal/status/checksum.go index 0434bc0c..7d5d8b7a 100644 --- a/internal/status/checksum.go +++ b/internal/status/checksum.go @@ -30,22 +30,8 @@ func (c *Checksum) IsUpToDate() (bool, error) { sources, err := globs(c.Dir, c.Sources) if err != nil { - return false, err + return false, nil } - - generates, err := glob(c.Dir, c.Generates) - if err != nil { - return false, err - } - if len(generates) == 0 { - return false, err - } - for _, generate := range generates { - if _, err := os.Stat(generate); err != nil { - return false, nil - } - } - newMd5, err := c.checksum(sources...) if err != nil { return false, nil @@ -57,6 +43,20 @@ func (c *Checksum) IsUpToDate() (bool, error) { return false, err } } + + if len(c.Generates) != 0 { + // For each specified 'generates' field, check whether the files actually exist. + for _, g := range c.Generates { + generates, err := glob(c.Dir, g) + if err != nil { + return false, nil + } + if len(generates) == 0 { + return false, nil + } + } + } + return oldMd5 == newMd5, nil } From 8987cd64a0926d9ba321f5dec1c05e235568a4d6 Mon Sep 17 00:00:00 2001 From: Seiichi Uchida Date: Wed, 21 Aug 2019 13:42:19 +0900 Subject: [PATCH 6/6] Fix a typo --- internal/status/checksum.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/internal/status/checksum.go b/internal/status/checksum.go index 7d5d8b7a..653a8e35 100644 --- a/internal/status/checksum.go +++ b/internal/status/checksum.go @@ -30,8 +30,9 @@ func (c *Checksum) IsUpToDate() (bool, error) { sources, err := globs(c.Dir, c.Sources) if err != nil { - return false, nil + return false, err } + newMd5, err := c.checksum(sources...) if err != nil { return false, nil