utils.go 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. package hubtest
  2. import (
  3. "fmt"
  4. "os"
  5. "path/filepath"
  6. "sort"
  7. )
  8. func sortedMapKeys[V any](m map[string]V) []string {
  9. keys := make([]string, 0, len(m))
  10. for k := range m {
  11. keys = append(keys, k)
  12. }
  13. sort.Strings(keys)
  14. return keys
  15. }
  16. func Copy(src string, dst string) error {
  17. content, err := os.ReadFile(src)
  18. if err != nil {
  19. return err
  20. }
  21. err = os.WriteFile(dst, content, 0o644)
  22. if err != nil {
  23. return err
  24. }
  25. return nil
  26. }
  27. // checkPathNotContained returns an error if 'subpath' is inside 'path'
  28. func checkPathNotContained(path string, subpath string) error {
  29. absPath, err := filepath.Abs(path)
  30. if err != nil {
  31. return err
  32. }
  33. absSubPath, err := filepath.Abs(subpath)
  34. if err != nil {
  35. return err
  36. }
  37. current := absSubPath
  38. for {
  39. if current == absPath {
  40. return fmt.Errorf("cannot copy a folder onto itself")
  41. }
  42. up := filepath.Dir(current)
  43. if current == up {
  44. break
  45. }
  46. current = up
  47. }
  48. return nil
  49. }
  50. func CopyDir(src string, dest string) error {
  51. err := checkPathNotContained(src, dest)
  52. if err != nil {
  53. return err
  54. }
  55. f, err := os.Open(src)
  56. if err != nil {
  57. return err
  58. }
  59. file, err := f.Stat()
  60. if err != nil {
  61. return err
  62. }
  63. if !file.IsDir() {
  64. return fmt.Errorf("Source " + file.Name() + " is not a directory!")
  65. }
  66. err = os.MkdirAll(dest, 0755)
  67. if err != nil {
  68. return err
  69. }
  70. files, err := os.ReadDir(src)
  71. if err != nil {
  72. return err
  73. }
  74. for _, f := range files {
  75. if f.IsDir() {
  76. if err = CopyDir(filepath.Join(src, f.Name()), filepath.Join(dest, f.Name())); err != nil {
  77. return err
  78. }
  79. } else {
  80. if err = Copy(filepath.Join(src, f.Name()), filepath.Join(dest, f.Name())); err != nil {
  81. return err
  82. }
  83. }
  84. }
  85. return nil
  86. }