Skip to content

Commit 86a2384

Browse files
committed
Allow absolute path in generates section
Fixes issue #47 by allowing absolute paths in a task's generates and sources sections. Tests are added for the generates section only at this time.
1 parent a586fef commit 86a2384

File tree

5 files changed

+98
-2
lines changed

5 files changed

+98
-2
lines changed

file.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,9 @@ func maxTime(a, b time.Time) time.Time {
2323

2424
func getPatternsMinTime(dir string, patterns []string) (m time.Time, err error) {
2525
for _, p := range patterns {
26-
p = filepath.Join(dir, p)
26+
if !filepath.IsAbs(p) {
27+
p = filepath.Join(dir, p)
28+
}
2729
mp, err := getPatternMinTime(p)
2830
if err != nil {
2931
return time.Time{}, err
@@ -34,7 +36,9 @@ func getPatternsMinTime(dir string, patterns []string) (m time.Time, err error)
3436
}
3537
func getPatternsMaxTime(dir string, patterns []string) (m time.Time, err error) {
3638
for _, p := range patterns {
37-
p = filepath.Join(dir, p)
39+
if !filepath.IsAbs(p) {
40+
p = filepath.Join(dir, p)
41+
}
3842
mp, err := getPatternMaxTime(p)
3943
if err != nil {
4044
return time.Time{}, err

task_test.go

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package task_test
22

33
import (
44
"bytes"
5+
"fmt"
56
"io/ioutil"
67
"os"
78
"path/filepath"
@@ -149,6 +150,61 @@ func TestStatus(t *testing.T) {
149150
}
150151
}
151152

153+
func TestGenerates(t *testing.T) {
154+
var srcTask = "sub/src.txt"
155+
var relTask = "rel.txt"
156+
var absTask = "abs.txt"
157+
158+
// This test does not work with a relative dir.
159+
dir, err := filepath.Abs("testdata/generates")
160+
assert.NoError(t, err)
161+
var srcFile = filepath.Join(dir, srcTask)
162+
163+
for _, task := range []string{srcTask, relTask, absTask} {
164+
path := filepath.Join(dir, task)
165+
_ = os.Remove(path)
166+
if _, err := os.Stat(path); err == nil {
167+
t.Errorf("File should not exists: %v", err)
168+
}
169+
}
170+
171+
buff := bytes.NewBuffer(nil)
172+
e := &task.Executor{
173+
Dir: dir,
174+
Stdout: buff,
175+
Stderr: buff,
176+
}
177+
assert.NoError(t, e.ReadTaskfile())
178+
179+
for _, task := range []string{relTask, absTask} {
180+
var destFile = filepath.Join(dir, task)
181+
var upToDate = fmt.Sprintf("task: Task \"%s\" is up to date\n", srcTask) +
182+
fmt.Sprintf("task: Task \"%s\" is up to date\n", task)
183+
184+
// Run task for the first time.
185+
assert.NoError(t, e.Run(task))
186+
187+
if _, err := os.Stat(srcFile); err != nil {
188+
t.Errorf("File should exists: %v", err)
189+
}
190+
if _, err := os.Stat(destFile); err != nil {
191+
t.Errorf("File should exists: %v", err)
192+
}
193+
// Ensure task was not incorrectly found to be up-to-date on first run.
194+
if buff.String() == upToDate {
195+
t.Errorf("Wrong output message: %s", buff.String())
196+
}
197+
buff.Reset()
198+
199+
// Re-run task to ensure it's now found to be up-to-date.
200+
assert.NoError(t, e.Run(task))
201+
if buff.String() != upToDate {
202+
t.Errorf("Wrong output message: %s", buff.String())
203+
}
204+
buff.Reset()
205+
}
206+
}
207+
152208
func TestInit(t *testing.T) {
153209
const dir = "testdata/init"
154210
var file = filepath.Join(dir, "Taskfile.yml")

testdata/generates/.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
*.txt

testdata/generates/Taskfile.yml

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
abs.txt:
2+
desc: generates dest file based on absolute paths
3+
deps:
4+
- sub/src.txt
5+
dir: sub
6+
cmds:
7+
- cat src.txt > '{{.BUILD_DIR}}/abs.txt'
8+
sources:
9+
- src.txt
10+
generates:
11+
- "{{.BUILD_DIR}}/abs.txt"
12+
13+
rel.txt:
14+
desc: generates dest file based on relative paths
15+
deps:
16+
- sub/src.txt
17+
dir: sub
18+
cmds:
19+
- cat src.txt > '../rel.txt'
20+
sources:
21+
- src.txt
22+
generates:
23+
- "../rel.txt"
24+
25+
sub/src.txt:
26+
desc: generate source file
27+
cmds:
28+
- mkdir -p sub
29+
- echo "hello world" > sub/src.txt
30+
# Sleep to avoid time-stamp issue. Some filesystems, E.g. HFS+ for Mac OS,
31+
# only support one second precision on file timestamps.
32+
- sleep 1
33+
status:
34+
- test -f sub/src.txt

testdata/generates/Taskvars.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
BUILD_DIR: $pwd

0 commit comments

Comments
 (0)