Skip to content

Commit

Permalink
Fix ADD caching issue with . prefixed path
Browse files Browse the repository at this point in the history
Docker-DCO-1.0-Signed-off-by: Guillaume J. Charmes <charmes.guillaume@gmail.com> (github: creack)
  • Loading branch information
Guillaume J. Charmes authored and creack committed Jan 8, 2014
1 parent a86a82c commit 8113414
Show file tree
Hide file tree
Showing 2 changed files with 68 additions and 10 deletions.
7 changes: 7 additions & 0 deletions buildfile.go
Original file line number Diff line number Diff line change
Expand Up @@ -412,6 +412,13 @@ func (b *buildFile) CmdAdd(args string) error {
} else if fi.IsDir() {
var subfiles []string
for file, sum := range sums {
// Has tarsum stips the '.' and './', we put it back for comparaison.
if len(file) == 0 {
file = "./"
}
if file[0] != '.' && file[0] != '/' {
file = "./" + file
}
if strings.HasPrefix(file, origPath) {
subfiles = append(subfiles, sum)
}
Expand Down
71 changes: 61 additions & 10 deletions integration/buildfile_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -427,7 +427,7 @@ func TestBuildEntrypointRunCleanup(t *testing.T) {
}
}

func checkCacheBehavior(t *testing.T, template testContextTemplate, expectHit bool) {
func checkCacheBehavior(t *testing.T, template testContextTemplate, expectHit bool) (imageId string) {
eng := NewTestEngine(t)
defer nuke(mkRuntimeFromEngine(eng, t))

Expand All @@ -436,20 +436,36 @@ func checkCacheBehavior(t *testing.T, template testContextTemplate, expectHit bo
t.Fatal(err)
}

imageId := img.ID
imageId = img.ID

img = nil
img, err = buildImage(template, t, eng, expectHit)
if err != nil {
t.Fatal(err)
}

hit := imageId == img.ID
if hit != expectHit {
t.Logf("Cache misbehavior, got hit=%t, expected hit=%t: (first: %s, second %s)",
hit, expectHit, imageId, img.ID)
t.Fail()
if hit := imageId == img.ID; hit != expectHit {
t.Fatalf("Cache misbehavior, got hit=%t, expected hit=%t: (first: %s, second %s)", hit, expectHit, imageId, img.ID)
}
return
}

func checkCacheBehaviorFromEngime(t *testing.T, template testContextTemplate, expectHit bool, eng *engine.Engine) (imageId string) {
img, err := buildImage(template, t, eng, true)
if err != nil {
t.Fatal(err)
}

imageId = img.ID

img, err = buildImage(template, t, eng, expectHit)
if err != nil {
t.Fatal(err)
}

if hit := imageId == img.ID; hit != expectHit {
t.Fatalf("Cache misbehavior, got hit=%t, expected hit=%t: (first: %s, second %s)", hit, expectHit, imageId, img.ID)
}
return
}

func TestBuildImageWithCache(t *testing.T) {
Expand All @@ -476,11 +492,46 @@ func TestBuildADDLocalFileWithCache(t *testing.T) {
maintainer dockerio
run echo "first"
add foo /usr/lib/bla/bar
run [ "$(cat /usr/lib/bla/bar)" = "hello" ]
run echo "second"
add . /src/
run [ "$(cat /src/foo)" = "hello" ]
`,
[][2]string{{"foo", "hello"}},
[][2]string{
{"foo", "hello"},
},
nil}
checkCacheBehavior(t, template, true)
eng := NewTestEngine(t)
defer nuke(mkRuntimeFromEngine(eng, t))

id1 := checkCacheBehaviorFromEngime(t, template, true, eng)
template.files = append(template.files, [2]string{"bar", "hello2"})
id2 := checkCacheBehaviorFromEngime(t, template, true, eng)
if id1 == id2 {
t.Fatal("The cache should have been invalided but hasn't.")
}
id3 := checkCacheBehaviorFromEngime(t, template, true, eng)
if id2 != id3 {
t.Fatal("The cache should have been used but hasn't.")
}
template.files[1][1] = "hello3"
id4 := checkCacheBehaviorFromEngime(t, template, true, eng)
if id3 == id4 {
t.Fatal("The cache should have been invalided but hasn't.")
}
template.dockerfile += `
add ./bar /src2/
run ls /src2/bar
`
id5 := checkCacheBehaviorFromEngime(t, template, true, eng)
if id4 == id5 {
t.Fatal("The cache should have been invalided but hasn't.")
}
template.files[1][1] = "hello4"
id6 := checkCacheBehaviorFromEngime(t, template, true, eng)
if id5 == id6 {
t.Fatal("The cache should have been invalided but hasn't.")
}
}

func TestBuildADDLocalFileWithoutCache(t *testing.T) {
Expand Down

0 comments on commit 8113414

Please sign in to comment.