| package profiles |
|
|
| import ( |
| "fmt" |
| "io" |
| "io/fs" |
| "os" |
| "path/filepath" |
| ) |
|
|
| func copyDir(src, dst string) error { |
| return filepath.WalkDir(src, func(path string, d fs.DirEntry, err error) error { |
| if err != nil { |
| return err |
| } |
|
|
| rel, err := filepath.Rel(src, path) |
| if err != nil { |
| return err |
| } |
| target := filepath.Join(dst, rel) |
|
|
| if d.IsDir() { |
| info, err := d.Info() |
| if err != nil { |
| return err |
| } |
| return os.MkdirAll(target, info.Mode().Perm()) |
| } |
|
|
| return copyFile(path, target) |
| }) |
| } |
|
|
| func copyFile(src, dst string) error { |
| in, err := os.Open(src) |
| if err != nil { |
| return fmt.Errorf("open %s: %w", src, err) |
| } |
| defer func() { _ = in.Close() }() |
|
|
| info, err := in.Stat() |
| if err != nil { |
| return err |
| } |
|
|
| out, err := os.OpenFile(dst, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, info.Mode().Perm()) |
| if err != nil { |
| return fmt.Errorf("create %s: %w", dst, err) |
| } |
| defer func() { _ = out.Close() }() |
|
|
| if _, err := io.Copy(out, in); err != nil { |
| return fmt.Errorf("copy %s: %w", src, err) |
| } |
| return out.Close() |
| } |
|
|