mirror of
https://github.com/taigrr/wtf
synced 2025-01-18 04:03:14 -08:00
76 lines
1.2 KiB
Go
76 lines
1.2 KiB
Go
// Copied verbatim from:
|
|
//
|
|
// https://github.com/otiai10/copy/blob/master/copy.go
|
|
|
|
package cfg
|
|
|
|
import (
|
|
"io"
|
|
"io/ioutil"
|
|
"os"
|
|
"path/filepath"
|
|
)
|
|
|
|
// Copy copies src to dest, doesn't matter if src is a directory or a file
|
|
func Copy(src, dest string) error {
|
|
info, err := os.Stat(src)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return copy(src, dest, info)
|
|
}
|
|
|
|
// "info" must be given here, NOT nil.
|
|
func copy(src, dest string, info os.FileInfo) error {
|
|
if info.IsDir() {
|
|
return dcopy(src, dest, info)
|
|
}
|
|
return fcopy(src, dest, info)
|
|
}
|
|
|
|
func fcopy(src, dest string, info os.FileInfo) error {
|
|
|
|
f, err := os.Create(dest)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer func() { _ = f.Close() }()
|
|
|
|
if err = os.Chmod(f.Name(), info.Mode()); err != nil {
|
|
return err
|
|
}
|
|
|
|
s, err := os.Open(src)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer func() { _ = f.Close() }()
|
|
|
|
_, err = io.Copy(f, s)
|
|
return err
|
|
}
|
|
|
|
func dcopy(src, dest string, info os.FileInfo) error {
|
|
|
|
if err := os.MkdirAll(dest, info.Mode()); err != nil {
|
|
return err
|
|
}
|
|
|
|
infos, err := ioutil.ReadDir(src)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
for _, info := range infos {
|
|
if err := copy(
|
|
filepath.Join(src, info.Name()),
|
|
filepath.Join(dest, info.Name()),
|
|
info,
|
|
); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|