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)