Skip to content

Commit

Permalink
feat: make CHECKSUM and TIMESTAMP vars available in cmds commands (#1872
Browse files Browse the repository at this point in the history
)
  • Loading branch information
niklasr22 authored Dec 31, 2024
1 parent dc2eceb commit c1e14c4
Show file tree
Hide file tree
Showing 5 changed files with 62 additions and 16 deletions.
33 changes: 33 additions & 0 deletions task_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -976,6 +976,39 @@ func TestStatusVariables(t *testing.T) {
assert.Contains(t, buff.String(), tf)
}

func TestCmdsVariables(t *testing.T) {
t.Parallel()

const dir = "testdata/cmds_vars"

_ = os.RemoveAll(filepathext.SmartJoin(dir, ".task"))

var buff bytes.Buffer
e := task.Executor{
Dir: dir,
TempDir: task.TempDir{
Remote: filepathext.SmartJoin(dir, ".task"),
Fingerprint: filepathext.SmartJoin(dir, ".task"),
},
Stdout: &buff,
Stderr: &buff,
Silent: false,
Verbose: true,
}
require.NoError(t, e.Setup())
require.NoError(t, e.Run(context.Background(), &ast.Call{Task: "build"}))

assert.Contains(t, buff.String(), "3e464c4b03f4b65d740e1e130d4d108a")

inf, err := os.Stat(filepathext.SmartJoin(dir, "source.txt"))
require.NoError(t, err)
ts := fmt.Sprintf("%d", inf.ModTime().Unix())
tf := inf.ModTime().String()

assert.Contains(t, buff.String(), ts)
assert.Contains(t, buff.String(), tf)
}

func TestInit(t *testing.T) {
t.Parallel()

Expand Down
10 changes: 10 additions & 0 deletions testdata/cmds_vars/Taskfile.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
version: '3'

tasks:
build:
sources:
- ./source.txt
cmds:
- echo "{{.CHECKSUM}}"
- echo "{{.TIMESTAMP.Unix}}"
- echo "{{.TIMESTAMP}}"
1 change: 1 addition & 0 deletions testdata/cmds_vars/source.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Hello, World!
32 changes: 17 additions & 15 deletions variables.go
Original file line number Diff line number Diff line change
Expand Up @@ -127,6 +127,23 @@ func (e *Executor) compiledTask(call *ast.Call, evaluateShVars bool) (*ast.Task,
}
}

if len(origTask.Sources) > 0 {
timestampChecker := fingerprint.NewTimestampChecker(e.TempDir.Fingerprint, e.Dry)
checksumChecker := fingerprint.NewChecksumChecker(e.TempDir.Fingerprint, e.Dry)

for _, checker := range []fingerprint.SourcesCheckable{timestampChecker, checksumChecker} {
value, err := checker.Value(&new)
if err != nil {
return nil, err
}
vars.Set(strings.ToUpper(checker.Kind()), ast.Var{Live: value})
}

// Adding new variables, requires us to refresh the templaters
// cache of the the values manually
cache.ResetCache()
}

if len(origTask.Cmds) > 0 {
new.Cmds = make([]*ast.Cmd, 0, len(origTask.Cmds))
for _, cmd := range origTask.Cmds {
Expand Down Expand Up @@ -228,21 +245,6 @@ func (e *Executor) compiledTask(call *ast.Call, evaluateShVars bool) (*ast.Task,
}

if len(origTask.Status) > 0 {
timestampChecker := fingerprint.NewTimestampChecker(e.TempDir.Fingerprint, e.Dry)
checksumChecker := fingerprint.NewChecksumChecker(e.TempDir.Fingerprint, e.Dry)

for _, checker := range []fingerprint.SourcesCheckable{timestampChecker, checksumChecker} {
value, err := checker.Value(&new)
if err != nil {
return nil, err
}
vars.Set(strings.ToUpper(checker.Kind()), ast.Var{Live: value})
}

// Adding new variables, requires us to refresh the templaters
// cache of the the values manually
cache.ResetCache()

new.Status = templater.Replace(origTask.Status, cache)
}

Expand Down
2 changes: 1 addition & 1 deletion website/docs/usage.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -926,7 +926,7 @@ checksum source and timestamps require either access to the artifact or for an
out-of-band refresh of the `.checksum` fingerprint file.

Two special variables `{{.CHECKSUM}}` and `{{.TIMESTAMP}}` are available for
interpolation within `status` commands, depending on the method assigned to
interpolation within `cmds` and `status` commands, depending on the method assigned to
fingerprint the sources. Only `source` globs are fingerprinted.

Note that the `{{.TIMESTAMP}}` variable is a "live" Go `time.Time` struct, and
Expand Down

0 comments on commit c1e14c4

Please sign in to comment.