@cryptotaxi247 / kubo / commits / ce952a564

files2.0: fix build errors

License: MIT Signed-off-by: Łukasz Magiera <magik6k@gmail.com>

Łukasz Magiera committed Oct 26, 2018 at 15:56 UTC ce952a56414a288207b1ce0d79deafe90c2d77f3
16 files changed +156 -223
cmd/ipfs/init.go
+1 -1
@@ -85,7 +85,7 @@ environment variable:
85
86 f := req.Files
87 if f != nil {
88 - confFile, err := f.NextFile()
88 + _, confFile, err := f.NextFile()
89 if err != nil {
90 return err
91 }
core/commands/add.go
+12 -19
@@ -6,9 +6,9 @@ import (
6 "os"
7 "strings"
8
9 - cmdenv "github.com/ipfs/go-ipfs/core/commands/cmdenv"
9 + "github.com/ipfs/go-ipfs/core/commands/cmdenv"
10 coreiface "github.com/ipfs/go-ipfs/core/coreapi/interface"
11 - options "github.com/ipfs/go-ipfs/core/coreapi/interface/options"
11 + "github.com/ipfs/go-ipfs/core/coreapi/interface/options"
12
13 pb "gx/ipfs/QmPtj12fdwuAqj9sBSTNUxBNu8kCGNp8b3o8yUzMm5GHpq/pb"
14 files "gx/ipfs/QmXWZCd8jfaHmt4UDSnjKmGcrQMw95bDGWqEeVLVJjoANX/go-ipfs-files"
@@ -226,24 +226,17 @@ You can now check what blocks have been created by:
226 outChan := make(chan interface{})
227 req := res.Request()
228
229 - sizeFile, ok := req.Files.(files.SizeFile)
230 - if ok {
231 - // Could be slow.
232 - go func() {
233 - size, err := sizeFile.Size()
234 - if err != nil {
235 - log.Warningf("error getting files size: %s", err)
236 - // see comment above
237 - return
238 - }
229 + // Could be slow.
230 + go func() {
231 + size, err := req.Files.Size()
232 + if err != nil {
233 + log.Warningf("error getting files size: %s", err)
234 + // see comment above
235 + return
236 + }
237
240 - sizeChan <- size
241 - }()
242 - } else {
243 - // we don't need to error, the progress bar just
244 - // won't know how big the files are
245 - log.Warning("cannot determine size of input file")
246 - }
238 + sizeChan <- size
239 + }()
240
241 progressBar := func(wait chan struct{}) {
242 defer close(wait)
core/commands/block.go
+1 -1
@@ -153,7 +153,7 @@ than 'sha2-256' or format to anything other than 'v0' will result in CIDv1.
153 return err
154 }
155
156 - file, err := req.Files.NextFile()
156 + _, file, err := req.Files.NextFile()
157 if err != nil {
158 return err
159 }
core/commands/dag/dag.go
+1 -1
@@ -93,7 +93,7 @@ into an object of the specified format.
93 }
94
95 for {
96 - file, err := req.Files.NextFile()
96 + _, file, err := req.Files.NextFile()
97 if err == io.EOF {
98 // Finished the list of files.
99 break
core/commands/files.go
+1 -1
@@ -769,7 +769,7 @@ stat' on the file or any of its ancestors.
769 return err
770 }
771
772 - input, err := req.Files.NextFile()
772 + _, input, err := req.Files.NextFile()
773 if err != nil {
774 return err
775 }
core/commands/object/object.go
+1 -1
@@ -391,7 +391,7 @@ And then run:
391 return err
392 }
393
394 - input, err := req.Files.NextFile()
394 + _, input, err := req.Files.NextFile()
395 if err != nil && err != io.EOF {
396 return err
397 }
core/commands/object/patch.go
+2 -2
@@ -60,7 +60,7 @@ the limit will not be respected by the network.
60 return err
61 }
62
63 - data, err := req.Files.NextFile()
63 + _, data, err := req.Files.NextFile()
64 if err != nil {
65 return err
66 }
@@ -107,7 +107,7 @@ Example:
107 return err
108 }
109
110 - data, err := req.Files.NextFile()
110 + _, data, err := req.Files.NextFile()
111 if err != nil {
112 return err
113 }
core/commands/tar.go
+2 -3
@@ -44,7 +44,7 @@ represent it.
44 return err
45 }
46
47 - fi, err := req.Files.NextFile()
47 + name, fi, err := req.Files.NextFile()
48 if err != nil {
49 return err
50 }
@@ -56,9 +56,8 @@ represent it.
56
57 c := node.Cid()
58
59 - fi.FileName()
59 return cmds.EmitOnce(res, &coreiface.AddEvent{
61 - Name: fi.FileName(),
60 + Name: name,
61 Hash: c.String(),
62 })
63 },
core/coreapi/interface/unixfs.go
+2 -8
@@ -2,9 +2,8 @@ package iface
2
3 import (
4 "context"
5 - "io"
5
7 - options "github.com/ipfs/go-ipfs/core/coreapi/interface/options"
6 + "github.com/ipfs/go-ipfs/core/coreapi/interface/options"
7
8 files "gx/ipfs/QmXWZCd8jfaHmt4UDSnjKmGcrQMw95bDGWqEeVLVJjoANX/go-ipfs-files"
9 ipld "gx/ipfs/QmcKKBwfz6FyQdHR2jsXrrF6XeSBXYL86anmWNewpFpoF5/go-ipld-format"
@@ -18,11 +17,6 @@ type AddEvent struct {
17 Size string `json:",omitempty"`
18 }
19
21 -type UnixfsFile interface {
22 - files.SizeFile
23 - io.Seeker
24 -}
25 -
20 // UnixfsAPI is the basic interface to immutable files in IPFS
21 // NOTE: This API is heavily WIP, things are guaranteed to break frequently
22 type UnixfsAPI interface {
@@ -35,7 +29,7 @@ type UnixfsAPI interface {
29 //
30 // Note that some implementations of this API may apply the specified context
31 // to operations performed on the returned file
38 - Get(context.Context, Path) (UnixfsFile, error)
32 + Get(context.Context, Path) (files.File, error)
33
34 // Ls returns the list of links in a directory
35 Ls(context.Context, Path) ([]*ipld.Link, error)
core/coreapi/name_test.go
+1 -1
@@ -20,7 +20,7 @@ import (
20 var rnd = rand.New(rand.NewSource(0x62796532303137))
21
22 func addTestObject(ctx context.Context, api coreiface.CoreAPI) (coreiface.Path, error) {
23 - return api.Unixfs().Add(ctx, files.NewReaderFile("", "", ioutil.NopCloser(&io.LimitedReader{R: rnd, N: 4092}), nil))
23 + return api.Unixfs().Add(ctx, files.NewReaderFile(ioutil.NopCloser(&io.LimitedReader{R: rnd, N: 4092}), nil))
24 }
25
26 func appendPath(p coreiface.Path, sub string) coreiface.Path {
core/coreapi/unixfile.go
+10 -79
@@ -4,11 +4,6 @@ import (
4 "context"
5 "errors"
6 "io"
7 - "os"
8 - gopath "path"
9 - "time"
10 -
11 - "github.com/ipfs/go-ipfs/core/coreapi/interface"
7
8 files "gx/ipfs/QmXWZCd8jfaHmt4UDSnjKmGcrQMw95bDGWqEeVLVJjoANX/go-ipfs-files"
9 ft "gx/ipfs/Qmbvw7kpSM2p6rbQ57WGRhhqNfCiNGW6EKH4xgHLw4bsnB/go-unixfs"
@@ -23,44 +18,11 @@ const prefetchFiles = 4
18
19 // TODO: this probably belongs in go-unixfs (and could probably replace a chunk of it's interface in the long run)
20
26 -type sizeInfo struct {
27 - size int64
28 - name string
29 - modTime time.Time
30 -}
31 -
32 -func (s *sizeInfo) Name() string {
33 - return s.name
34 -}
35 -
36 -func (s *sizeInfo) Size() int64 {
37 - return s.size
38 -}
39 -
40 -func (s *sizeInfo) Mode() os.FileMode {
41 - return 0444 // all read
42 -}
43 -
44 -func (s *sizeInfo) ModTime() time.Time {
45 - return s.modTime
46 -}
47 -
48 -func (s *sizeInfo) IsDir() bool {
49 - return false
50 -}
51 -
52 -func (s *sizeInfo) Sys() interface{} {
53 - return nil
54 -}
55 -
21 type ufsDirectory struct {
22 ctx context.Context
23 dserv ipld.DAGService
24
25 files chan *ipld.Link
61 -
62 - name string
63 - path string
26 }
27
28 func (d *ufsDirectory) Close() error {
@@ -71,30 +33,23 @@ func (d *ufsDirectory) Read(_ []byte) (int, error) {
33 return 0, files.ErrNotReader
34 }
35
74 -func (d *ufsDirectory) FileName() string {
75 - return d.name
76 -}
77 -
78 -func (d *ufsDirectory) FullPath() string {
79 - return d.path
80 -}
81 -
36 func (d *ufsDirectory) IsDirectory() bool {
37 return true
38 }
39
86 -func (d *ufsDirectory) NextFile() (files.File, error) {
40 +func (d *ufsDirectory) NextFile() (string, files.File, error) {
41 l, ok := <-d.files
42 if !ok {
89 - return nil, io.EOF
43 + return "", nil, io.EOF
44 }
45
46 nd, err := l.GetNode(d.ctx, d.dserv)
47 if err != nil {
94 - return nil, err
48 + return "", nil, err
49 }
50
97 - return newUnixfsFile(d.ctx, d.dserv, nd, l.Name, d)
51 + f, err := newUnixfsFile(d.ctx, d.dserv, nd, d)
52 + return l.Name, f, err
53 }
54
55 func (d *ufsDirectory) Size() (int64, error) {
@@ -107,32 +62,21 @@ func (d *ufsDirectory) Seek(offset int64, whence int) (int64, error) {
62
63 type ufsFile struct {
64 uio.DagReader
110 -
111 - name string
112 - path string
65 }
66
67 func (f *ufsFile) IsDirectory() bool {
68 return false
69 }
70
119 -func (f *ufsFile) NextFile() (files.File, error) {
120 - return nil, files.ErrNotDirectory
121 -}
122 -
123 -func (f *ufsFile) FileName() string {
124 - return f.name
125 -}
126 -
127 -func (f *ufsFile) FullPath() string {
128 - return f.path
71 +func (f *ufsFile) NextFile() (string, files.File, error) {
72 + return "", nil, files.ErrNotDirectory
73 }
74
75 func (f *ufsFile) Size() (int64, error) {
76 return int64(f.DagReader.Size()), nil
77 }
78
135 -func newUnixfsDir(ctx context.Context, dserv ipld.DAGService, nd ipld.Node, name string, path string) (iface.UnixfsFile, error) {
79 +func newUnixfsDir(ctx context.Context, dserv ipld.DAGService, nd ipld.Node) (files.File, error) {
80 dir, err := uio.NewDirectoryFromNode(dserv, nd)
81 if err != nil {
82 return nil, err
@@ -157,18 +101,10 @@ func newUnixfsDir(ctx context.Context, dserv ipld.DAGService, nd ipld.Node, name
101 dserv: dserv,
102
103 files: fileCh,
160 -
161 - name: name,
162 - path: path,
104 }, nil
105 }
106
166 -func newUnixfsFile(ctx context.Context, dserv ipld.DAGService, nd ipld.Node, name string, parent files.File) (iface.UnixfsFile, error) {
167 - path := name
168 - if parent != nil {
169 - path = gopath.Join(parent.FullPath(), name)
170 - }
171 -
107 +func newUnixfsFile(ctx context.Context, dserv ipld.DAGService, nd ipld.Node, parent files.File) (files.File, error) {
108 switch dn := nd.(type) {
109 case *dag.ProtoNode:
110 fsn, err := ft.FSNodeFromBytes(dn.Data())
@@ -176,7 +112,7 @@ func newUnixfsFile(ctx context.Context, dserv ipld.DAGService, nd ipld.Node, nam
112 return nil, err
113 }
114 if fsn.IsDir() {
179 - return newUnixfsDir(ctx, dserv, nd, name, path)
115 + return newUnixfsDir(ctx, dserv, nd)
116 }
117
118 case *dag.RawNode:
@@ -191,10 +127,5 @@ func newUnixfsFile(ctx context.Context, dserv ipld.DAGService, nd ipld.Node, nam
127
128 return &ufsFile{
129 DagReader: dr,
194 -
195 - name: name,
196 - path: path,
130 }, nil
131 }
199 -
200 -var _ os.FileInfo = &sizeInfo{}
core/coreapi/unixfs.go
+2 -2
@@ -133,7 +133,7 @@ func (api *UnixfsAPI) Add(ctx context.Context, files files.File, opts ...options
133 return coreiface.IpfsPath(nd.Cid()), nil
134 }
135
136 -func (api *UnixfsAPI) Get(ctx context.Context, p coreiface.Path) (coreiface.UnixfsFile, error) {
136 +func (api *UnixfsAPI) Get(ctx context.Context, p coreiface.Path) (files.File, error) {
137 ses := api.core().getSession(ctx)
138
139 nd, err := ses.ResolveNode(ctx, p)
@@ -141,7 +141,7 @@ func (api *UnixfsAPI) Get(ctx context.Context, p coreiface.Path) (coreiface.Unix
141 return nil, err
142 }
143
144 - return newUnixfsFile(ctx, ses.dag, nd, "", nil)
144 + return newUnixfsFile(ctx, ses.dag, nd, nil)
145 }
146
147 // Ls returns the contents of an IPFS or IPNS object(s) at path p, with the format:
core/coreapi/unixfs_test.go
+82 -76
@@ -8,7 +8,6 @@ import (
8 "io"
9 "io/ioutil"
10 "math"
11 - "os"
11 "strconv"
12 "strings"
13 "sync"
@@ -136,33 +135,36 @@ func makeAPI(ctx context.Context) (*core.IpfsNode, coreiface.CoreAPI, error) {
135
136 func strFile(data string) func() files.File {
137 return func() files.File {
139 - return files.NewReaderFile("", "", ioutil.NopCloser(strings.NewReader(data)), nil)
138 + return files.NewReaderFile(ioutil.NopCloser(strings.NewReader(data)), nil)
139 }
140 }
141
142 func twoLevelDir() func() files.File {
143 return func() files.File {
145 - return files.NewSliceFile("t", "t", []files.File{
146 - files.NewSliceFile("t/abc", "t/abc", []files.File{
147 - files.NewReaderFile("t/abc/def", "t/abc/def", ioutil.NopCloser(strings.NewReader("world")), nil),
148 - }),
149 - files.NewReaderFile("t/bar", "t/bar", ioutil.NopCloser(strings.NewReader("hello2")), nil),
150 - files.NewReaderFile("t/foo", "t/foo", ioutil.NopCloser(strings.NewReader("hello1")), nil),
144 + return files.NewSliceFile([]files.FileEntry{{
145 + Name: "abc", File: files.NewSliceFile([]files.FileEntry{
146 + {Name: "def", File: files.NewReaderFile(ioutil.NopCloser(strings.NewReader("world")), nil)},
147 + })},
148 +
149 + {Name: "bar", File: files.NewReaderFile(ioutil.NopCloser(strings.NewReader("hello2")), nil)},
150 + {Name: "foo", File: files.NewReaderFile(ioutil.NopCloser(strings.NewReader("hello1")), nil)},
151 })
152 }
153 }
154
155 func flatDir() files.File {
156 - return files.NewSliceFile("t", "t", []files.File{
157 - files.NewReaderFile("t/bar", "t/bar", ioutil.NopCloser(strings.NewReader("hello2")), nil),
158 - files.NewReaderFile("t/foo", "t/foo", ioutil.NopCloser(strings.NewReader("hello1")), nil),
156 + return files.NewSliceFile([]files.FileEntry{
157 + {Name: "bar", File: files.NewReaderFile(ioutil.NopCloser(strings.NewReader("hello2")), nil)},
158 + {Name: "foo", File: files.NewReaderFile(ioutil.NopCloser(strings.NewReader("hello1")), nil)},
159 })
160 }
161
162 -func wrapped(f files.File) files.File {
163 - return files.NewSliceFile("", "", []files.File{
164 - f,
165 - })
162 +func wrapped(name string) func(f files.File) files.File {
163 + return func(f files.File) files.File {
164 + return files.NewSliceFile([]files.FileEntry{
165 + {Name: name, File: f},
166 + })
167 + }
168 }
169
170 func TestAdd(t *testing.T) {
@@ -180,7 +182,7 @@ func TestAdd(t *testing.T) {
182 path string
183 err string
184
183 - recursive bool
185 + wrap string
186
187 events []coreiface.AddEvent
188
@@ -277,36 +279,36 @@ func TestAdd(t *testing.T) {
279 },
280 // multi file
281 {
280 - name: "simpleDir",
281 - data: flatDir,
282 - recursive: true,
283 - path: "/ipfs/QmRKGpFfR32FVXdvJiHfo4WJ5TDYBsM1P9raAp1p6APWSp",
282 + name: "simpleDir",
283 + data: flatDir,
284 + wrap: "t",
285 + path: "/ipfs/QmRKGpFfR32FVXdvJiHfo4WJ5TDYBsM1P9raAp1p6APWSp",
286 },
287 {
286 - name: "twoLevelDir",
287 - data: twoLevelDir(),
288 - recursive: true,
289 - path: "/ipfs/QmVG2ZYCkV1S4TK8URA3a4RupBF17A8yAr4FqsRDXVJASr",
288 + name: "twoLevelDir",
289 + data: twoLevelDir(),
290 + wrap: "t",
291 + path: "/ipfs/QmVG2ZYCkV1S4TK8URA3a4RupBF17A8yAr4FqsRDXVJASr",
292 },
293 // wrapped
294 {
295 name: "addWrapped",
296 path: "/ipfs/QmVE9rNpj5doj7XHzp5zMUxD7BJgXEqx4pe3xZ3JBReWHE",
297 data: func() files.File {
296 - return files.NewReaderFile("foo", "foo", ioutil.NopCloser(strings.NewReader(helloStr)), nil)
298 + return files.NewReaderFile(ioutil.NopCloser(strings.NewReader(helloStr)), nil)
299 },
298 - expect: wrapped,
300 + expect: wrapped("foo"),
301 opts: []options.UnixfsAddOption{options.Unixfs.Wrap(true)},
302 },
303 {
304 name: "stdinWrapped",
305 path: "/ipfs/QmU3r81oZycjHS9oaSHw37ootMFuFUw1DvMLKXPsezdtqU",
306 data: func() files.File {
305 - return files.NewReaderFile("", os.Stdin.Name(), ioutil.NopCloser(strings.NewReader(helloStr)), nil)
307 + return files.NewReaderFile(ioutil.NopCloser(strings.NewReader(helloStr)), nil)
308 },
309 expect: func(files.File) files.File {
308 - return files.NewSliceFile("", "", []files.File{
309 - files.NewReaderFile("QmQy2Dw4Wk7rdJKjThjYXzfFJNaRKRHhHP5gHHXroJMYxk", "QmQy2Dw4Wk7rdJKjThjYXzfFJNaRKRHhHP5gHHXroJMYxk", ioutil.NopCloser(strings.NewReader(helloStr)), nil),
310 + return files.NewSliceFile([]files.FileEntry{
311 + {Name: "QmQy2Dw4Wk7rdJKjThjYXzfFJNaRKRHhHP5gHHXroJMYxk", File: files.NewReaderFile(ioutil.NopCloser(strings.NewReader(helloStr)), nil)},
312 })
313 },
314 opts: []options.UnixfsAddOption{options.Unixfs.Wrap(true)},
@@ -315,68 +317,68 @@ func TestAdd(t *testing.T) {
317 name: "stdinNamed",
318 path: "/ipfs/QmQ6cGBmb3ZbdrQW1MRm1RJnYnaxCqfssz7CrTa9NEhQyS",
319 data: func() files.File {
318 - return files.NewReaderFile("", os.Stdin.Name(), ioutil.NopCloser(strings.NewReader(helloStr)), nil)
320 + return files.NewReaderFile(ioutil.NopCloser(strings.NewReader(helloStr)), nil)
321 },
322 expect: func(files.File) files.File {
321 - return files.NewSliceFile("", "", []files.File{
322 - files.NewReaderFile("test", "test", ioutil.NopCloser(strings.NewReader(helloStr)), nil),
323 + return files.NewSliceFile([]files.FileEntry{
324 + {Name: "test", File: files.NewReaderFile(ioutil.NopCloser(strings.NewReader(helloStr)), nil)},
325 })
326 },
327 opts: []options.UnixfsAddOption{options.Unixfs.Wrap(true), options.Unixfs.StdinName("test")},
328 },
329 {
328 - name: "twoLevelDirWrapped",
329 - data: twoLevelDir(),
330 - recursive: true,
331 - expect: wrapped,
332 - path: "/ipfs/QmPwsL3T5sWhDmmAWZHAzyjKtMVDS9a11aHNRqb3xoVnmg",
333 - opts: []options.UnixfsAddOption{options.Unixfs.Wrap(true)},
330 + name: "twoLevelDirWrapped",
331 + data: twoLevelDir(),
332 + wrap: "t",
333 + expect: wrapped(""),
334 + path: "/ipfs/QmPwsL3T5sWhDmmAWZHAzyjKtMVDS9a11aHNRqb3xoVnmg",
335 + opts: []options.UnixfsAddOption{options.Unixfs.Wrap(true)},
336 },
337 {
336 - name: "twoLevelInlineHash",
337 - data: twoLevelDir(),
338 - recursive: true,
339 - expect: wrapped,
340 - path: "/ipfs/zBunoruKoyCHKkALNSWxDvj4L7yuQnMgQ4hUa9j1Z64tVcDEcu6Zdetyu7eeFCxMPfxb7YJvHeFHoFoHMkBUQf6vfdhmi",
341 - opts: []options.UnixfsAddOption{options.Unixfs.Wrap(true), options.Unixfs.Inline(true), options.Unixfs.RawLeaves(true), options.Unixfs.Hash(mh.SHA3)},
338 + name: "twoLevelInlineHash",
339 + data: twoLevelDir(),
340 + wrap: "t",
341 + expect: wrapped(""),
342 + path: "/ipfs/zBunoruKoyCHKkALNSWxDvj4L7yuQnMgQ4hUa9j1Z64tVcDEcu6Zdetyu7eeFCxMPfxb7YJvHeFHoFoHMkBUQf6vfdhmi",
343 + opts: []options.UnixfsAddOption{options.Unixfs.Wrap(true), options.Unixfs.Inline(true), options.Unixfs.RawLeaves(true), options.Unixfs.Hash(mh.SHA3)},
344 },
345 // hidden
346 {
347 name: "hiddenFiles",
348 data: func() files.File {
347 - return files.NewSliceFile("t", "t", []files.File{
348 - files.NewReaderFile("t/.bar", "t/.bar", ioutil.NopCloser(strings.NewReader("hello2")), nil),
349 - files.NewReaderFile("t/bar", "t/bar", ioutil.NopCloser(strings.NewReader("hello2")), nil),
350 - files.NewReaderFile("t/foo", "t/foo", ioutil.NopCloser(strings.NewReader("hello1")), nil),
349 + return files.NewSliceFile([]files.FileEntry{
350 + {Name: ".bar", File: files.NewReaderFile(ioutil.NopCloser(strings.NewReader("hello2")), nil)},
351 + {Name: "bar", File: files.NewReaderFile(ioutil.NopCloser(strings.NewReader("hello2")), nil)},
352 + {Name: "foo", File: files.NewReaderFile(ioutil.NopCloser(strings.NewReader("hello1")), nil)},
353 })
354 },
353 - recursive: true,
354 - path: "/ipfs/QmehGvpf2hY196MzDFmjL8Wy27S4jbgGDUAhBJyvXAwr3g",
355 - opts: []options.UnixfsAddOption{options.Unixfs.Hidden(true)},
355 + wrap: "t",
356 + path: "/ipfs/QmehGvpf2hY196MzDFmjL8Wy27S4jbgGDUAhBJyvXAwr3g",
357 + opts: []options.UnixfsAddOption{options.Unixfs.Hidden(true)},
358 },
359 {
360 name: "hiddenFileAlwaysAdded",
361 data: func() files.File {
360 - return files.NewReaderFile(".foo", ".foo", ioutil.NopCloser(strings.NewReader(helloStr)), nil)
362 + return files.NewReaderFile(ioutil.NopCloser(strings.NewReader(helloStr)), nil)
363 },
362 - recursive: true,
363 - path: hello,
364 + wrap: ".foo",
365 + path: hello,
366 },
367 {
368 name: "hiddenFilesNotAdded",
369 data: func() files.File {
368 - return files.NewSliceFile("t", "t", []files.File{
369 - files.NewReaderFile("t/.bar", "t/.bar", ioutil.NopCloser(strings.NewReader("hello2")), nil),
370 - files.NewReaderFile("t/bar", "t/bar", ioutil.NopCloser(strings.NewReader("hello2")), nil),
371 - files.NewReaderFile("t/foo", "t/foo", ioutil.NopCloser(strings.NewReader("hello1")), nil),
370 + return files.NewSliceFile([]files.FileEntry{
371 + {Name: ".bar", File: files.NewReaderFile(ioutil.NopCloser(strings.NewReader("hello2")), nil)},
372 + {Name: "bar", File: files.NewReaderFile(ioutil.NopCloser(strings.NewReader("hello2")), nil)},
373 + {Name: "foo", File: files.NewReaderFile(ioutil.NopCloser(strings.NewReader("hello1")), nil)},
374 })
375 },
376 expect: func(files.File) files.File {
377 return flatDir()
378 },
377 - recursive: true,
378 - path: "/ipfs/QmRKGpFfR32FVXdvJiHfo4WJ5TDYBsM1P9raAp1p6APWSp",
379 - opts: []options.UnixfsAddOption{options.Unixfs.Hidden(false)},
379 + wrap: "t",
380 + path: "/ipfs/QmRKGpFfR32FVXdvJiHfo4WJ5TDYBsM1P9raAp1p6APWSp",
381 + opts: []options.UnixfsAddOption{options.Unixfs.Hidden(false)},
382 },
383 // Events / Progress
384 {
@@ -396,8 +398,8 @@ func TestAdd(t *testing.T) {
398 {Name: "t/abc", Hash: "QmU7nuGs2djqK99UNsNgEPGh6GV4662p6WtsgccBNGTDxt", Size: "62"},
399 {Name: "t", Hash: "QmVG2ZYCkV1S4TK8URA3a4RupBF17A8yAr4FqsRDXVJASr", Size: "229"},
400 },
399 - recursive: true,
400 - opts: []options.UnixfsAddOption{options.Unixfs.Silent(true)},
401 + wrap: "t",
402 + opts: []options.UnixfsAddOption{options.Unixfs.Silent(true)},
403 },
404 {
405 name: "dirAddEvents",
@@ -410,13 +412,13 @@ func TestAdd(t *testing.T) {
412 {Name: "t/abc", Hash: "QmU7nuGs2djqK99UNsNgEPGh6GV4662p6WtsgccBNGTDxt", Size: "62"},
413 {Name: "t", Hash: "QmVG2ZYCkV1S4TK8URA3a4RupBF17A8yAr4FqsRDXVJASr", Size: "229"},
414 },
413 - recursive: true,
415 + wrap: "t",
416 },
417 {
418 name: "progress1M",
419 data: func() files.File {
420 r := bytes.NewReader(bytes.Repeat([]byte{0}, 1000000))
419 - return files.NewReaderFile("", "", ioutil.NopCloser(r), nil)
421 + return files.NewReaderFile(ioutil.NopCloser(r), nil)
422 },
423 path: "/ipfs/QmXXNNbwe4zzpdMg62ZXvnX1oU7MwSrQ3vAEtuwFKCm1oD",
424 events: []coreiface.AddEvent{
@@ -426,8 +428,8 @@ func TestAdd(t *testing.T) {
428 {Name: "", Bytes: 1000000},
429 {Name: "QmXXNNbwe4zzpdMg62ZXvnX1oU7MwSrQ3vAEtuwFKCm1oD", Hash: "QmXXNNbwe4zzpdMg62ZXvnX1oU7MwSrQ3vAEtuwFKCm1oD", Size: "1000256"},
430 },
429 - recursive: true,
430 - opts: []options.UnixfsAddOption{options.Unixfs.Progress(true)},
431 + wrap: "t",
432 + opts: []options.UnixfsAddOption{options.Unixfs.Progress(true)},
433 },
434 }
435
@@ -439,9 +441,9 @@ func TestAdd(t *testing.T) {
441 // recursive logic
442
443 data := testCase.data()
442 - if testCase.recursive {
443 - data = files.NewSliceFile("", "", []files.File{
444 - data,
444 + if testCase.wrap != "" {
445 + data = files.NewSliceFile([]files.FileEntry{
446 + {Name: testCase.wrap, File: data},
447 })
448 }
449
@@ -516,12 +518,16 @@ func TestAdd(t *testing.T) {
518
519 // compare file structure with Unixfs().Get
520
519 - var cmpFile func(orig files.File, got files.File)
520 - cmpFile = func(orig files.File, got files.File) {
521 + var cmpFile func(origName string, orig files.File, gotName string, got files.File)
522 + cmpFile = func(origName string, orig files.File, gotName string, got files.File) {
523 if orig.IsDirectory() != got.IsDirectory() {
524 t.Fatal("file type mismatch")
525 }
526
527 + if origName != gotName {
528 + t.Fatal("file name mismatch")
529 + }
530 +
531 if !orig.IsDirectory() {
532 defer orig.Close()
533 defer got.Close()
@@ -544,8 +550,8 @@ func TestAdd(t *testing.T) {
550 }
551
552 for {
547 - fo, err := orig.NextFile()
548 - fg, err2 := got.NextFile()
553 + origName, origFile, err := orig.NextFile()
554 + gotName, gotFile, err2 := got.NextFile()
555
556 if err != nil {
557 if err == io.EOF && err2 == io.EOF {
@@ -557,7 +563,7 @@ func TestAdd(t *testing.T) {
563 t.Fatal(err)
564 }
565
560 - cmpFile(fo, fg)
566 + cmpFile(origName, origFile, gotName, gotFile)
567 }
568 }
569
@@ -571,7 +577,7 @@ func TestAdd(t *testing.T) {
577 orig = testCase.expect(orig)
578 }
579
574 - cmpFile(orig, f)
580 + cmpFile("", orig, "", f)
581 })
582 }
583 }
core/corehttp/gateway_handler.go
+1 -1
@@ -386,7 +386,7 @@ func (i *gatewayHandler) serveFile(w http.ResponseWriter, req *http.Request, nam
386 }
387
388 func (i *gatewayHandler) postHandler(ctx context.Context, w http.ResponseWriter, r *http.Request) {
389 - p, err := i.api.Unixfs().Add(ctx, files.NewReaderFile("", "", ioutil.NopCloser(r.Body), nil))
389 + p, err := i.api.Unixfs().Add(ctx, files.NewReaderFile(ioutil.NopCloser(r.Body), nil))
390 if err != nil {
391 internalWebError(w, err)
392 return
core/coreunix/add.go
+28 -22
@@ -311,7 +311,7 @@ func AddR(n *core.IpfsNode, root string) (key string, err error) {
311 return "", err
312 }
313
314 - f, err := files.NewSerialFile(filepath.Base(root), root, false, stat)
314 + f, err := files.NewSerialFile(root, false, stat)
315 if err != nil {
316 return "", err
317 }
@@ -322,7 +322,7 @@ func AddR(n *core.IpfsNode, root string) (key string, err error) {
322 return "", err
323 }
324
325 - err = fileAdder.addFile(f)
325 + err = fileAdder.addFile(filepath.Base(root), f)
326 if err != nil {
327 return "", err
328 }
@@ -340,7 +340,7 @@ func AddR(n *core.IpfsNode, root string) (key string, err error) {
340 // Returns the path of the added file ("<dir hash>/filename"), the DAG node of
341 // the directory, and and error if any.
342 func AddWrapped(n *core.IpfsNode, r io.Reader, filename string) (string, ipld.Node, error) {
343 - file := files.NewReaderFile(filename, filename, ioutil.NopCloser(r), nil)
343 + file := files.NewReaderFile(ioutil.NopCloser(r), nil)
344 fileAdder, err := NewAdder(n.Context(), n.Pinning, n.Blockstore, n.DAG)
345 if err != nil {
346 return "", nil, err
@@ -349,7 +349,7 @@ func AddWrapped(n *core.IpfsNode, r io.Reader, filename string) (string, ipld.No
349
350 defer n.Blockstore.PinLock().Unlock()
351
352 - err = fileAdder.addFile(file)
352 + err = fileAdder.addFile(filename, file)
353 if err != nil {
354 return "", nil, err
355 }
@@ -416,20 +416,20 @@ func (adder *Adder) AddAllAndPin(file files.File) (ipld.Node, error) {
416 // single files.File f is treated as a directory, affecting hidden file
417 // semantics.
418 for {
419 - f, err := file.NextFile()
419 + name, f, err := file.NextFile()
420 if err == io.EOF {
421 // Finished the list of files.
422 break
423 } else if err != nil {
424 return nil, err
425 }
426 - if err := adder.addFile(f); err != nil {
426 + if err := adder.addFile(name, f); err != nil {
427 return nil, err
428 }
429 }
430 break
431 default:
432 - if err := adder.addFile(file); err != nil {
432 + if err := adder.addFile("", file); err != nil {
433 return nil, err
434 }
435 break
@@ -447,7 +447,7 @@ func (adder *Adder) AddAllAndPin(file files.File) (ipld.Node, error) {
447 return nd, adder.PinRoot()
448 }
449
450 -func (adder *Adder) addFile(file files.File) error {
450 +func (adder *Adder) addFile(path string, file files.File) error {
451 err := adder.maybePauseForGC()
452 if err != nil {
453 return err
@@ -468,7 +468,7 @@ func (adder *Adder) addFile(file files.File) error {
468 adder.liveNodes++
469
470 if file.IsDirectory() {
471 - return adder.addDir(file)
471 + return adder.addDir(path, file)
472 }
473
474 // case for symlink
@@ -485,7 +485,7 @@ func (adder *Adder) addFile(file files.File) error {
485 return err
486 }
487
488 - return adder.addNode(dagnode, s.FileName())
488 + return adder.addNode(dagnode, path)
489 }
490
491 // case for regular file
@@ -493,7 +493,7 @@ func (adder *Adder) addFile(file files.File) error {
493 // progress updates to the client (over the output channel)
494 var reader io.Reader = file
495 if adder.Progress {
496 - rdr := &progressReader{file: file, out: adder.Out}
496 + rdr := &progressReader{file: file, path: path, out: adder.Out}
497 if fi, ok := file.(files.FileInfo); ok {
498 reader = &progressReader2{rdr, fi}
499 } else {
@@ -506,26 +506,25 @@ func (adder *Adder) addFile(file files.File) error {
506 return err
507 }
508
509 - addFileName := file.FileName()
509 addFileInfo, ok := file.(files.FileInfo)
510 if ok {
511 if addFileInfo.AbsPath() == os.Stdin.Name() && adder.Name != "" {
513 - addFileName = adder.Name
512 + path = adder.Name
513 adder.Name = ""
514 }
515 }
516 // patch it into the root
518 - return adder.addNode(dagnode, addFileName)
517 + return adder.addNode(dagnode, path)
518 }
519
521 -func (adder *Adder) addDir(dir files.File) error {
522 - log.Infof("adding directory: %s", dir.FileName())
520 +func (adder *Adder) addDir(path string, dir files.File) error {
521 + log.Infof("adding directory: %s", path)
522
523 mr, err := adder.mfsRoot()
524 if err != nil {
525 return err
526 }
528 - err = mfs.Mkdir(mr, dir.FileName(), mfs.MkdirOpts{
527 + err = mfs.Mkdir(mr, path, mfs.MkdirOpts{
528 Mkparents: true,
529 Flush: false,
530 CidBuilder: adder.CidBuilder,
@@ -535,7 +534,7 @@ func (adder *Adder) addDir(dir files.File) error {
534 }
535
536 for {
538 - file, err := dir.NextFile()
537 + name, file, err := dir.NextFile()
538 if err != nil && err != io.EOF {
539 return err
540 }
@@ -543,12 +542,14 @@ func (adder *Adder) addDir(dir files.File) error {
542 break
543 }
544
545 + fpath := gopath.Join(path, name)
546 +
547 // Skip hidden files when adding recursively, unless Hidden is enabled.
547 - if files.IsHidden(file) && !adder.Hidden {
548 - log.Infof("%s is hidden, skipping", file.FileName())
548 + if files.IsHidden(fpath, file) && !adder.Hidden {
549 + log.Infof("%s is hidden, skipping", fpath)
550 continue
551 }
551 - err = adder.addFile(file)
552 + err = adder.addFile(fpath, file)
553 if err != nil {
554 return err
555 }
@@ -616,6 +617,7 @@ func getOutput(dagnode ipld.Node) (*Object, error) {
617
618 type progressReader struct {
619 file files.File
620 + path string
621 out chan<- interface{}
622 bytes int64
623 lastProgress int64
@@ -628,7 +630,7 @@ func (i *progressReader) Read(p []byte) (int, error) {
630 if i.bytes-i.lastProgress >= progressReaderIncrement || err == io.EOF {
631 i.lastProgress = i.bytes
632 i.out <- &coreiface.AddEvent{
631 - Name: i.file.FileName(),
633 + Name: i.path,
634 Bytes: i.bytes,
635 }
636 }
@@ -640,3 +642,7 @@ type progressReader2 struct {
642 *progressReader
643 files.FileInfo
644 }
645 +
646 +func (i *progressReader2) Read(p []byte) (int, error) {
647 + return i.progressReader.Read(p)
648 +}
core/coreunix/add_test.go
+9 -5
@@ -71,16 +71,20 @@ func TestAddGCLive(t *testing.T) {
71 adder.Out = out
72
73 dataa := ioutil.NopCloser(bytes.NewBufferString("testfileA"))
74 - rfa := files.NewReaderFile("a", "a", dataa, nil)
74 + rfa := files.NewReaderFile(dataa, nil)
75
76 // make two files with pipes so we can 'pause' the add for timing of the test
77 piper, pipew := io.Pipe()
78 - hangfile := files.NewReaderFile("b", "b", piper, nil)
78 + hangfile := files.NewReaderFile(piper, nil)
79
80 datad := ioutil.NopCloser(bytes.NewBufferString("testfileD"))
81 - rfd := files.NewReaderFile("d", "d", datad, nil)
81 + rfd := files.NewReaderFile(datad, nil)
82
83 - slf := files.NewSliceFile("files", "files", []files.File{rfa, hangfile, rfd})
83 + slf := files.NewSliceFile([]files.FileEntry{
84 + {File: rfa, Name: "a"},
85 + {File: hangfile, Name: "b"},
86 + {File: rfd, Name: "d"},
87 + })
88
89 addDone := make(chan struct{})
90 go func() {
@@ -189,7 +193,7 @@ func testAddWPosInfo(t *testing.T, rawLeaves bool) {
193 rand.New(rand.NewSource(2)).Read(data) // Rand.Read never returns an error
194 fileData := ioutil.NopCloser(bytes.NewBuffer(data))
195 fileInfo := dummyFileInfo{"foo.txt", int64(len(data)), time.Now()}
192 - file := files.NewReaderFile("foo.txt", "/tmp/foo.txt", fileData, &fileInfo)
196 + file := files.NewReaderFile(fileData, &fileInfo)
197
198 go func() {
199 defer close(adder.Out)