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