| package vendor | 
 |  | 
 | import ( | 
 | 	"fmt" | 
 | 	"io" | 
 | 	"os" | 
 | 	"path/filepath" | 
 | 	"strings" | 
 |  | 
 | 	"github.com/constabulary/gb/fileutils" | 
 | ) | 
 |  | 
 | const debugCopypath = true | 
 | const debugCopyfile = false | 
 |  | 
 | // Copypath copies the contents of src to dst, excluding any file or | 
 | // directory that starts with a period. | 
 | func Copypath(dst string, src string) error { | 
 | 	err := filepath.Walk(src, func(path string, info os.FileInfo, err error) error { | 
 | 		if err != nil { | 
 | 			return err | 
 | 		} | 
 |  | 
 | 		if strings.HasPrefix(filepath.Base(path), ".") { | 
 | 			if info.IsDir() { | 
 | 				return filepath.SkipDir | 
 | 			} | 
 | 			return nil | 
 | 		} | 
 |  | 
 | 		if info.IsDir() { | 
 | 			return nil | 
 | 		} | 
 |  | 
 | 		if info.Mode()&os.ModeSymlink != 0 { | 
 | 			if debugCopypath { | 
 | 				fmt.Printf("skipping symlink: %v\n", path) | 
 | 			} | 
 | 			return nil | 
 | 		} | 
 |  | 
 | 		dst := filepath.Join(dst, path[len(src):]) | 
 | 		return copyfile(dst, path) | 
 | 	}) | 
 | 	if err != nil { | 
 | 		// if there was an error during copying, remove the partial copy. | 
 | 		fileutils.RemoveAll(dst) | 
 | 	} | 
 | 	return err | 
 | } | 
 |  | 
 | func copyfile(dst, src string) error { | 
 | 	err := mkdir(filepath.Dir(dst)) | 
 | 	if err != nil { | 
 | 		return fmt.Errorf("copyfile: mkdirall: %v", err) | 
 | 	} | 
 | 	r, err := os.Open(src) | 
 | 	if err != nil { | 
 | 		return fmt.Errorf("copyfile: open(%q): %v", src, err) | 
 | 	} | 
 | 	defer r.Close() | 
 | 	w, err := os.Create(dst) | 
 | 	if err != nil { | 
 | 		return fmt.Errorf("copyfile: create(%q): %v", dst, err) | 
 | 	} | 
 | 	defer w.Close() | 
 | 	if debugCopyfile { | 
 | 		fmt.Printf("copyfile(dst: %v, src: %v)\n", dst, src) | 
 | 	} | 
 | 	_, err = io.Copy(w, r) | 
 | 	return err | 
 | } |