From 0e1aaabf11e10491adc908aea5f72ebe0ac8fc6f Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Mon, 27 Feb 2017 16:44:08 -0300 Subject: [PATCH] DO nor re-run up-to-date tasks, based on ModTime and given patterns --- file.go | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++ task.go | 25 ++++++++++++++++++++++++- 2 files changed, 77 insertions(+), 1 deletion(-) create mode 100644 file.go diff --git a/file.go b/file.go new file mode 100644 index 00000000..1c344087 --- /dev/null +++ b/file.go @@ -0,0 +1,53 @@ +package task + +import ( + "os" + "time" + + "github.com/mattn/go-zglob" +) + +var dirsToSkip = []string{ + ".git", + "node_modules", +} + +func minTime(pattern string) (minTime time.Time, err error) { + files, err := zglob.Glob(pattern) + if err != nil { + return time.Time{}, err + } + + for _, f := range files { + info, err := os.Stat(f) + if err != nil { + return time.Time{}, err + } + + modTime := info.ModTime() + if minTime.IsZero() || modTime.Before(minTime) { + minTime = modTime + } + } + return +} + +func maxTime(pattern string) (maxTime time.Time, err error) { + files, err := zglob.Glob(pattern) + if err != nil { + return time.Time{}, err + } + + for _, f := range files { + info, err := os.Stat(f) + if err != nil { + return time.Time{}, err + } + + modTime := info.ModTime() + if modTime.After(maxTime) { + maxTime = modTime + } + } + return +} diff --git a/task.go b/task.go index daf2abc5..902470f5 100644 --- a/task.go +++ b/task.go @@ -30,7 +30,7 @@ func init() { type Task struct { Cmds []string Deps []string - Source string + Sources string Generates string } @@ -84,6 +84,11 @@ func RunTask(name string) error { return &TaskNotFoundError{name} } + if isTaskUpToDate(t) { + log.Printf(`Task "%s" is up to date`, name) + return nil + } + for _, d := range t.Deps { if err := RunTask(d); err != nil { return err @@ -98,6 +103,24 @@ func RunTask(name string) error { return nil } +func isTaskUpToDate(t *Task) bool { + if t.Sources == "" || t.Generates == "" { + return false + } + + sourcesMaxTime, err := maxTime(t.Sources) + if err != nil || sourcesMaxTime.IsZero() { + return false + } + + generatesMinTime, err := minTime(t.Generates) + if err != nil || generatesMinTime.IsZero() { + return false + } + + return generatesMinTime.After(sourcesMaxTime) +} + func runCommand(c string) error { var cmd *exec.Cmd if ShExists {