@cryptotaxi247 / kubo / commits / d64f1494a

enfastify mfs

License: MIT Signed-off-by: Jeromy <jeromyj@gmail.com>

Jeromy committed Dec 4, 2015 at 15:17 UTC d64f1494a3275861db8c64eb3aed1b181137fb78
3 files changed +73 -41
core/commands/add.go
-3
@@ -61,9 +61,6 @@ remains to be implemented.
61
62 req.SetOption(progressOptionName, true)
63
64 - log.Error("SKIPPING SIZE")
65 - return nil
66 -
64 sizeFile, ok := req.Files().(files.SizeFile)
65 if !ok {
66 // we don't need to error, the progress bar just won't know how big the files are
core/coreunix/add.go
+64 -20
@@ -1,6 +1,7 @@
1 package coreunix
2
3 import (
4 + "bytes"
5 "fmt"
6 "io"
7 "io/ioutil"
@@ -27,6 +28,8 @@ import (
28
29 var log = logging.Logger("coreunix")
30
31 +var folderData = unixfs.FolderPBData()
32 +
33 // how many bytes of progress to wait before sending a progress update message
34 const progressReaderIncrement = 1024 * 256
35
@@ -118,29 +121,26 @@ func (params Adder) add(reader io.Reader) (*dag.Node, error) {
121 }
122
123 func (params *Adder) RootNode() (*dag.Node, error) {
121 - return params.mr.GetValue().GetNode()
122 - /*
123 - // for memoizing
124 - if params.root != nil {
125 - return params.root, nil
126 - }
124 + // for memoizing
125 + if params.root != nil {
126 + return params.root, nil
127 + }
128
128 - root := params.editor.GetNode()
129 + root, err := params.mr.GetValue().GetNode()
130 + if err != nil {
131 + return nil, err
132 + }
133
130 - // if not wrapping, AND one root file, use that hash as root.
131 - if !params.Wrap && len(root.Links) == 1 {
132 - var err error
133 - root, err = root.Links[0].GetNode(params.ctx, params.editor.GetDagService())
134 - params.root = root
135 - // no need to output, as we've already done so.
136 - return root, err
134 + // if not wrapping, AND one root file, use that hash as root.
135 + if !params.Wrap && len(root.Links) == 1 {
136 + root, err = root.Links[0].GetNode(params.ctx, params.node.DAG)
137 + if err != nil {
138 + return nil, err
139 }
140 + }
141
139 - // otherwise need to output, as we have not.
140 - err := outputDagnode(params.out, "", root)
141 - params.root = root
142 - return root, err
143 - */
142 + params.root = root
143 + return root, err
144 }
145
146 func (params *Adder) PinRoot() error {
@@ -162,7 +162,51 @@ func (params *Adder) PinRoot() error {
162 }
163
164 func (params *Adder) Finalize() (*dag.Node, error) {
165 - return params.mr.GetValue().GetNode()
165 + root, err := params.mr.GetValue().GetNode()
166 + if err != nil {
167 + return nil, err
168 + }
169 +
170 + params.RootNode()
171 +
172 + var name string
173 + if !params.Wrap {
174 + name = root.Links[0].Name
175 + child, err := root.Links[0].GetNode(params.ctx, params.node.DAG)
176 + if err != nil {
177 + return nil, err
178 + }
179 + root = child
180 + }
181 +
182 + err = params.outputDirs(name, root)
183 + if err != nil {
184 + return nil, err
185 + }
186 +
187 + err = params.mr.Close()
188 + if err != nil {
189 + return nil, err
190 + }
191 +
192 + return root, nil
193 +}
194 +
195 +func (params *Adder) outputDirs(path string, nd *dag.Node) error {
196 + for _, l := range nd.Links {
197 + child, err := l.GetNode(params.ctx, params.node.DAG)
198 + if err != nil {
199 + return err
200 + }
201 +
202 + if bytes.Equal(child.Data, folderData) {
203 + err := params.outputDirs(gopath.Join(path, l.Name), child)
204 + if err != nil {
205 + return err
206 + }
207 + }
208 + }
209 + return outputDagnode(params.out, path, nd)
210 }
211
212 // Add builds a merkledag from the a reader, pinning all objects to the local
mfs/dir.go
+9 -18
@@ -5,6 +5,7 @@ import (
5 "fmt"
6 "os"
7 "sync"
8 + "time"
9
10 context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context"
11
@@ -28,6 +29,8 @@ type Directory struct {
29 node *dag.Node
30 ctx context.Context
31
32 + modTime time.Time
33 +
34 name string
35 }
36
@@ -40,6 +43,7 @@ func NewDirectory(ctx context.Context, name string, node *dag.Node, parent child
43 parent: parent,
44 childDirs: make(map[string]*Directory),
45 files: make(map[string]*File),
46 + modTime: time.Now(),
47 }
48 }
49
@@ -72,6 +76,8 @@ func (d *Directory) updateChild(name string, nd *dag.Node) error {
76 return err
77 }
78
79 + d.modTime = time.Now()
80 +
81 return nil
82 }
83
@@ -285,12 +291,7 @@ func (d *Directory) AddChild(name string, nd *dag.Node) error {
291 d.Lock()
292 defer d.Unlock()
293
288 - pbn, err := ft.FromBytes(nd.Data)
289 - if err != nil {
290 - return err
291 - }
292 -
293 - _, err = d.childUnsync(name)
294 + _, err := d.childUnsync(name)
295 if err == nil {
296 return ErrDirExists
297 }
@@ -305,18 +306,8 @@ func (d *Directory) AddChild(name string, nd *dag.Node) error {
306 return err
307 }
308
308 - switch pbn.GetType() {
309 - case ft.TDirectory:
310 - d.childDirs[name] = NewDirectory(d.ctx, name, nd, d, d.dserv)
311 - case ft.TFile, ft.TMetadata, ft.TRaw:
312 - nfi, err := NewFile(name, nd, d, d.dserv)
313 - if err != nil {
314 - return err
315 - }
316 - d.files[name] = nfi
317 - default:
318 - return ErrInvalidChild
319 - }
309 + d.modTime = time.Now()
310 +
311 return d.parent.closeChild(d.name, d.node)
312 }
313