diff --git a/pkg/archive/archive.go b/pkg/archive/archive.go index 68e5c1d300..d9fcead3ef 100644 --- a/pkg/archive/archive.go +++ b/pkg/archive/archive.go @@ -458,7 +458,7 @@ func TarWithOptions(srcPath string, options *TarOptions) (io.ReadCloser, error) } if err := ta.addTarFile(filePath, relFilePath); err != nil { - log.Debugf("Can't add file %s to tar: %s", srcPath, err) + log.Debugf("Can't add file %s to tar: %s", filePath, err) } return nil }) diff --git a/pkg/archive/changes.go b/pkg/archive/changes.go index 85217f6e08..9f16b76f16 100644 --- a/pkg/archive/changes.go +++ b/pkg/archive/changes.go @@ -6,6 +6,7 @@ import ( "io" "os" "path/filepath" + "sort" "strings" "syscall" "time" @@ -43,6 +44,13 @@ func (change *Change) String() string { return fmt.Sprintf("%s %s", kind, change.Path) } +// for sort.Sort +type changesByPath []Change + +func (c changesByPath) Less(i, j int) bool { return c[i].Path < c[j].Path } +func (c changesByPath) Len() int { return len(c) } +func (c changesByPath) Swap(i, j int) { c[j], c[i] = c[i], c[j] } + // Gnu tar and the go tar writer don't have sub-second mtime // precision, which is problematic when we apply changes via tar // files, we handle this by comparing for exact times, *or* same @@ -373,6 +381,8 @@ func ExportChanges(dir string, changes []Change) (Archive, error) { // this buffer is needed for the duration of this piped stream defer pools.BufioWriter32KPool.Put(ta.Buffer) + sort.Sort(changesByPath(changes)) + // In general we log errors here but ignore them because // during e.g. a diff operation the container can continue // mutating the filesystem and we can see transient errors diff --git a/pkg/archive/changes_test.go b/pkg/archive/changes_test.go index 6b8f2354b8..8f32d7b30e 100644 --- a/pkg/archive/changes_test.go +++ b/pkg/archive/changes_test.go @@ -25,13 +25,6 @@ func copyDir(src, dst string) error { return nil } -// Helper to sort []Change by path -type byPath struct{ changes []Change } - -func (b byPath) Less(i, j int) bool { return b.changes[i].Path < b.changes[j].Path } -func (b byPath) Len() int { return len(b.changes) } -func (b byPath) Swap(i, j int) { b.changes[i], b.changes[j] = b.changes[j], b.changes[i] } - type FileType uint32 const ( @@ -220,7 +213,7 @@ func TestChangesDirsMutated(t *testing.T) { t.Fatal(err) } - sort.Sort(byPath{changes}) + sort.Sort(changesByPath(changes)) expectedChanges := []Change{ {"/dir1", ChangeDelete},