OSDN Git Service

add package
[bytom/vapor.git] / vendor / github.com / ipfs / go-ipfs-files / tarwriter.go
1 package files
2
3 import (
4         "archive/tar"
5         "fmt"
6         "io"
7         "path"
8         "time"
9 )
10
11 type TarWriter struct {
12         TarW *tar.Writer
13 }
14
15 // NewTarWriter wraps given io.Writer into a new tar writer
16 func NewTarWriter(w io.Writer) (*TarWriter, error) {
17         return &TarWriter{
18                 TarW: tar.NewWriter(w),
19         }, nil
20 }
21
22 func (w *TarWriter) writeDir(f Directory, fpath string) error {
23         if err := writeDirHeader(w.TarW, fpath); err != nil {
24                 return err
25         }
26
27         it := f.Entries()
28         for it.Next() {
29                 if err := w.WriteFile(it.Node(), path.Join(fpath, it.Name())); err != nil {
30                         return err
31                 }
32         }
33         return it.Err()
34 }
35
36 func (w *TarWriter) writeFile(f File, fpath string) error {
37         size, err := f.Size()
38         if err != nil {
39                 return err
40         }
41
42         if err := writeFileHeader(w.TarW, fpath, uint64(size)); err != nil {
43                 return err
44         }
45
46         if _, err := io.Copy(w.TarW, f); err != nil {
47                 return err
48         }
49         w.TarW.Flush()
50         return nil
51 }
52
53 // WriteNode adds a node to the archive.
54 func (w *TarWriter) WriteFile(nd Node, fpath string) error {
55         switch nd := nd.(type) {
56         case *Symlink:
57                 return writeSymlinkHeader(w.TarW, nd.Target, fpath)
58         case File:
59                 return w.writeFile(nd, fpath)
60         case Directory:
61                 return w.writeDir(nd, fpath)
62         default:
63                 return fmt.Errorf("file type %T is not supported", nd)
64         }
65 }
66
67 // Close closes the tar writer.
68 func (w *TarWriter) Close() error {
69         return w.TarW.Close()
70 }
71
72 func writeDirHeader(w *tar.Writer, fpath string) error {
73         return w.WriteHeader(&tar.Header{
74                 Name:     fpath,
75                 Typeflag: tar.TypeDir,
76                 Mode:     0777,
77                 ModTime:  time.Now(),
78                 // TODO: set mode, dates, etc. when added to unixFS
79         })
80 }
81
82 func writeFileHeader(w *tar.Writer, fpath string, size uint64) error {
83         return w.WriteHeader(&tar.Header{
84                 Name:     fpath,
85                 Size:     int64(size),
86                 Typeflag: tar.TypeReg,
87                 Mode:     0644,
88                 ModTime:  time.Now(),
89                 // TODO: set mode, dates, etc. when added to unixFS
90         })
91 }
92
93 func writeSymlinkHeader(w *tar.Writer, target, fpath string) error {
94         return w.WriteHeader(&tar.Header{
95                 Name:     fpath,
96                 Linkname: target,
97                 Mode:     0777,
98                 Typeflag: tar.TypeSymlink,
99         })
100 }
101