11 type TarWriter struct {
15 // NewTarWriter wraps given io.Writer into a new tar writer
16 func NewTarWriter(w io.Writer) (*TarWriter, error) {
18 TarW: tar.NewWriter(w),
22 func (w *TarWriter) writeDir(f Directory, fpath string) error {
23 if err := writeDirHeader(w.TarW, fpath); err != nil {
29 if err := w.WriteFile(it.Node(), path.Join(fpath, it.Name())); err != nil {
36 func (w *TarWriter) writeFile(f File, fpath string) error {
42 if err := writeFileHeader(w.TarW, fpath, uint64(size)); err != nil {
46 if _, err := io.Copy(w.TarW, f); err != nil {
53 // WriteNode adds a node to the archive.
54 func (w *TarWriter) WriteFile(nd Node, fpath string) error {
55 switch nd := nd.(type) {
57 return writeSymlinkHeader(w.TarW, nd.Target, fpath)
59 return w.writeFile(nd, fpath)
61 return w.writeDir(nd, fpath)
63 return fmt.Errorf("file type %T is not supported", nd)
67 // Close closes the tar writer.
68 func (w *TarWriter) Close() error {
72 func writeDirHeader(w *tar.Writer, fpath string) error {
73 return w.WriteHeader(&tar.Header{
75 Typeflag: tar.TypeDir,
78 // TODO: set mode, dates, etc. when added to unixFS
82 func writeFileHeader(w *tar.Writer, fpath string, size uint64) error {
83 return w.WriteHeader(&tar.Header{
86 Typeflag: tar.TypeReg,
89 // TODO: set mode, dates, etc. when added to unixFS
93 func writeSymlinkHeader(w *tar.Writer, target, fpath string) error {
94 return w.WriteHeader(&tar.Header{
98 Typeflag: tar.TypeSymlink,