portainer/portainer

View on GitHub
api/archive/tar.go

Summary

Maintainability
A
0 mins
Test Coverage
package archive

import (
    "archive/tar"
    "bytes"
)

// TarFileInBuffer will create a tar archive containing a single file named via fileName and using the content
// specified in fileContent. Returns the archive as a byte array.
func TarFileInBuffer(fileContent []byte, fileName string, mode int64) ([]byte, error) {
    var buffer bytes.Buffer
    tarWriter := tar.NewWriter(&buffer)

    header := &tar.Header{
        Name: fileName,
        Mode: mode,
        Size: int64(len(fileContent)),
    }

    err := tarWriter.WriteHeader(header)
    if err != nil {
        return nil, err
    }

    _, err = tarWriter.Write(fileContent)
    if err != nil {
        return nil, err
    }

    err = tarWriter.Close()
    if err != nil {
        return nil, err
    }

    return buffer.Bytes(), nil
}

// tarFileInBuffer represents a tar archive buffer.
type tarFileInBuffer struct {
    b *bytes.Buffer
    w *tar.Writer
}

func NewTarFileInBuffer() *tarFileInBuffer {
    var b bytes.Buffer
    return &tarFileInBuffer{
        b: &b,
        w: tar.NewWriter(&b),
    }
}

// Put puts a single file to tar archive buffer.
func (t *tarFileInBuffer) Put(fileContent []byte, fileName string, mode int64) error {
    hdr := &tar.Header{
        Name: fileName,
        Mode: mode,
        Size: int64(len(fileContent)),
    }

    if err := t.w.WriteHeader(hdr); err != nil {
        return err
    }

    if _, err := t.w.Write(fileContent); err != nil {
        return err
    }

    return nil
}

// Bytes returns the archive as a byte array.
func (t *tarFileInBuffer) Bytes() []byte {
    return t.b.Bytes()
}

func (t *tarFileInBuffer) Close() error {
    return t.w.Close()
}