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 {
|
type Task struct {
|
||||||
Cmds []string
|
Cmds []string
|
||||||
Deps []string
|
Deps []string
|
||||||
Source string
|
Sources string
|
||||||
Generates string
|
Generates string
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -84,6 +84,11 @@ func RunTask(name string) error {
|
|||||||
return &TaskNotFoundError{name}
|
return &TaskNotFoundError{name}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if isTaskUpToDate(t) {
|
||||||
|
log.Printf(`Task "%s" is up to date`, name)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
for _, d := range t.Deps {
|
for _, d := range t.Deps {
|
||||||
if err := RunTask(d); err != nil {
|
if err := RunTask(d); err != nil {
|
||||||
return err
|
return err
|
||||||
@ -98,6 +103,24 @@ func RunTask(name string) error {
|
|||||||
return nil
|
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 {
|
func runCommand(c string) error {
|
||||||
var cmd *exec.Cmd
|
var cmd *exec.Cmd
|
||||||
if ShExists {
|
if ShExists {
|
||||||
|
Reference in New Issue
Block a user