Skip to content

Commit

Permalink
pkg/archive: sort files
Browse files Browse the repository at this point in the history
sort changes found and exported.

Sorting the files before appending them to the tar archive
would mean a dependable ordering for types like hardlinks.

Also, combine sort logic used

Signed-off-by: Vincent Batts <[email protected]>
  • Loading branch information
vbatts committed Feb 6, 2015
1 parent abdfb21 commit 32d6d49
Show file tree
Hide file tree
Showing 3 changed files with 12 additions and 9 deletions.
2 changes: 1 addition & 1 deletion pkg/archive/archive.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
})
Expand Down
10 changes: 10 additions & 0 deletions pkg/archive/changes.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import (
"io"
"os"
"path/filepath"
"sort"
"strings"
"syscall"
"time"
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
9 changes: 1 addition & 8 deletions pkg/archive/changes_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 (
Expand Down Expand Up @@ -220,7 +213,7 @@ func TestChangesDirsMutated(t *testing.T) {
t.Fatal(err)
}

sort.Sort(byPath{changes})
sort.Sort(changesByPath(changes))

expectedChanges := []Change{
{"/dir1", ChangeDelete},
Expand Down

0 comments on commit 32d6d49

Please sign in to comment.