1
0
mirror of https://github.com/taigrr/arc synced 2025-01-18 04:33:13 -08:00
arc/archive/writer.go
2016-05-24 21:26:50 +09:00

64 lines
1.1 KiB
Go

// Copyright (C) 2016 - Will Glozer. All rights reserved.
package archive
import (
"archive/tar"
"errors"
"io"
"github.com/klauspost/compress/gzip"
)
var (
ErrShortCopy = errors.New("archive: short copy")
)
type Writer struct {
archiver *tar.Writer
compressor *gzip.Writer
archive *Archive
}
func NewWriter(w io.Writer, key []byte) (*Writer, error) {
archive, err := NewArchiveForWriter(w, key)
if err != nil {
return nil, err
}
compressor := gzip.NewWriter(archive)
archiver := tar.NewWriter(compressor)
return &Writer{
archiver: archiver,
compressor: compressor,
archive: archive,
}, nil
}
func (w *Writer) Add(header *tar.Header) error {
return w.archiver.WriteHeader(header)
}
func (w *Writer) Copy(r io.Reader, size int64) error {
switch n, err := io.Copy(w.archiver, r); {
case err != nil:
return err
case n < size:
return ErrShortCopy
}
return w.archiver.Flush()
}
func (w *Writer) Finish() ([]byte, error) {
if err := w.archiver.Close(); err != nil {
return nil, err
}
if err := w.compressor.Close(); err != nil {
return nil, err
}
return w.archive.Tag(nil), nil
}