coreapi: extract unixfile to go-unixfs
License: MIT Signed-off-by: Łukasz Magiera <magik6k@gmail.com>
Łukasz Magiera committed
Jan 24, 2019 at 20:38 UTC
a15104131103dce83c4d117f3594cd995cd81302
2 files changed
+2
-183
core/coreapi/unixfile.go
deleted
-182
@@ -1,182 +0,0 @@
1
-package coreapi
2
-
3
-import (
4
- "context"
5
- "errors"
6
-
7
- ipld "gx/ipfs/QmRL22E4paat7ky7vx9MLpR97JHHbFPrg3ytFQw6qp1y1s/go-ipld-format"
8
- ft "gx/ipfs/QmSMJ4rZbCJaih3y82Ebq7BZqK6vU2FHsKcWKQiE1DPTpS/go-unixfs"
9
- uio "gx/ipfs/QmSMJ4rZbCJaih3y82Ebq7BZqK6vU2FHsKcWKQiE1DPTpS/go-unixfs/io"
10
- files "gx/ipfs/QmXWZCd8jfaHmt4UDSnjKmGcrQMw95bDGWqEeVLVJjoANX/go-ipfs-files"
11
- dag "gx/ipfs/Qmb2UEG2TAeVrEJSjqsZF7Y2he7wRDkrdt6c3bECxwZf4k/go-merkledag"
12
-)
13
-
14
-// Number to file to prefetch in directories
15
-// TODO: should we allow setting this via context hint?
16
-const prefetchFiles = 4
17
-
18
-// TODO: this probably belongs in go-unixfs (and could probably replace a chunk of it's interface in the long run)
19
-
20
-type ufsDirectory struct {
21
- ctx context.Context
22
- dserv ipld.DAGService
23
- dir uio.Directory
24
-}
25
-
26
-type ufsIterator struct {
27
- ctx context.Context
28
- files chan *ipld.Link
29
- dserv ipld.DAGService
30
-
31
- curName string
32
- curFile files.Node
33
-
34
- err error
35
- errCh chan error
36
-}
37
-
38
-func (it *ufsIterator) Name() string {
39
- return it.curName
40
-}
41
-
42
-func (it *ufsIterator) Node() files.Node {
43
- return it.curFile
44
-}
45
-
46
-func (it *ufsIterator) Next() bool {
47
- if it.err != nil {
48
- return false
49
- }
50
-
51
- var l *ipld.Link
52
- var ok bool
53
- for !ok {
54
- if it.files == nil && it.errCh == nil {
55
- return false
56
- }
57
- select {
58
- case l, ok = <-it.files:
59
- if !ok {
60
- it.files = nil
61
- }
62
- case err := <-it.errCh:
63
- it.errCh = nil
64
- it.err = err
65
-
66
- if err != nil {
67
- return false
68
- }
69
- }
70
- }
71
-
72
- it.curFile = nil
73
-
74
- nd, err := l.GetNode(it.ctx, it.dserv)
75
- if err != nil {
76
- it.err = err
77
- return false
78
- }
79
-
80
- it.curName = l.Name
81
- it.curFile, it.err = newUnixfsFile(it.ctx, it.dserv, nd)
82
- return it.err == nil
83
-}
84
-
85
-func (it *ufsIterator) Err() error {
86
- return it.err
87
-}
88
-
89
-func (d *ufsDirectory) Close() error {
90
- return nil
91
-}
92
-
93
-func (d *ufsDirectory) Entries() files.DirIterator {
94
- fileCh := make(chan *ipld.Link, prefetchFiles)
95
- errCh := make(chan error, 1)
96
- go func() {
97
- errCh <- d.dir.ForEachLink(d.ctx, func(link *ipld.Link) error {
98
- if d.ctx.Err() != nil {
99
- return d.ctx.Err()
100
- }
101
- select {
102
- case fileCh <- link:
103
- case <-d.ctx.Done():
104
- return d.ctx.Err()
105
- }
106
- return nil
107
- })
108
-
109
- close(errCh)
110
- close(fileCh)
111
- }()
112
-
113
- return &ufsIterator{
114
- ctx: d.ctx,
115
- files: fileCh,
116
- errCh: errCh,
117
- dserv: d.dserv,
118
- }
119
-}
120
-
121
-func (d *ufsDirectory) Size() (int64, error) {
122
- n, err := d.dir.GetNode()
123
- if err != nil {
124
- return 0, err
125
- }
126
- s, err := n.Size()
127
- return int64(s), err
128
-}
129
-
130
-type ufsFile struct {
131
- uio.DagReader
132
-}
133
-
134
-func (f *ufsFile) Size() (int64, error) {
135
- return int64(f.DagReader.Size()), nil
136
-}
137
-
138
-func newUnixfsDir(ctx context.Context, dserv ipld.DAGService, nd ipld.Node) (files.Directory, error) {
139
- dir, err := uio.NewDirectoryFromNode(dserv, nd)
140
- if err != nil {
141
- return nil, err
142
- }
143
-
144
- return &ufsDirectory{
145
- ctx: ctx,
146
- dserv: dserv,
147
-
148
- dir: dir,
149
- }, nil
150
-}
151
-
152
-func newUnixfsFile(ctx context.Context, dserv ipld.DAGService, nd ipld.Node) (files.Node, error) {
153
- switch dn := nd.(type) {
154
- case *dag.ProtoNode:
155
- fsn, err := ft.FSNodeFromBytes(dn.Data())
156
- if err != nil {
157
- return nil, err
158
- }
159
- if fsn.IsDir() {
160
- return newUnixfsDir(ctx, dserv, nd)
161
- }
162
- if fsn.Type() == ft.TSymlink {
163
- return files.NewLinkFile(string(fsn.Data()), nil), nil
164
- }
165
-
166
- case *dag.RawNode:
167
- default:
168
- return nil, errors.New("unknown node type")
169
- }
170
-
171
- dr, err := uio.NewDagReader(ctx, nd, dserv)
172
- if err != nil {
173
- return nil, err
174
- }
175
-
176
- return &ufsFile{
177
- DagReader: dr,
178
- }, nil
179
-}
180
-
181
-var _ files.Directory = &ufsDirectory{}
182
-var _ files.File = &ufsFile{}
core/coreapi/unixfs.go
+2
-1
@@ -15,6 +15,7 @@ import (
15
mfs "gx/ipfs/QmRg4joNWApLL7yuvLjmKwZaqZX2d7AY7TU35kPmviRoMY/go-mfs"
16
bstore "gx/ipfs/QmS2aqUZLJp8kF1ihE5rvDGE5LvmKDPnx32w9Z1BW9xLV5/go-ipfs-blockstore"
17
ft "gx/ipfs/QmSMJ4rZbCJaih3y82Ebq7BZqK6vU2FHsKcWKQiE1DPTpS/go-unixfs"
18
+ unixfile "gx/ipfs/QmSMJ4rZbCJaih3y82Ebq7BZqK6vU2FHsKcWKQiE1DPTpS/go-unixfs/file"
19
uio "gx/ipfs/QmSMJ4rZbCJaih3y82Ebq7BZqK6vU2FHsKcWKQiE1DPTpS/go-unixfs/io"
20
blockservice "gx/ipfs/QmVKQHuzni68SWByzJgBUCwHvvr4TWiXfutNWWwpZpp4rE/go-blockservice"
21
files "gx/ipfs/QmXWZCd8jfaHmt4UDSnjKmGcrQMw95bDGWqEeVLVJjoANX/go-ipfs-files"
@@ -137,7 +138,7 @@ func (api *UnixfsAPI) Get(ctx context.Context, p coreiface.Path) (files.Node, er
138
return nil, err
139
}
140
140
- return newUnixfsFile(ctx, ses.dag, nd)
141
+ return unixfile.NewUnixfsFile(ctx, ses.dag, nd)
142
}
143
144
// Ls returns the contents of an IPFS or IPNS object(s) at path p, with the format: