mirror of https://github.com/portainer/portainer
				
				
				
			
		
			
				
	
	
		
			79 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Go
		
	
	
			
		
		
	
	
			79 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Go
		
	
	
| 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()
 | |
| }
 |