@cryptotaxi247 / kubo / commits / a15104131

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: