Use a smarter copy

This commit is contained in:
Ettore Di Giacinto
2019-11-23 19:13:32 +01:00
parent 3a7cfae9ae
commit a0d2f9cc12
3 changed files with 9 additions and 90 deletions

View File

@@ -16,11 +16,11 @@
package helpers
import (
"fmt"
"io"
"io/ioutil"
"os"
"path/filepath"
copy "github.com/otiai10/copy"
)
// Exists reports whether the named file or directory exists.
@@ -57,44 +57,7 @@ func ensureDir(fileName string) {
// of the source file. The file mode will be copied from the source and
// the copied data is synced/flushed to stable storage.
func CopyFile(src, dst string) (err error) {
in, err := os.Open(src)
if err != nil {
return
}
defer in.Close()
ensureDir(dst) // FIXME: Breaks permissions
out, err := os.Create(dst)
if err != nil {
return
}
defer func() {
if e := out.Close(); e != nil {
err = e
}
}()
_, err = io.Copy(out, in)
if err != nil {
return
}
err = out.Sync()
if err != nil {
return
}
si, err := os.Stat(src)
if err != nil {
return
}
err = os.Chmod(dst, si.Mode()) // FIXME: Needs owners copy as well.
if err != nil {
return
}
return
return copy.Copy(src, dst)
}
func IsDirectory(path string) (bool, error) {
@@ -111,54 +74,5 @@ func IsDirectory(path string) (bool, error) {
func CopyDir(src string, dst string) (err error) {
src = filepath.Clean(src)
dst = filepath.Clean(dst)
si, err := os.Stat(src)
if err != nil {
return err
}
if !si.IsDir() {
return fmt.Errorf("source is not a directory")
}
_, err = os.Stat(dst)
if err != nil && !os.IsNotExist(err) {
return
}
if err == nil {
// return fmt.Errorf("destination already exists")
}
err = os.MkdirAll(dst, si.Mode())
if err != nil {
return
}
entries, err := ioutil.ReadDir(src)
if err != nil {
return
}
for _, entry := range entries {
srcPath := filepath.Join(src, entry.Name())
dstPath := filepath.Join(dst, entry.Name())
if entry.IsDir() {
err = CopyDir(srcPath, dstPath)
if err != nil {
return
}
} else {
// Skip symlinks.
if entry.Mode()&os.ModeSymlink != 0 {
continue
}
err = CopyFile(srcPath, dstPath)
if err != nil {
return
}
}
}
return
return copy.Copy(src, dst)
}