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 {