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  }