github.com/rsampaio/docker@v0.7.2-0.20150827203920-fdc73cc3fc31/pkg/chrootarchive/diff_windows.go (about) 1 package chrootarchive 2 3 import ( 4 "fmt" 5 "io/ioutil" 6 "os" 7 "path/filepath" 8 "strings" 9 10 "github.com/docker/docker/pkg/archive" 11 ) 12 13 // applyLayerHandler parses a diff in the standard layer format from `layer`, and 14 // applies it to the directory `dest`. Returns the size in bytes of the 15 // contents of the layer. 16 func applyLayerHandler(dest string, layer archive.Reader, decompress bool) (size int64, err error) { 17 dest = filepath.Clean(dest) 18 19 // Ensure it is a Windows-style volume path 20 if !strings.HasPrefix(dest, `\\?\`) { 21 dest = `\\?\` + dest 22 } 23 24 if decompress { 25 decompressed, err := archive.DecompressStream(layer) 26 if err != nil { 27 return 0, err 28 } 29 defer decompressed.Close() 30 31 layer = decompressed 32 } 33 34 tmpDir, err := ioutil.TempDir(os.Getenv("temp"), "temp-docker-extract") 35 if err != nil { 36 return 0, fmt.Errorf("ApplyLayer failed to create temp-docker-extract under %s. %s", dest, err) 37 } 38 39 s, err := archive.UnpackLayer(dest, layer) 40 os.RemoveAll(tmpDir) 41 if err != nil { 42 return 0, fmt.Errorf("ApplyLayer %s failed UnpackLayer to %s", err, dest) 43 } 44 45 return s, nil 46 }