| 50 | var uploads = map[string]*s3Path{} |
| 51 | |
| 52 | func zipPath(root string) (string, error) { |
| 53 | tmpFile, err := os.CreateTemp(os.TempDir(), "*.zip") |
| 54 | if err != nil { |
| 55 | return "", err |
| 56 | } |
| 57 | defer tmpFile.Close() |
| 58 | |
| 59 | w := zip.NewWriter(tmpFile) |
| 60 | defer w.Close() |
| 61 | |
| 62 | zRoot := root |
| 63 | info, err := os.Stat(zRoot) |
| 64 | if err != nil { |
| 65 | return "", err |
| 66 | } |
| 67 | if !info.IsDir() { |
| 68 | zRoot = filepath.Dir(zRoot) |
| 69 | } |
| 70 | |
| 71 | err = filepath.Walk(root, func(path string, info fs.FileInfo, err error) error { |
| 72 | if err != nil { |
| 73 | return err |
| 74 | } |
| 75 | |
| 76 | if !info.Mode().IsRegular() { |
| 77 | return nil |
| 78 | } |
| 79 | |
| 80 | in, err := os.Open(path) |
| 81 | if err != nil { |
| 82 | return err |
| 83 | } |
| 84 | defer in.Close() |
| 85 | |
| 86 | zPath, err := filepath.Rel(zRoot, path) |
| 87 | if err != nil { |
| 88 | return err |
| 89 | } |
| 90 | |
| 91 | zPath = filepath.ToSlash(zPath) |
| 92 | |
| 93 | fh, err := zip.FileInfoHeader(info) |
| 94 | if err != nil { |
| 95 | return err |
| 96 | } |
| 97 | |
| 98 | fh.Name = zPath |
| 99 | fh.Method = zip.Deflate |
| 100 | |
| 101 | out, err := w.CreateHeader(fh) |
| 102 | if err != nil { |
| 103 | return err |
| 104 | } |
| 105 | |
| 106 | _, err = io.Copy(out, in) |
| 107 | return err |
| 108 | }) |
| 109 | |