1
0
mirror of https://github.com/go-task/task.git synced 2025-06-23 00:38:19 +02:00

DO nor re-run up-to-date tasks, based on ModTime and given patterns

This commit is contained in:
Andrey Nering
2017-02-27 16:44:08 -03:00
parent 7cab3997c1
commit 0e1aaabf11
2 changed files with 77 additions and 1 deletions

53
file.go Normal file
View File

@ -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
}

25
task.go
View File

@ -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 {