Browse Source

Fix ADD caching issue with . prefixed path

Docker-DCO-1.0-Signed-off-by: Guillaume J. Charmes <charmes.guillaume@gmail.com> (github: creack)
Guillaume J. Charmes 11 năm trước cách đây
mục cha
commit
811341423b
2 tập tin đã thay đổi với 68 bổ sung10 xóa
  1. 7 0
      buildfile.go
  2. 61 10
      integration/buildfile_test.go

+ 7 - 0
buildfile.go

@@ -412,6 +412,13 @@ func (b *buildFile) CmdAdd(args string) error {
 		} else if fi.IsDir() {
 		} else if fi.IsDir() {
 			var subfiles []string
 			var subfiles []string
 			for file, sum := range sums {
 			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) {
 				if strings.HasPrefix(file, origPath) {
 					subfiles = append(subfiles, sum)
 					subfiles = append(subfiles, sum)
 				}
 				}

+ 61 - 10
integration/buildfile_test.go

@@ -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)
 	eng := NewTestEngine(t)
 	defer nuke(mkRuntimeFromEngine(eng, t))
 	defer nuke(mkRuntimeFromEngine(eng, t))
 
 
@@ -436,20 +436,36 @@ func checkCacheBehavior(t *testing.T, template testContextTemplate, expectHit bo
 		t.Fatal(err)
 		t.Fatal(err)
 	}
 	}
 
 
-	imageId := img.ID
+	imageId = img.ID
 
 
-	img = nil
 	img, err = buildImage(template, t, eng, expectHit)
 	img, err = buildImage(template, t, eng, expectHit)
 	if err != nil {
 	if err != nil {
 		t.Fatal(err)
 		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) {
 func TestBuildImageWithCache(t *testing.T) {
@@ -476,11 +492,46 @@ func TestBuildADDLocalFileWithCache(t *testing.T) {
         maintainer dockerio
         maintainer dockerio
         run echo "first"
         run echo "first"
         add foo /usr/lib/bla/bar
         add foo /usr/lib/bla/bar
+	run [ "$(cat /usr/lib/bla/bar)" = "hello" ]
         run echo "second"
         run echo "second"
+	add . /src/
+	run [ "$(cat /src/foo)" = "hello" ]
         `,
         `,
-		[][2]string{{"foo", "hello"}},
+		[][2]string{
+			{"foo", "hello"},
+		},
 		nil}
 		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) {
 func TestBuildADDLocalFileWithoutCache(t *testing.T) {