Separate daemon/graphdriver/overlay/copy into its own package

Signed-off-by: Sargun Dhillon <sargun@sargun.me>
This commit is contained in:
Sargun Dhillon 2017-08-29 09:01:23 -07:00 committed by Sargun Dhillon
parent d891f2e3ca
commit 5298785b8e
2 changed files with 14 additions and 7 deletions

View File

@ -1,6 +1,6 @@
// +build linux
package overlay
package copy
import (
"fmt"
@ -15,10 +15,13 @@ import (
"golang.org/x/sys/unix"
)
type copyFlags int
type Mode int
const (
copyHardlink copyFlags = 1 << iota
// Content creates a new file, and copies the content of the file
Content Mode = iota
// Hardlink creates a new hardlink to the existing file
Hardlink
)
func copyRegular(srcPath, dstPath string, mode os.FileMode) error {
@ -52,7 +55,9 @@ func copyXattr(srcPath, dstPath, attr string) error {
return nil
}
func copyDir(srcDir, dstDir string, flags copyFlags) error {
// DirCopy copies or hardlinks the contents of one directory to another,
// properly handling xattrs, and soft links
func DirCopy(srcDir, dstDir string, copyMode Mode) error {
err := filepath.Walk(srcDir, func(srcPath string, f os.FileInfo, err error) error {
if err != nil {
return err
@ -78,12 +83,13 @@ func copyDir(srcDir, dstDir string, flags copyFlags) error {
switch f.Mode() & os.ModeType {
case 0: // Regular file
if flags&copyHardlink != 0 {
if copyMode == Hardlink {
isHardlink = true
if err := os.Link(srcPath, dstPath); err != nil {
return err
}
} else {
// Always fall back to Content copymode
if err := copyRegular(srcPath, dstPath, f.Mode()); err != nil {
return err
}

View File

@ -13,6 +13,7 @@ import (
"strconv"
"github.com/docker/docker/daemon/graphdriver"
"github.com/docker/docker/daemon/graphdriver/copy"
"github.com/docker/docker/daemon/graphdriver/overlayutils"
"github.com/docker/docker/pkg/archive"
"github.com/docker/docker/pkg/containerfs"
@ -327,7 +328,7 @@ func (d *Driver) Create(id, parent string, opts *graphdriver.CreateOpts) (retErr
return err
}
return copyDir(parentUpperDir, upperDir, 0)
return copy.DirCopy(parentUpperDir, upperDir, copy.Content)
}
func (d *Driver) dir(id string) string {
@ -443,7 +444,7 @@ func (d *Driver) ApplyDiff(id string, parent string, diff io.Reader) (size int64
}
}()
if err = copyDir(parentRootDir, tmpRootDir, copyHardlink); err != nil {
if err = copy.DirCopy(parentRootDir, tmpRootDir, copy.Hardlink); err != nil {
return 0, err
}