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.
|
// Also add parent directories to keep the permission of them correctly.
|
||||||
filesToAdd := filesWithParentDirs(files)
|
filesToAdd := filesWithParentDirs(files)
|
||||||
|
|
||||||
|
sort.Strings(filesToAdd)
|
||||||
|
|
||||||
// Add files to the layered map
|
// Add files to the layered map
|
||||||
for _, file := range filesToAdd {
|
for _, file := range filesToAdd {
|
||||||
if err := s.l.Add(file); err != nil {
|
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 {
|
func setupSymlink(dir string, link string, target string) error {
|
||||||
return os.Symlink(target, filepath.Join(dir, link))
|
return os.Symlink(target, filepath.Join(dir, link))
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue