WitNote / internal /profiles /copydir.go
AUXteam's picture
Upload folder using huggingface_hub
6a7089a verified
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) // #nosec G304 — src is validated by caller
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()
}