mirror of
https://github.com/moby/moby.git
synced 2022-11-09 12:21:53 -05:00
Separate daemon/graphdriver/overlay/copy into its own package
Signed-off-by: Sargun Dhillon <sargun@sargun.me>
This commit is contained in:
parent
d891f2e3ca
commit
5298785b8e
2 changed files with 14 additions and 7 deletions
|
@ -1,6 +1,6 @@
|
||||||
// +build linux
|
// +build linux
|
||||||
|
|
||||||
package overlay
|
package copy
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
@ -15,10 +15,13 @@ import (
|
||||||
"golang.org/x/sys/unix"
|
"golang.org/x/sys/unix"
|
||||||
)
|
)
|
||||||
|
|
||||||
type copyFlags int
|
type Mode int
|
||||||
|
|
||||||
const (
|
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 {
|
func copyRegular(srcPath, dstPath string, mode os.FileMode) error {
|
||||||
|
@ -52,7 +55,9 @@ func copyXattr(srcPath, dstPath, attr string) error {
|
||||||
return nil
|
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 {
|
err := filepath.Walk(srcDir, func(srcPath string, f os.FileInfo, err error) error {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
@ -78,12 +83,13 @@ func copyDir(srcDir, dstDir string, flags copyFlags) error {
|
||||||
|
|
||||||
switch f.Mode() & os.ModeType {
|
switch f.Mode() & os.ModeType {
|
||||||
case 0: // Regular file
|
case 0: // Regular file
|
||||||
if flags©Hardlink != 0 {
|
if copyMode == Hardlink {
|
||||||
isHardlink = true
|
isHardlink = true
|
||||||
if err := os.Link(srcPath, dstPath); err != nil {
|
if err := os.Link(srcPath, dstPath); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
// Always fall back to Content copymode
|
||||||
if err := copyRegular(srcPath, dstPath, f.Mode()); err != nil {
|
if err := copyRegular(srcPath, dstPath, f.Mode()); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
|
@ -13,6 +13,7 @@ import (
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
"github.com/docker/docker/daemon/graphdriver"
|
"github.com/docker/docker/daemon/graphdriver"
|
||||||
|
"github.com/docker/docker/daemon/graphdriver/copy"
|
||||||
"github.com/docker/docker/daemon/graphdriver/overlayutils"
|
"github.com/docker/docker/daemon/graphdriver/overlayutils"
|
||||||
"github.com/docker/docker/pkg/archive"
|
"github.com/docker/docker/pkg/archive"
|
||||||
"github.com/docker/docker/pkg/containerfs"
|
"github.com/docker/docker/pkg/containerfs"
|
||||||
|
@ -327,7 +328,7 @@ func (d *Driver) Create(id, parent string, opts *graphdriver.CreateOpts) (retErr
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
return copyDir(parentUpperDir, upperDir, 0)
|
return copy.DirCopy(parentUpperDir, upperDir, copy.Content)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *Driver) dir(id string) string {
|
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
|
return 0, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue