1
0
mirror of https://github.com/go-task/task.git synced 2025-02-03 13:22:11 +02:00

Allow override the .task dir location with the TASK_TEMP_DIR env

This commit is contained in:
Andrey Nering 2022-07-08 14:40:10 -03:00
parent f54fef7e7b
commit fedb68cde7
6 changed files with 61 additions and 17 deletions

View File

@ -2,6 +2,8 @@
## Unreleased ## Unreleased
- Add ability to override the `.task` directory location with the
`TASK_TEMP_DIR` environment variable.
- Allow to override Task colors using environment variables: - Allow to override Task colors using environment variables:
`TASK_COLOR_RESET`, `TASK_COLOR_BLUE`, `TASK_COLOR_GREEN`, `TASK_COLOR_RESET`, `TASK_COLOR_BLUE`, `TASK_COLOR_GREEN`,
`TASK_COLOR_CYAN`, `TASK_COLOR_YELLOW`, `TASK_COLOR_MAGENTA` `TASK_COLOR_CYAN`, `TASK_COLOR_YELLOW`, `TASK_COLOR_MAGENTA`

View File

@ -406,8 +406,6 @@ tasks:
Task will compare the checksum of the source files to determine if it's Task will compare the checksum of the source files to determine if it's
necessary to run the task. If not, it will just print a message like necessary to run the task. If not, it will just print a message like
`Task "js" is up to date`. `Task "js" is up to date`.
You will probably want to ignore the `.task` folder in your `.gitignore` file
(It is there that Task stores the last checksum).
If you prefer this check to be made by the modification timestamp of the files, If you prefer this check to be made by the modification timestamp of the files,
instead of its checksum (content), just set the `method` property to `timestamp`. instead of its checksum (content), just set the `method` property to `timestamp`.
@ -428,6 +426,26 @@ tasks:
:::info :::info
By default, task stores checksums on a local `.task` directory in the project's
directory. Most of the time, you'll want to have this directory on `.gitignore`
(or equivalent) so it isn't committed. (If you have a task for code generation
that is committed it may make sense to commit the checksum of that task as
well, though).
If you want these files to be stored in another directory, you can set a
`TASK_TEMP_DIR` environment variable in your machine. It can contain a relative
path like `tmp/task` that will be interpreted as relative to the project
directory, or an absolute or home path like `/tmp/.task` or `~/.task`
(subdirectories will be created for each project).
```bash
export TASK_TEMP_DIR='~/.task'
```
:::
:::info
Each task has only one checksum stored for its `sources`. If you want Each task has only one checksum stored for its `sources`. If you want
to distinguish a task by any of its input variables, you can add those to distinguish a task by any of its input variables, you can add those
variables as part of the task's label, and it will be considered a different variables as part of the task's label, and it will be considered a different

View File

@ -13,7 +13,7 @@ import (
// Checksum validades if a task is up to date by calculating its source // Checksum validades if a task is up to date by calculating its source
// files checksum // files checksum
type Checksum struct { type Checksum struct {
BaseDir string TempDir string
TaskDir string TaskDir string
Task string Task string
Sources []string Sources []string
@ -43,7 +43,7 @@ func (c *Checksum) IsUpToDate() (bool, error) {
} }
if !c.Dry { if !c.Dry {
_ = os.MkdirAll(filepath.Join(c.BaseDir, ".task", "checksum"), 0755) _ = os.MkdirAll(filepath.Join(c.TempDir, "checksum"), 0755)
if err = os.WriteFile(checksumFile, []byte(newMd5+"\n"), 0644); err != nil { if err = os.WriteFile(checksumFile, []byte(newMd5+"\n"), 0644); err != nil {
return false, err return false, err
} }
@ -107,7 +107,7 @@ func (*Checksum) Kind() string {
} }
func (c *Checksum) checksumFilePath() string { func (c *Checksum) checksumFilePath() string {
return filepath.Join(c.BaseDir, ".task", "checksum", c.normalizeFilename(c.Task)) return filepath.Join(c.TempDir, "checksum", c.normalizeFilename(c.Task))
} }
var checksumFilenameRegexp = regexp.MustCompile("[^A-z0-9]") var checksumFilenameRegexp = regexp.MustCompile("[^A-z0-9]")

View File

@ -95,7 +95,7 @@ func (e *Executor) timestampChecker(t *taskfile.Task) status.Checker {
func (e *Executor) checksumChecker(t *taskfile.Task) status.Checker { func (e *Executor) checksumChecker(t *taskfile.Task) status.Checker {
return &status.Checksum{ return &status.Checksum{
BaseDir: e.Dir, TempDir: e.TempDir,
TaskDir: t.Dir, TaskDir: t.Dir,
Task: t.Name(), Task: t.Name(),
Sources: t.Sources, Sources: t.Sources,

19
task.go
View File

@ -6,6 +6,8 @@ import (
"fmt" "fmt"
"io" "io"
"os" "os"
"path/filepath"
"strings"
"sync" "sync"
"sync/atomic" "sync/atomic"
@ -34,6 +36,7 @@ type Executor struct {
Taskfile *taskfile.Taskfile Taskfile *taskfile.Taskfile
Dir string Dir string
TempDir string
Entrypoint string Entrypoint string
Force bool Force bool
Watch bool Watch bool
@ -151,6 +154,22 @@ func (e *Executor) Setup() error {
Color: e.Color, Color: e.Color,
} }
if e.TempDir == "" {
if os.Getenv("TASK_TEMP_DIR") == "" {
e.TempDir = filepath.Join(e.Dir, ".task")
} else if filepath.IsAbs(os.Getenv("TASK_TEMP_DIR")) || strings.HasPrefix(os.Getenv("TASK_TEMP_DIR"), "~") {
tempDir, err := execext.Expand(os.Getenv("TASK_TEMP_DIR"))
if err != nil {
return err
}
projectDir, _ := filepath.Abs(e.Dir)
projectName := filepath.Base(projectDir)
e.TempDir = filepath.Join(tempDir, projectName)
} else {
e.TempDir = filepath.Join(e.Dir, os.Getenv("TASK_TEMP_DIR"))
}
}
if v < 2 { if v < 2 {
return fmt.Errorf(`task: Taskfile versions prior to v2 are not supported anymore`) return fmt.Errorf(`task: Taskfile versions prior to v2 are not supported anymore`)
} }

View File

@ -42,6 +42,7 @@ func (fct fileContentTest) Run(t *testing.T) {
e := &task.Executor{ e := &task.Executor{
Dir: fct.Dir, Dir: fct.Dir,
TempDir: filepath.Join(fct.Dir, ".task"),
Entrypoint: fct.Entrypoint, Entrypoint: fct.Entrypoint,
Stdout: io.Discard, Stdout: io.Discard,
Stderr: io.Discard, Stderr: io.Discard,
@ -270,10 +271,11 @@ func TestStatus(t *testing.T) {
var buff bytes.Buffer var buff bytes.Buffer
e := &task.Executor{ e := &task.Executor{
Dir: dir, Dir: dir,
Stdout: &buff, TempDir: filepath.Join(dir, ".task"),
Stderr: &buff, Stdout: &buff,
Silent: true, Stderr: &buff,
Silent: true,
} }
assert.NoError(t, e.Setup()) assert.NoError(t, e.Setup())
assert.NoError(t, e.Run(context.Background(), taskfile.Call{Task: "gen-foo"})) assert.NoError(t, e.Run(context.Background(), taskfile.Call{Task: "gen-foo"}))
@ -421,9 +423,10 @@ func TestStatusChecksum(t *testing.T) {
var buff bytes.Buffer var buff bytes.Buffer
e := task.Executor{ e := task.Executor{
Dir: dir, Dir: dir,
Stdout: &buff, TempDir: filepath.Join(dir, ".task"),
Stderr: &buff, Stdout: &buff,
Stderr: &buff,
} }
assert.NoError(t, e.Setup()) assert.NoError(t, e.Setup())
@ -579,6 +582,7 @@ func TestStatusVariables(t *testing.T) {
var buff bytes.Buffer var buff bytes.Buffer
e := task.Executor{ e := task.Executor{
Dir: dir, Dir: dir,
TempDir: filepath.Join(dir, ".task"),
Stdout: &buff, Stdout: &buff,
Stderr: &buff, Stderr: &buff,
Silent: false, Silent: false,
@ -718,10 +722,11 @@ func TestDryChecksum(t *testing.T) {
_ = os.Remove(checksumFile) _ = os.Remove(checksumFile)
e := task.Executor{ e := task.Executor{
Dir: dir, Dir: dir,
Stdout: io.Discard, TempDir: filepath.Join(dir, ".task"),
Stderr: io.Discard, Stdout: io.Discard,
Dry: true, Stderr: io.Discard,
Dry: true,
} }
assert.NoError(t, e.Setup()) assert.NoError(t, e.Setup())
assert.NoError(t, e.Run(context.Background(), taskfile.Call{Task: "default"})) assert.NoError(t, e.Run(context.Background(), taskfile.Call{Task: "default"}))