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:
53
file.go
Normal file
53
file.go
Normal 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
25
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 {
|
||||
|
Reference in New Issue
Block a user