feat(cli): add copy folder

This commit is contained in:
DataHearth 2022-02-27 14:00:55 +01:00
parent 8f76c97acb
commit 0563a9dcad
4 changed files with 171 additions and 54 deletions

View File

@ -92,6 +92,12 @@ var saveCmd = &cobra.Command{
os.Exit(1)
}
}
if !viper.GetBool("disable-folders") {
if err := mapper.SaveFolders(config.Folders, config.Storage.Location); err != nil {
errLogger.Printf(pterm.Red(fmt.Sprintf("error while loading files: %v\n", err)))
os.Exit(1)
}
}
},
}

View File

@ -3,7 +3,6 @@ package mapper
import (
"errors"
"fmt"
"io"
"os"
"path"
"runtime"
@ -51,7 +50,7 @@ func LoadFiles(files []ItemLocation, location string) error {
p.UpdateTitle(fmt.Sprintf("copying %s", src))
if err := copy(src, dst); err != nil {
if err := copyFile(src, dst); err != nil {
pterm.Error.Println(fmt.Sprintf("failed to load file from \"%s\" to \"%s\": %v", src, dst, err))
haveErr = true
continue
@ -74,43 +73,31 @@ func SaveFiles(files []ItemLocation, location string) error {
p, _ := pterm.DefaultProgressbar.WithTotal(len(files)).Start()
for _, f := range files {
var src, dst string
var err error
p.UpdateTitle(fmt.Sprintf("copying %s", src))
switch runtime.GOOS {
case "linux":
dst, src, err = getPaths(f.Linux, location)
if err != nil {
pterm.Error.Println(fmt.Sprintf("failed to destination resolve path \"%s\": %v", f.Linux, err))
haveErr = true
continue
src, dst, err := configPaths(f, location)
if err != nil {
if err == ErrUnsupportedOS {
return err
}
case "darwin":
dst, src, err = getPaths(f.Darwin, location)
if err != nil {
pterm.Error.Println(fmt.Sprintf("failed to destination resolve path \"%s\": %v", f.Darwin, err))
haveErr = true
continue
}
default:
return ErrUnsupportedOS
pterm.Error.Println(fmt.Sprintf("failed to destination resolve path \"%s\": %v", f.Linux, err))
haveErr = true
continue
}
p.UpdateTitle(fmt.Sprintf("copying \"%s\"", src))
if err := os.MkdirAll(path.Dir(dst), 0755); err != nil {
pterm.Error.Printfln(fmt.Sprintf("failed to create directory architecture for destination path \"%s\": %v", dst, err))
haveErr = true
continue
}
if err := copy(src, dst); err != nil {
if err := copyFile(src, dst); err != nil {
pterm.Error.Println(fmt.Sprintf("failed to load file from \"%s\" to \"%s\": %v", src, dst, err))
haveErr = true
continue
}
pterm.Success.Println(fmt.Sprintf("%s copied", src))
pterm.Success.Println(fmt.Sprintf("\"%s\" copied", src))
p.Increment()
}
@ -121,32 +108,3 @@ func SaveFiles(files []ItemLocation, location string) error {
return nil
}
func copy(src, dst string) error {
s, err := os.Stat(src)
if err != nil {
return err
}
in, err := os.Open(src)
if err != nil {
return err
}
defer in.Close()
out, err := os.Create(dst)
if err != nil {
return err
}
defer out.Close()
if _, err := io.Copy(out, in); err != nil {
return err
}
if err := os.Chmod(dst, s.Mode()); err != nil {
return err
}
return nil
}

100
internal/folders.go Normal file
View File

@ -0,0 +1,100 @@
package mapper
import (
"errors"
"fmt"
"os"
"github.com/pterm/pterm"
)
var ErrFolderCopy = errors.New("failed to copy some folders")
func LoadFolders([]ItemLocation) error {
return nil
}
func SaveFolders(folders []ItemLocation, location string) error {
haveErr := false
pterm.DefaultSection.Println("Save folders into saved location")
p, _ := pterm.DefaultProgressbar.WithTotal(len(folders)).Start()
for _, f := range folders {
src, dst, err := configPaths(f, location)
if err != nil {
if err == ErrUnsupportedOS {
return err
}
pterm.Error.Println(fmt.Sprintf("failed to destination resolve path \"%s\": %v", f.Linux, err))
haveErr = true
continue
}
s, err := os.Stat(src)
if err != nil {
pterm.Error.Println(fmt.Sprintf("failed to check if source path is a folder \"%s\": %v", src, err))
haveErr = true
continue
}
if !s.IsDir() {
pterm.Error.Println(fmt.Sprintf("source path is a file \"%s\"", src))
haveErr = true
continue
}
p.UpdateTitle(fmt.Sprintf("copying folder \"%s\"", src))
if err := os.MkdirAll(dst, 0755); err != nil {
pterm.Error.Printfln(fmt.Sprintf("failed to create directory architecture for destination path \"%s\": %v", dst, err))
haveErr = true
continue
}
if err := copyFolder(src, dst); err != nil {
pterm.Error.Println(fmt.Sprintf("failed to save folder from \"%s\" to \"%s\": %v", src, dst, err))
haveErr = true
continue
}
pterm.Success.Println(fmt.Sprintf("\"%s\" copied", src))
p.Increment()
}
p.Stop()
if haveErr {
return ErrCopy
}
return nil
}
func copyFolder(src, dst string) error {
var haveErr bool
items, err := os.ReadDir(src)
if err != nil {
return err
}
for _, i := range items {
itemName := i.Name()
srcItem := fmt.Sprintf("%s/%s", src, itemName)
dstItem := fmt.Sprintf("%s/%s", dst, itemName)
if i.IsDir() {
os.Mkdir(dstItem, i.Type().Perm())
copyFolder(srcItem, dstItem)
continue
}
if err := copyFile(srcItem, dstItem); err != nil {
haveErr = true
continue
}
}
if haveErr {
return ErrFolderCopy
}
return nil
}

View File

@ -2,8 +2,10 @@ package mapper
import (
"fmt"
"io"
"os"
"path"
"runtime"
"strings"
)
@ -51,3 +53,54 @@ func getPaths(p string, l string) (string, string, error) {
return src, dst, nil
}
func copyFile(src, dst string) error {
s, err := os.Stat(src)
if err != nil {
return err
}
in, err := os.Open(src)
if err != nil {
return err
}
defer in.Close()
out, err := os.Create(dst)
if err != nil {
return err
}
defer out.Close()
if _, err := io.Copy(out, in); err != nil {
return err
}
if err := os.Chmod(dst, s.Mode()); err != nil {
return err
}
return nil
}
func configPaths(f ItemLocation, location string) (string, string, error) {
var src, dst string
var err error
switch runtime.GOOS {
case "linux":
dst, src, err = getPaths(f.Linux, location)
if err != nil {
return "", "", err
}
case "darwin":
dst, src, err = getPaths(f.Darwin, location)
if err != nil {
return "", "", err
}
default:
return "", "", ErrUnsupportedOS
}
return src, dst, nil
}