dotcloud/docker

View on GitHub
pkg/archive/wrap.go

Summary

Maintainability
A
0 mins
Test Coverage
package archive // import "github.com/docker/docker/pkg/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
}