github.com/mgoltzsche/ctnr@v0.7.1-alpha/pkg/fs/writer/stringwriter.go (about) 1 package writer 2 3 import ( 4 "io" 5 "net/url" 6 "path/filepath" 7 8 "github.com/mgoltzsche/ctnr/pkg/fs" 9 "github.com/pkg/errors" 10 ) 11 12 type StringWriter struct { 13 writer io.Writer 14 attrs fs.AttrSet 15 } 16 17 func NewStringWriter(writer io.Writer, attrs fs.AttrSet) (w fs.Writer) { 18 return &StringWriter{writer, attrs} 19 } 20 21 func (w *StringWriter) Parent() (err error) { 22 _, err = w.writer.Write([]byte("..\n")) 23 return 24 } 25 26 func (w *StringWriter) writeEntry(path, attrs string) (err error) { 27 path = filepath.Base(path) 28 if path == string(filepath.Separator) { 29 path = "." 30 } 31 _, err = w.writer.Write([]byte(url.PathEscape(path) + " " + attrs + "\n")) 32 return 33 } 34 35 func (w *StringWriter) writeAttrs(path string, attrs *fs.NodeAttrs) (err error) { 36 return w.writeEntry(path, attrs.AttrString(w.attrs)) 37 } 38 39 func (w *StringWriter) LowerNode(path, name string, a *fs.NodeAttrs) (err error) { 40 return w.writeAttrs(name, a) 41 } 42 43 func (w *StringWriter) Lazy(path, name string, src fs.LazySource, _ map[fs.Source]string) (err error) { 44 var a fs.DerivedAttrs 45 if w.attrs&fs.AttrsHash != 0 { 46 if a, err = src.DeriveAttrs(); err != nil { 47 return errors.Wrapf(err, "stringwriter: lazy %s", path) 48 } 49 } 50 return w.writeAttrs(name, &fs.NodeAttrs{src.Attrs(), a}) 51 } 52 53 func (w *StringWriter) File(path string, src fs.FileSource) (r fs.Source, err error) { 54 var a fs.DerivedAttrs 55 if w.attrs&fs.AttrsHash != 0 { 56 if a, err = src.DeriveAttrs(); err != nil { 57 return nil, errors.Wrapf(err, "stringwriter: file %s", path) 58 } 59 } 60 err = w.writeAttrs(path, &fs.NodeAttrs{src.Attrs(), a}) 61 return src, err 62 } 63 64 func (w *StringWriter) Link(path, target string) (err error) { 65 return w.writeEntry(path, "hlink="+target) 66 } 67 68 func (w *StringWriter) LowerLink(path, target string, a *fs.NodeAttrs) (err error) { 69 return w.Link(path, target) 70 } 71 72 func (w *StringWriter) Symlink(path string, a fs.FileAttrs) (err error) { 73 return w.writeAttrs(path, &fs.NodeAttrs{fs.NodeInfo{fs.TypeSymlink, a}, fs.DerivedAttrs{}}) 74 } 75 76 func (w *StringWriter) Fifo(path string, a fs.DeviceAttrs) (err error) { 77 return w.writeAttrs(path, &fs.NodeAttrs{fs.NodeInfo{fs.TypeFifo, a.FileAttrs}, fs.DerivedAttrs{}}) 78 } 79 80 func (w *StringWriter) Device(path string, a fs.DeviceAttrs) (err error) { 81 return w.writeAttrs(path, &fs.NodeAttrs{fs.NodeInfo{fs.TypeDevice, a.FileAttrs}, fs.DerivedAttrs{}}) 82 } 83 84 func (w *StringWriter) Dir(path, name string, a fs.FileAttrs) (err error) { 85 return w.writeAttrs(name, &fs.NodeAttrs{fs.NodeInfo{fs.TypeDir, a}, fs.DerivedAttrs{}}) 86 } 87 88 func (w *StringWriter) Mkdir(path string) (err error) { 89 return w.writeEntry(path, "type="+string(fs.TypeDir)) 90 } 91 92 func (w *StringWriter) Remove(path string) (err error) { 93 return w.writeEntry(path, "type="+string(fs.TypeWhiteout)) 94 }