MCPcopy
hub / github.com/hashicorp/go-getter / copyDir

Function copyDir

copy_dir.go:14–68  ·  view source on GitHub ↗

copyDir copies the src directory contents into dst. Both directories should already exist. If ignoreDot is set to true, then dot-prefixed files/folders are ignored.

(ctx context.Context, dst string, src string, ignoreDot bool, disableSymlinks bool, umask os.FileMode)

Source from the content-addressed store, hash-verified

12//
13// If ignoreDot is set to true, then dot-prefixed files/folders are ignored.
14func copyDir(ctx context.Context, dst string, src string, ignoreDot bool, disableSymlinks bool, umask os.FileMode) error {
15 src, err := filepath.EvalSymlinks(src)
16 if err != nil {
17 return err
18 }
19
20 walkFn := func(path string, info os.FileInfo, err error) error {
21 if err != nil {
22 return err
23 }
24 if path == src {
25 return nil
26 }
27
28 if ignoreDot && strings.HasPrefix(filepath.Base(path), ".") {
29 // Skip any dot files
30 if info.IsDir() {
31 return filepath.SkipDir
32 } else {
33 return nil
34 }
35 }
36
37 if disableSymlinks {
38 if info.Mode()&os.ModeSymlink == os.ModeSymlink {
39 return ErrSymlinkCopy
40 }
41 }
42
43 // The "path" has the src prefixed to it. We need to join our
44 // destination with the path without the src on it.
45 dstPath := filepath.Join(dst, path[len(src):])
46
47 // If we have a directory, make that subdirectory, then continue
48 // the walk.
49 if info.IsDir() {
50 if path == filepath.Join(src, dst) {
51 // dst is in src; don't walk it.
52 return nil
53 }
54
55 if err := os.MkdirAll(dstPath, mode(0755, umask)); err != nil {
56 return err
57 }
58
59 return nil
60 }
61
62 // If we have a file, copy the contents.
63 _, err = copyFile(ctx, dstPath, path, disableSymlinks, info.Mode(), umask)
64 return err
65 }
66
67 return filepath.Walk(src, walkFn)
68}

Callers 2

getMethod · 0.85
getSubdirMethod · 0.85

Calls 3

modeFunction · 0.85
copyFileFunction · 0.85
ModeMethod · 0.65

Tested by

no test coverage detected