fixblobs.go 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. package server
  2. import (
  3. "os"
  4. "path/filepath"
  5. "runtime"
  6. "strings"
  7. )
  8. // fixBlobs walks the provided dir and replaces (":") to ("-") in the file
  9. // prefix. (e.g. sha256:1234 -> sha256-1234)
  10. func fixBlobs(dir string) error {
  11. return filepath.Walk(dir, func(path string, info os.FileInfo, err error) error {
  12. if err != nil {
  13. return err
  14. }
  15. baseName := filepath.Base(path)
  16. typ, sha, ok := strings.Cut(baseName, ":")
  17. if ok && typ == "sha256" {
  18. newPath := filepath.Join(filepath.Dir(path), typ+"-"+sha)
  19. if err := os.Rename(path, newPath); err != nil {
  20. return err
  21. }
  22. }
  23. return nil
  24. })
  25. }
  26. // fixManifests walks the provided dir and replaces (":") to ("%") for all
  27. // manifest files on non-Windows systems.
  28. func fixManifests(dir string) error {
  29. if runtime.GOOS == "windows" {
  30. return nil
  31. }
  32. return filepath.Walk(dir, func(oldPath string, info os.FileInfo, err error) error {
  33. if err != nil {
  34. return err
  35. }
  36. if info.IsDir() {
  37. return nil
  38. }
  39. var partNum int
  40. newPath := []byte(oldPath)
  41. for i := len(newPath) - 1; i >= 0; i-- {
  42. if partNum > 3 {
  43. break
  44. }
  45. if partNum == 3 {
  46. if newPath[i] == ':' {
  47. newPath[i] = '%'
  48. break
  49. }
  50. continue
  51. }
  52. if newPath[i] == '/' {
  53. partNum++
  54. }
  55. }
  56. newDir, _ := filepath.Split(string(newPath))
  57. if err := os.MkdirAll(newDir, 0o755); err != nil {
  58. return err
  59. }
  60. return os.Rename(oldPath, string(newPath))
  61. })
  62. }