提交 332d4aea 作者: Łukasz Magiera

coreapi unixfs: change Wrap logic to make more sense

License: MIT
Signed-off-by: 's avatarŁukasz Magiera <magik6k@gmail.com>
上级 a410f7e2
...@@ -95,6 +95,7 @@ func (api *UnixfsAPI) Add(ctx context.Context, files files.Node, opts ...options ...@@ -95,6 +95,7 @@ func (api *UnixfsAPI) Add(ctx context.Context, files files.Node, opts ...options
fileAdder.NoCopy = settings.NoCopy fileAdder.NoCopy = settings.NoCopy
fileAdder.Name = settings.StdinName fileAdder.Name = settings.StdinName
fileAdder.CidBuilder = prefix fileAdder.CidBuilder = prefix
fileAdder.TopHidden = settings.TopHidden
switch settings.Layout { switch settings.Layout {
case options.BalancedLayout: case options.BalancedLayout:
......
...@@ -68,6 +68,7 @@ type Adder struct { ...@@ -68,6 +68,7 @@ type Adder struct {
Out chan<- interface{} Out chan<- interface{}
Progress bool Progress bool
Hidden bool Hidden bool
TopHidden bool
Pin bool Pin bool
Trickle bool Trickle bool
RawLeaves bool RawLeaves bool
...@@ -192,53 +193,6 @@ func (adder *Adder) PinRoot() error { ...@@ -192,53 +193,6 @@ func (adder *Adder) PinRoot() error {
return adder.pinning.Flush() return adder.pinning.Flush()
} }
// Finalize flushes the mfs root directory and returns the mfs root node.
func (adder *Adder) Finalize() (ipld.Node, error) {
mr, err := adder.mfsRoot()
if err != nil {
return nil, err
}
var root mfs.FSNode
rootdir := mr.GetDirectory()
root = rootdir
err = root.Flush()
if err != nil {
return nil, err
}
var name string
if !adder.Wrap {
children, err := rootdir.ListNames(adder.ctx)
if err != nil {
return nil, err
}
if len(children) == 0 {
return nil, fmt.Errorf("expected at least one child dir, got none")
}
// Replace root with the first child
name = children[0]
root, err = rootdir.Child(name)
if err != nil {
return nil, err
}
}
err = adder.outputDirs(name, root)
if err != nil {
return nil, err
}
err = mr.Close()
if err != nil {
return nil, err
}
return root.GetNode()
}
func (adder *Adder) outputDirs(path string, fsn mfs.FSNode) error { func (adder *Adder) outputDirs(path string, fsn mfs.FSNode) error {
switch fsn := fsn.(type) { switch fsn := fsn.(type) {
case *mfs.File: case *mfs.File:
...@@ -321,30 +275,88 @@ func (adder *Adder) AddAllAndPin(file files.Node) (ipld.Node, error) { ...@@ -321,30 +275,88 @@ func (adder *Adder) AddAllAndPin(file files.Node) (ipld.Node, error) {
} }
}() }()
switch tf := file.(type) { d, dir := file.(files.Directory)
case files.Directory: if !dir || !adder.TopHidden {
d = files.NewSliceDirectory([]files.DirEntry{
files.FileEntry("", file),
})
}
// Iterate over each top-level file and add individually. Otherwise the // Iterate over each top-level file and add individually. Otherwise the
// single files.File f is treated as a directory, affecting hidden file // single files.File f is treated as a directory, affecting hidden file
// semantics. // semantics.
it := tf.Entries() it := d.Entries()
for it.Next() { for it.Next() {
if err := adder.addFileNode(it.Name(), it.Node()); err != nil { if err := adder.addFileNode(it.Name(), it.Node(), true); err != nil {
return nil, err return nil, err
} }
} }
if it.Err() != nil { if it.Err() != nil {
return nil, it.Err() return nil, it.Err()
} }
break
default: mr, err := adder.mfsRoot()
if err := adder.addFileNode("", file); err != nil { if err != nil {
return nil, err
}
var root mfs.FSNode
rootdir := mr.GetDirectory()
root = rootdir
err = root.Flush()
if err != nil {
return nil, err
}
var name string
if !adder.Wrap && !dir {
children, err := rootdir.ListNames(adder.ctx)
if err != nil {
return nil, err
}
if len(children) == 0 {
return nil, fmt.Errorf("expected at least one child dir, got none")
}
// Replace root with the first child
name = children[0]
root, err = rootdir.Child(name)
if err != nil {
return nil, err return nil, err
} }
break
} }
// copy intermediary nodes from editor to our actual dagservice err = mr.Close()
nd, err := adder.Finalize() if err != nil {
return nil, err
}
nd, err := root.GetNode()
if err != nil {
return nil, err
}
if adder.Wrap && dir {
name = nd.Cid().String()
end := unixfs.EmptyDirNode()
if err := end.AddNodeLink(nd.Cid().String(), nd); err != nil {
return nil, err
}
nd = end
if err := adder.dagService.Add(adder.ctx, end); err != nil {
return nil, err
}
if err := outputDagnode(adder.Out, "", nd); err != nil {
return nil, err
}
}
err = adder.outputDirs(name, root)
if err != nil { if err != nil {
return nil, err return nil, err
} }
...@@ -355,8 +367,11 @@ func (adder *Adder) AddAllAndPin(file files.Node) (ipld.Node, error) { ...@@ -355,8 +367,11 @@ func (adder *Adder) AddAllAndPin(file files.Node) (ipld.Node, error) {
return nd, adder.PinRoot() return nd, adder.PinRoot()
} }
func (adder *Adder) addFileNode(path string, file files.Node) error { func (adder *Adder) addFileNode(path string, file files.Node, toplevel bool) error {
if !toplevel {
defer file.Close() defer file.Close()
}
err := adder.maybePauseForGC() err := adder.maybePauseForGC()
if err != nil { if err != nil {
return err return err
...@@ -378,7 +393,7 @@ func (adder *Adder) addFileNode(path string, file files.Node) error { ...@@ -378,7 +393,7 @@ func (adder *Adder) addFileNode(path string, file files.Node) error {
switch f := file.(type) { switch f := file.(type) {
case files.Directory: case files.Directory:
return adder.addDir(path, f) return adder.addDir(path, f, toplevel)
case *files.Symlink: case *files.Symlink:
return adder.addSymlink(path, f) return adder.addSymlink(path, f)
case files.File: case files.File:
...@@ -433,9 +448,10 @@ func (adder *Adder) addFile(path string, file files.File) error { ...@@ -433,9 +448,10 @@ func (adder *Adder) addFile(path string, file files.File) error {
return adder.addNode(dagnode, path) return adder.addNode(dagnode, path)
} }
func (adder *Adder) addDir(path string, dir files.Directory) error { func (adder *Adder) addDir(path string, dir files.Directory, toplevel bool) error {
log.Infof("adding directory: %s", path) log.Infof("adding directory: %s", path)
if !(toplevel && path == "") {
mr, err := adder.mfsRoot() mr, err := adder.mfsRoot()
if err != nil { if err != nil {
return err return err
...@@ -448,6 +464,7 @@ func (adder *Adder) addDir(path string, dir files.Directory) error { ...@@ -448,6 +464,7 @@ func (adder *Adder) addDir(path string, dir files.Directory) error {
if err != nil { if err != nil {
return err return err
} }
}
it := dir.Entries() it := dir.Entries()
for it.Next() { for it.Next() {
...@@ -458,7 +475,7 @@ func (adder *Adder) addDir(path string, dir files.Directory) error { ...@@ -458,7 +475,7 @@ func (adder *Adder) addDir(path string, dir files.Directory) error {
log.Infof("%s is hidden, skipping", fpath) log.Infof("%s is hidden, skipping", fpath)
continue continue
} }
err = adder.addFileNode(fpath, it.Node()) err := adder.addFileNode(fpath, it.Node(), false)
if err != nil { if err != nil {
return err return err
} }
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论