(files map[string][]byte)
| 8 | ) |
| 9 | |
| 10 | func CreateTarFromFiles(files map[string][]byte) ([]byte, error) { |
| 11 | buf := new(bytes.Buffer) |
| 12 | writer := tar.NewWriter(buf) |
| 13 | dirs := []string{} |
| 14 | for name, content := range files { |
| 15 | // We need to add directories before any files that use them. But, we only need to do this |
| 16 | // once. |
| 17 | dir := filepath.Dir(name) |
| 18 | if dir != "." && !slices.Contains(dirs, dir) { |
| 19 | dirs = append(dirs, dir) |
| 20 | err := writer.WriteHeader(&tar.Header{ |
| 21 | Name: dir, |
| 22 | Mode: 0o755, |
| 23 | Typeflag: tar.TypeDir, |
| 24 | }) |
| 25 | if err != nil { |
| 26 | return nil, err |
| 27 | } |
| 28 | } |
| 29 | |
| 30 | err := writer.WriteHeader(&tar.Header{ |
| 31 | Name: name, |
| 32 | Size: int64(len(content)), |
| 33 | Mode: 0o644, |
| 34 | }) |
| 35 | if err != nil { |
| 36 | return nil, err |
| 37 | } |
| 38 | |
| 39 | _, err = writer.Write(content) |
| 40 | if err != nil { |
| 41 | return nil, err |
| 42 | } |
| 43 | } |
| 44 | // `writer.Close()` function flushes the writer buffer, and adds extra padding to create a legal tarball. |
| 45 | err := writer.Close() |
| 46 | if err != nil { |
| 47 | return nil, err |
| 48 | } |
| 49 | return buf.Bytes(), nil |
| 50 | } |
no test coverage detected