sort filesToAdd in TakeSnapshot
filesToAdd is sorted in TakeSnapshotFS, but not here. This makes ordering unpredictable within the layer's tarball, causing the SHA to differ even if layer contents haven't changed
This commit is contained in:
		
							parent
							
								
									f3b2c4064b
								
							
						
					
					
						commit
						cc2c9a0663
					
				|  | @ -79,6 +79,8 @@ func (s *Snapshotter) TakeSnapshot(files []string) (string, error) { | |||
| 	// Also add parent directories to keep the permission of them correctly.
 | ||||
| 	filesToAdd := filesWithParentDirs(files) | ||||
| 
 | ||||
| 	sort.Strings(filesToAdd) | ||||
| 
 | ||||
| 	// Add files to the layered map
 | ||||
| 	for _, file := range filesToAdd { | ||||
| 		if err := s.l.Add(file); err != nil { | ||||
|  |  | |||
|  | @ -302,6 +302,75 @@ func TestFileWithLinks(t *testing.T) { | |||
| 	} | ||||
| } | ||||
| 
 | ||||
| func TestSnasphotPreservesFileOrder(t *testing.T) { | ||||
| 	newFiles := map[string]string{ | ||||
| 		"foo":     "newbaz1", | ||||
| 		"bar/bat": "baz", | ||||
| 		"bar/qux": "quuz", | ||||
| 		"qux":     "quuz", | ||||
| 		"corge":   "grault", | ||||
| 		"garply":  "waldo", | ||||
| 		"fred":    "plugh", | ||||
| 		"xyzzy":   "thud", | ||||
| 	} | ||||
| 
 | ||||
| 	newFileNames := []string{} | ||||
| 
 | ||||
| 	for fileName := range newFiles { | ||||
| 		newFileNames = append(newFileNames, fileName) | ||||
| 	} | ||||
| 
 | ||||
| 	filesInTars := [][]string{} | ||||
| 
 | ||||
| 	for i := 0; i<= 2; i++ { | ||||
| 		testDir, snapshotter, cleanup, err := setUpTestDir() | ||||
| 		testDirWithoutLeadingSlash := strings.TrimLeft(testDir, "/") | ||||
| 		defer cleanup() | ||||
| 
 | ||||
| 		if err != nil { | ||||
| 			t.Fatal(err) | ||||
| 		} | ||||
| 		// Make some changes to the filesystem
 | ||||
| 		if err := testutil.SetupFiles(testDir, newFiles); err != nil { | ||||
| 			t.Fatalf("Error setting up fs: %s", err) | ||||
| 		} | ||||
| 
 | ||||
| 		filesToSnapshot := []string{} | ||||
| 		for _, file := range newFileNames { | ||||
| 			filesToSnapshot = append(filesToSnapshot, filepath.Join(testDir, file)) | ||||
| 		} | ||||
| 
 | ||||
| 		// Take a snapshot
 | ||||
| 		tarPath, err := snapshotter.TakeSnapshot(filesToSnapshot) | ||||
| 
 | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("Error taking snapshot of fs: %s", err) | ||||
| 		} | ||||
| 
 | ||||
| 		f, err := os.Open(tarPath) | ||||
| 		if err != nil { | ||||
| 			t.Fatal(err) | ||||
| 		} | ||||
| 		tr := tar.NewReader(f) | ||||
| 		filesInTars = append(filesInTars, []string{}) | ||||
| 		for { | ||||
| 			hdr, err := tr.Next() | ||||
| 			if err == io.EOF { | ||||
| 				break | ||||
| 			} | ||||
| 			if err != nil { | ||||
| 				t.Fatal(err) | ||||
| 			} | ||||
| 			filesInTars[i] = append(filesInTars[i], strings.TrimPrefix(hdr.Name, testDirWithoutLeadingSlash)) | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	// Check contents of all snapshots, make sure files appear in consistent order
 | ||||
| 	for i := 1; i<len(filesInTars); i++ { | ||||
| 		testutil.CheckErrorAndDeepEqual(t, false, nil, filesInTars[0], filesInTars[i]) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func setupSymlink(dir string, link string, target string) error { | ||||
| 	return os.Symlink(target, filepath.Join(dir, link)) | ||||
| } | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue