|
@@ -7,8 +7,6 @@ import (
|
|
"encoding/hex"
|
|
"encoding/hex"
|
|
"hash"
|
|
"hash"
|
|
"io"
|
|
"io"
|
|
- "sort"
|
|
|
|
- "strconv"
|
|
|
|
"strings"
|
|
"strings"
|
|
|
|
|
|
"github.com/docker/docker/vendor/src/code.google.com/p/go/src/pkg/archive/tar"
|
|
"github.com/docker/docker/vendor/src/code.google.com/p/go/src/pkg/archive/tar"
|
|
@@ -29,18 +27,20 @@ const (
|
|
// including the byte payload of the image's json metadata as well, and for
|
|
// including the byte payload of the image's json metadata as well, and for
|
|
// calculating the checksums for buildcache.
|
|
// calculating the checksums for buildcache.
|
|
func NewTarSum(r io.Reader, dc bool, v Version) (TarSum, error) {
|
|
func NewTarSum(r io.Reader, dc bool, v Version) (TarSum, error) {
|
|
- if _, ok := tarSumVersions[v]; !ok {
|
|
|
|
- return nil, ErrVersionNotImplemented
|
|
|
|
|
|
+ headerSelector, err := getTarHeaderSelector(v)
|
|
|
|
+ if err != nil {
|
|
|
|
+ return nil, err
|
|
}
|
|
}
|
|
- return &tarSum{Reader: r, DisableCompression: dc, tarSumVersion: v}, nil
|
|
|
|
|
|
+ return &tarSum{Reader: r, DisableCompression: dc, tarSumVersion: v, headerSelector: headerSelector}, nil
|
|
}
|
|
}
|
|
|
|
|
|
// Create a new TarSum, providing a THash to use rather than the DefaultTHash
|
|
// Create a new TarSum, providing a THash to use rather than the DefaultTHash
|
|
func NewTarSumHash(r io.Reader, dc bool, v Version, tHash THash) (TarSum, error) {
|
|
func NewTarSumHash(r io.Reader, dc bool, v Version, tHash THash) (TarSum, error) {
|
|
- if _, ok := tarSumVersions[v]; !ok {
|
|
|
|
- return nil, ErrVersionNotImplemented
|
|
|
|
|
|
+ headerSelector, err := getTarHeaderSelector(v)
|
|
|
|
+ if err != nil {
|
|
|
|
+ return nil, err
|
|
}
|
|
}
|
|
- return &tarSum{Reader: r, DisableCompression: dc, tarSumVersion: v, tHash: tHash}, nil
|
|
|
|
|
|
+ return &tarSum{Reader: r, DisableCompression: dc, tarSumVersion: v, headerSelector: headerSelector, tHash: tHash}, nil
|
|
}
|
|
}
|
|
|
|
|
|
// TarSum is the generic interface for calculating fixed time
|
|
// TarSum is the generic interface for calculating fixed time
|
|
@@ -69,8 +69,9 @@ type tarSum struct {
|
|
currentFile string
|
|
currentFile string
|
|
finished bool
|
|
finished bool
|
|
first bool
|
|
first bool
|
|
- DisableCompression bool // false by default. When false, the output gzip compressed.
|
|
|
|
- tarSumVersion Version // this field is not exported so it can not be mutated during use
|
|
|
|
|
|
+ DisableCompression bool // false by default. When false, the output gzip compressed.
|
|
|
|
+ tarSumVersion Version // this field is not exported so it can not be mutated during use
|
|
|
|
+ headerSelector tarHeaderSelector // handles selecting and ordering headers for files in the archive
|
|
}
|
|
}
|
|
|
|
|
|
func (ts tarSum) Hash() THash {
|
|
func (ts tarSum) Hash() THash {
|
|
@@ -103,49 +104,12 @@ type simpleTHash struct {
|
|
func (sth simpleTHash) Name() string { return sth.n }
|
|
func (sth simpleTHash) Name() string { return sth.n }
|
|
func (sth simpleTHash) Hash() hash.Hash { return sth.h() }
|
|
func (sth simpleTHash) Hash() hash.Hash { return sth.h() }
|
|
|
|
|
|
-func (ts tarSum) selectHeaders(h *tar.Header, v Version) (set [][2]string) {
|
|
|
|
- for _, elem := range [][2]string{
|
|
|
|
- {"name", h.Name},
|
|
|
|
- {"mode", strconv.Itoa(int(h.Mode))},
|
|
|
|
- {"uid", strconv.Itoa(h.Uid)},
|
|
|
|
- {"gid", strconv.Itoa(h.Gid)},
|
|
|
|
- {"size", strconv.Itoa(int(h.Size))},
|
|
|
|
- {"mtime", strconv.Itoa(int(h.ModTime.UTC().Unix()))},
|
|
|
|
- {"typeflag", string([]byte{h.Typeflag})},
|
|
|
|
- {"linkname", h.Linkname},
|
|
|
|
- {"uname", h.Uname},
|
|
|
|
- {"gname", h.Gname},
|
|
|
|
- {"devmajor", strconv.Itoa(int(h.Devmajor))},
|
|
|
|
- {"devminor", strconv.Itoa(int(h.Devminor))},
|
|
|
|
- } {
|
|
|
|
- if v >= VersionDev && elem[0] == "mtime" {
|
|
|
|
- continue
|
|
|
|
- }
|
|
|
|
- set = append(set, elem)
|
|
|
|
- }
|
|
|
|
- return
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
func (ts *tarSum) encodeHeader(h *tar.Header) error {
|
|
func (ts *tarSum) encodeHeader(h *tar.Header) error {
|
|
- for _, elem := range ts.selectHeaders(h, ts.Version()) {
|
|
|
|
|
|
+ for _, elem := range ts.headerSelector.selectHeaders(h) {
|
|
if _, err := ts.h.Write([]byte(elem[0] + elem[1])); err != nil {
|
|
if _, err := ts.h.Write([]byte(elem[0] + elem[1])); err != nil {
|
|
return err
|
|
return err
|
|
}
|
|
}
|
|
}
|
|
}
|
|
-
|
|
|
|
- // include the additional pax headers, from an ordered list
|
|
|
|
- if ts.Version() >= VersionDev {
|
|
|
|
- var keys []string
|
|
|
|
- for k := range h.Xattrs {
|
|
|
|
- keys = append(keys, k)
|
|
|
|
- }
|
|
|
|
- sort.Strings(keys)
|
|
|
|
- for _, k := range keys {
|
|
|
|
- if _, err := ts.h.Write([]byte(k + h.Xattrs[k])); err != nil {
|
|
|
|
- return err
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
return nil
|
|
return nil
|
|
}
|
|
}
|
|
|
|
|