@cryptotaxi247 / kubo / commits / 5d173bf36

fix(unixfs): issue #5055

License: MIT Signed-off-by: Overbool <overbool.xu@gmail.com>

Overbool committed Sep 26, 2018 at 18:32 UTC 5d173bf3655dc05c5fd37a1471fad02c6b37339e
3 files changed +32 -32
core/commands/ls.go
+2 -2
@@ -138,7 +138,7 @@ The JSON output contains type information.
138 switch link.Cid.Type() {
139 case cid.Raw:
140 // No need to check with raw leaves
141 - t = unixfspb.Data_File
141 + t = unixfs.TFile
142 case cid.DagProtobuf:
143 linkNode, err := link.GetNode(req.Context(), dserv)
144 if err == ipld.ErrNotFound && !resolve {
@@ -193,7 +193,7 @@ The JSON output contains type information.
193 fmt.Fprintln(w, "Hash\tSize\tName")
194 }
195 for _, link := range object.Links {
196 - if link.Type == unixfspb.Data_Directory {
196 + if link.Type == unixfs.TDirectory {
197 link.Name += "/"
198 }
199 fmt.Fprintf(w, "%s\t%v\t%s\n", link.Hash, link.Size, link.Name)
core/commands/unixfs/ls.go
+5 -6
@@ -14,7 +14,6 @@ import (
14 e "github.com/ipfs/go-ipfs/core/commands/e"
15 unixfs "gx/ipfs/QmU4x3742bvgfxJsByEDpBnifJqjJdV6x528co4hwKCn46/go-unixfs"
16 uio "gx/ipfs/QmU4x3742bvgfxJsByEDpBnifJqjJdV6x528co4hwKCn46/go-unixfs/io"
17 - unixfspb "gx/ipfs/QmU4x3742bvgfxJsByEDpBnifJqjJdV6x528co4hwKCn46/go-unixfs/pb"
17 merkledag "gx/ipfs/QmcBoNcAP6qDjgRBew7yjvCqHq7p5jMstE44jPUBWBxzsV/go-merkledag"
18 path "gx/ipfs/QmcjwUb36Z16NJkvDX6ccXPqsFswo6AsRXynyXcLLCphV2/go-path"
19 resolver "gx/ipfs/QmcjwUb36Z16NJkvDX6ccXPqsFswo6AsRXynyXcLLCphV2/go-path/resolver"
@@ -135,13 +134,13 @@ possible, please use 'ipfs ls' instead.
134 }
135
136 switch t {
138 - case unixfspb.Data_File:
137 + case unixfs.TFile:
138 break
140 - case unixfspb.Data_HAMTShard:
139 + case unixfs.THAMTShard:
140 // We need a streaming ls API for this.
141 res.SetError(fmt.Errorf("cannot list large directories yet"), cmdkit.ErrNormal)
142 return
144 - case unixfspb.Data_Directory:
143 + case unixfs.TDirectory:
144 links := make([]LsLink, len(merkleNode.Links()))
145 output.Objects[hash].Links = links
146 for i, link := range merkleNode.Links() {
@@ -167,14 +166,14 @@ possible, please use 'ipfs ls' instead.
166 Hash: link.Cid.String(),
167 Type: t.String(),
168 }
170 - if t == unixfspb.Data_File {
169 + if t == unixfs.TFile {
170 lsLink.Size = d.FileSize()
171 } else {
172 lsLink.Size = link.Size
173 }
174 links[i] = lsLink
175 }
177 - case unixfspb.Data_Symlink:
176 + case unixfs.TSymlink:
177 res.SetError(fmt.Errorf("cannot list symlinks yet"), cmdkit.ErrNormal)
178 return
179 default:
fuse/readonly/readonly_unix.go
+25 -24
@@ -11,8 +11,8 @@ import (
11 "syscall"
12
13 core "github.com/ipfs/go-ipfs/core"
14 + ft "gx/ipfs/QmU4x3742bvgfxJsByEDpBnifJqjJdV6x528co4hwKCn46/go-unixfs"
15 uio "gx/ipfs/QmU4x3742bvgfxJsByEDpBnifJqjJdV6x528co4hwKCn46/go-unixfs/io"
15 - ftpb "gx/ipfs/QmU4x3742bvgfxJsByEDpBnifJqjJdV6x528co4hwKCn46/go-unixfs/pb"
16 mdag "gx/ipfs/QmcBoNcAP6qDjgRBew7yjvCqHq7p5jMstE44jPUBWBxzsV/go-merkledag"
17 path "gx/ipfs/QmcjwUb36Z16NJkvDX6ccXPqsFswo6AsRXynyXcLLCphV2/go-path"
18
@@ -21,7 +21,6 @@ import (
21 fs "gx/ipfs/QmSJBsmLP1XMjv8hxYg2rUMdPDB7YUpyBo9idjrJ6Cmq6F/fuse/fs"
22 logging "gx/ipfs/QmZChCsSt8DctjceaL56Eibc29CVQq4dGKRXC5JRZ6Ppae/go-log"
23 ipld "gx/ipfs/QmdDXJs4axxefSPgK6Y1QhpJWKuDPnGJiqgq4uncb4rFHL/go-ipld-format"
24 - proto "gx/ipfs/QmdxUuburamoF6zF9qjeQC4WYcWGbWuRmdLacMEsW8ioD8/gogo-protobuf/proto"
24 )
25
26 var log = logging.Logger("fuse/ipfs")
@@ -93,13 +92,16 @@ func (*Root) ReadDirAll(ctx context.Context) ([]fuse.Dirent, error) {
92 type Node struct {
93 Ipfs *core.IpfsNode
94 Nd ipld.Node
96 - cached *ftpb.Data
95 + cached *ft.FSNode
96 }
97
98 func (s *Node) loadData() error {
99 if pbnd, ok := s.Nd.(*mdag.ProtoNode); ok {
101 - s.cached = new(ftpb.Data)
102 - return proto.Unmarshal(pbnd.Data(), s.cached)
100 + fsn, err := ft.FSNodeFromBytes(pbnd.Data())
101 + if err != nil {
102 + return err
103 + }
104 + s.cached = fsn
105 }
106 return nil
107 }
@@ -119,23 +121,23 @@ func (s *Node) Attr(ctx context.Context, a *fuse.Attr) error {
121 return fmt.Errorf("readonly: loadData() failed: %s", err)
122 }
123 }
122 - switch s.cached.GetType() {
123 - case ftpb.Data_Directory, ftpb.Data_HAMTShard:
124 + switch s.cached.Type() {
125 + case ft.TDirectory, ft.THAMTShard:
126 a.Mode = os.ModeDir | 0555
125 - case ftpb.Data_File:
126 - size := s.cached.GetFilesize()
127 + case ft.TFile:
128 + size := s.cached.FileSize()
129 a.Mode = 0444
130 a.Size = uint64(size)
131 a.Blocks = uint64(len(s.Nd.Links()))
130 - case ftpb.Data_Raw:
132 + case ft.TRaw:
133 a.Mode = 0444
132 - a.Size = uint64(len(s.cached.GetData()))
134 + a.Size = uint64(len(s.cached.Data()))
135 a.Blocks = uint64(len(s.Nd.Links()))
134 - case ftpb.Data_Symlink:
136 + case ft.TSymlink:
137 a.Mode = 0777 | os.ModeSymlink
136 - a.Size = uint64(len(s.cached.GetData()))
138 + a.Size = uint64(len(s.cached.Data()))
139 default:
138 - return fmt.Errorf("invalid data type - %s", s.cached.GetType())
140 + return fmt.Errorf("invalid data type - %s", s.cached.Type())
141 }
142 return nil
143 }
@@ -192,21 +194,20 @@ func (s *Node) ReadDirAll(ctx context.Context) ([]fuse.Dirent, error) {
194 case *mdag.RawNode:
195 t = fuse.DT_File
196 case *mdag.ProtoNode:
195 - var data ftpb.Data
196 - if err := proto.Unmarshal(nd.Data(), &data); err != nil {
197 + if fsn, err := ft.FSNodeFromBytes(nd.Data()); err != nil {
198 log.Warning("failed to unmarshal protonode data field:", err)
199 } else {
199 - switch data.GetType() {
200 - case ftpb.Data_Directory, ftpb.Data_HAMTShard:
200 + switch fsn.Type() {
201 + case ft.TDirectory, ft.THAMTShard:
202 t = fuse.DT_Dir
202 - case ftpb.Data_File, ftpb.Data_Raw:
203 + case ft.TFile, ft.TRaw:
204 t = fuse.DT_File
204 - case ftpb.Data_Symlink:
205 + case ft.TSymlink:
206 t = fuse.DT_Link
206 - case ftpb.Data_Metadata:
207 + case ft.TMetadata:
208 log.Error("metadata object in fuse should contain its wrapped type")
209 default:
209 - log.Error("unrecognized protonode data type: ", data.GetType())
210 + log.Error("unrecognized protonode data type: ", fsn.Type())
211 }
212 }
213 }
@@ -230,10 +231,10 @@ func (s *Node) Getxattr(ctx context.Context, req *fuse.GetxattrRequest, resp *fu
231 }
232
233 func (s *Node) Readlink(ctx context.Context, req *fuse.ReadlinkRequest) (string, error) {
233 - if s.cached == nil || s.cached.GetType() != ftpb.Data_Symlink {
234 + if s.cached == nil || s.cached.Type() != ft.TSymlink {
235 return "", fuse.Errno(syscall.EINVAL)
236 }
236 - return string(s.cached.GetData()), nil
237 + return string(s.cached.Data()), nil
238 }
239
240 func (s *Node) Read(ctx context.Context, req *fuse.ReadRequest, resp *fuse.ReadResponse) error {