github.com/shvar/terraform@v0.6.9-0.20151215234924-3365cd2231df/config/module/copy_dir.go (about) 1 package module 2 3 import ( 4 "io" 5 "os" 6 "path/filepath" 7 "strings" 8 ) 9 10 // copyDir copies the src directory contents into dst. Both directories 11 // should already exist. 12 func copyDir(dst, src string) error { 13 src, err := filepath.EvalSymlinks(src) 14 if err != nil { 15 return err 16 } 17 18 walkFn := func(path string, info os.FileInfo, err error) error { 19 if err != nil { 20 return err 21 } 22 if path == src { 23 return nil 24 } 25 26 if strings.HasPrefix(filepath.Base(path), ".") { 27 // Skip any dot files 28 if info.IsDir() { 29 return filepath.SkipDir 30 } else { 31 return nil 32 } 33 } 34 35 // The "path" has the src prefixed to it. We need to join our 36 // destination with the path without the src on it. 37 dstPath := filepath.Join(dst, path[len(src):]) 38 39 // If we have a directory, make that subdirectory, then continue 40 // the walk. 41 if info.IsDir() { 42 if path == filepath.Join(src, dst) { 43 // dst is in src; don't walk it. 44 return nil 45 } 46 47 if err := os.MkdirAll(dstPath, 0755); err != nil { 48 return err 49 } 50 51 return nil 52 } 53 54 // If we have a file, copy the contents. 55 srcF, err := os.Open(path) 56 if err != nil { 57 return err 58 } 59 defer srcF.Close() 60 61 dstF, err := os.Create(dstPath) 62 if err != nil { 63 return err 64 } 65 defer dstF.Close() 66 67 if _, err := io.Copy(dstF, srcF); err != nil { 68 return err 69 } 70 71 // Chmod it 72 return os.Chmod(dstPath, info.Mode()) 73 } 74 75 return filepath.Walk(src, walkFn) 76 }