1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 |
- package archive
- import (
- "archive/tar"
- "bytes"
- "io"
- )
- // Generate generates a new archive from the content provided
- // as input.
- //
- // `files` is a sequence of path/content pairs. A new file is
- // added to the archive for each pair.
- // If the last pair is incomplete, the file is created with an
- // empty content. For example:
- //
- // Generate("foo.txt", "hello world", "emptyfile")
- //
- // The above call will return an archive with 2 files:
- // * ./foo.txt with content "hello world"
- // * ./empty with empty content
- //
- // FIXME: stream content instead of buffering
- // FIXME: specify permissions and other archive metadata
- func Generate(input ...string) (io.Reader, error) {
- files := parseStringPairs(input...)
- buf := new(bytes.Buffer)
- tw := tar.NewWriter(buf)
- for _, file := range files {
- name, content := file[0], file[1]
- hdr := &tar.Header{
- Name: name,
- Size: int64(len(content)),
- }
- if err := tw.WriteHeader(hdr); err != nil {
- return nil, err
- }
- if _, err := tw.Write([]byte(content)); err != nil {
- return nil, err
- }
- }
- if err := tw.Close(); err != nil {
- return nil, err
- }
- return buf, nil
- }
- func parseStringPairs(input ...string) (output [][2]string) {
- output = make([][2]string, 0, len(input)/2+1)
- for i := 0; i < len(input); i += 2 {
- var pair [2]string
- pair[0] = input[i]
- if i+1 < len(input) {
- pair[1] = input[i+1]
- }
- output = append(output, pair)
- }
- return
- }
|