func (w *Writer) writeFile(nd *mdag.Node, pb *upb.Data, fpath string) error { if err := writeFileHeader(w.TarW, fpath, pb.GetFilesize()); err != nil { return err } dagr := uio.NewDataFileReader(w.ctx, nd, pb, w.Dag) _, err := dagr.WriteTo(w.TarW) return err }
func FSNodeFromBytes(b []byte) (*FSNode, error) { pbn := new(pb.Data) err := proto.Unmarshal(b, pbn) if err != nil { return nil, err } n := new(FSNode) n.Data = pbn.Data n.blocksizes = pbn.Blocksizes n.subtotal = pbn.GetFilesize() - uint64(len(n.Data)) n.Type = pbn.GetType() return n, nil }
func (w *Writer) writeFile(ctx cxt.Context, nd *mdag.Node, pb *upb.Data, fpath string) error { if err := writeFileHeader(w.TarW, fpath, pb.GetFilesize()); err != nil { return err } dagr, err := uio.NewDagReader(ctx, nd, w.Dag) if err != nil { return err } _, err = io.Copy(w.TarW, dagr) if err != nil && err != io.EOF { return err } return nil }
func DataSize(data []byte) (uint64, error) { pbdata := new(pb.Data) err := proto.Unmarshal(data, pbdata) if err != nil { return 0, err } switch pbdata.GetType() { case pb.Data_Directory: return 0, errors.New("Cant get data size of directory!") case pb.Data_File: return pbdata.GetFilesize(), nil case pb.Data_Raw: return uint64(len(pbdata.GetData())), nil default: return 0, errors.New("Unrecognized node data type!") } }
func (r *Reader) writeToBuf(ctx cxt.Context, dagnode *mdag.Node, path string, depth int) { pb := new(upb.Data) err := proto.Unmarshal(dagnode.Data, pb) if err != nil { r.emitError(err) return } if depth == 0 { defer r.close() } if pb.GetType() == upb.Data_Directory { err = r.writer.WriteHeader(&tar.Header{ Name: path, Typeflag: tar.TypeDir, Mode: 0777, ModTime: time.Now(), // TODO: set mode, dates, etc. when added to unixFS }) if err != nil { r.emitError(err) return } r.flush() for i, ng := range r.dag.GetDAG(ctx, dagnode) { childNode, err := ng.Get(ctx) if err != nil { r.emitError(err) return } r.writeToBuf(ctx, childNode, gopath.Join(path, dagnode.Links[i].Name), depth+1) } return } err = r.writer.WriteHeader(&tar.Header{ Name: path, Size: int64(pb.GetFilesize()), Typeflag: tar.TypeReg, Mode: 0644, ModTime: time.Now(), // TODO: set mode, dates, etc. when added to unixFS }) if err != nil { r.emitError(err) return } r.flush() reader, err := uio.NewDagReader(ctx, dagnode, r.dag) if err != nil { r.emitError(err) return } err = r.syncCopy(reader) if err != nil { r.emitError(err) return } }