// InitializeKeyspace sets the ipns record for the given key to // point to an empty directory. func InitializeKeyspace(n *core.IpfsNode, key ci.PrivKey) error { emptyDir := &mdag.Node{Data: ft.FolderPBData()} nodek, err := n.DAG.Add(emptyDir) if err != nil { return err } ctx, cancel := context.WithCancel(n.Context()) defer cancel() err = n.Pinning.Pin(ctx, emptyDir, false) if err != nil { return err } err = n.Pinning.Flush() if err != nil { return err } pub := nsys.NewRoutingPublisher(n.Routing, n.Repo.Datastore()) if err := pub.Publish(ctx, key, path.FromKey(nodek)); err != nil { return err } return nil }
func (d *Directory) Mkdir(name string) (*Directory, error) { d.lock.Lock() defer d.lock.Unlock() fsn, err := d.childUnsync(name) if err == nil { switch fsn := fsn.(type) { case *Directory: return fsn, os.ErrExist case *File: return nil, os.ErrExist default: return nil, fmt.Errorf("unrecognized type: %#v", fsn) } } ndir := &dag.Node{Data: ft.FolderPBData()} _, err = d.dserv.Add(ndir) if err != nil { return nil, err } err = d.node.AddNodeLinkClean(name, ndir) if err != nil { return nil, err } dirobj := NewDirectory(d.ctx, name, ndir, d, d.dserv) d.childDirs[name] = dirobj return dirobj, nil }
// InitializeKeyspace sets the ipns record for the given key to // point to an empty directory. // TODO: this doesnt feel like it belongs here func InitializeKeyspace(ctx context.Context, ds dag.DAGService, pub Publisher, pins pin.Pinner, key ci.PrivKey) error { emptyDir := &dag.Node{Data: ft.FolderPBData()} nodek, err := ds.Add(emptyDir) if err != nil { return err } // pin recursively because this might already be pinned // and doing a direct pin would throw an error in that case err = pins.Pin(ctx, emptyDir, true) if err != nil { return err } err = pins.Flush() if err != nil { return err } err = pub.Publish(ctx, key, path.FromKey(nodek)) if err != nil { return err } return nil }
func (d *Directory) Mkdir(name string) (*Directory, error) { d.lock.Lock() defer d.lock.Unlock() _, err := d.childDir(name) if err == nil { return nil, os.ErrExist } _, err = d.childFile(name) if err == nil { return nil, os.ErrExist } ndir := &dag.Node{Data: ft.FolderPBData()} err = d.node.AddNodeLinkClean(name, ndir) if err != nil { return nil, err } err = d.parent.closeChild(d.name, d.node) if err != nil { return nil, err } return d.childDir(name) }
func addDir(n *core.IpfsNode, dir files.File) (*merkledag.Node, error) { tree := &merkledag.Node{Data: unixfs.FolderPBData()} Loop: for { file, err := dir.NextFile() switch { case err != nil && err != io.EOF: return nil, err case err == io.EOF: break Loop } node, err := addFile(n, file) if err != nil { return nil, err } _, name := gopath.Split(file.FileName()) if err := tree.AddNodeLink(name, node); err != nil { return nil, err } } if err := addNode(n, tree); err != nil { return nil, err } return tree, nil }
func nodeFromTemplate(template string) (*dag.Node, error) { switch template { case "unixfs-dir": nd := new(dag.Node) nd.Data = ft.FolderPBData() return nd, nil default: return nil, fmt.Errorf("template '%s' not found", template) } }
func setupRoot(ctx context.Context, t *testing.T) (dag.DAGService, *Root) { ds := getDagserv(t) root := &dag.Node{Data: ft.FolderPBData()} rt, err := NewRoot(ctx, ds, root, func(ctx context.Context, k key.Key) error { fmt.Println("PUBLISHED: ", k) return nil }) if err != nil { t.Fatal(err) } return ds, rt }
func (s *Shell) NewObject(template string) (string, error) { node := new(dag.Node) switch template { case "": break case "unixfs-dir": node.Data = ft.FolderPBData() default: return "", fmt.Errorf("unknown template %s", template) } k, err := s.node.DAG.Add(node) if err != nil { return "", err } return k.B58String(), nil }
func (params *adder) addDir(file files.File) (*dag.Node, error) { tree := &dag.Node{Data: ft.FolderPBData()} log.Infof("adding directory: %s", file.FileName()) for { file, err := file.NextFile() if err != nil && err != io.EOF { return nil, err } if file == nil { break } node, err := params.addFile(file) if _, ok := err.(*hiddenFileError); ok { // hidden file error, set the node to nil for below node = nil } else if err != nil { return nil, err } if node != nil { _, name := path.Split(file.FileName()) err = tree.AddNodeLink(name, node) if err != nil { return nil, err } } } err := outputDagnode(params.out, file.FileName(), tree) if err != nil { return nil, err } k, err := params.node.DAG.Add(tree) if err != nil { return nil, err } params.node.Pinning.GetManual().PinWithMode(k, pin.Indirect) return tree, nil }
func addLinkCaller(req cmds.Request, root *dag.Node) (key.Key, error) { if len(req.Arguments()) < 4 { return "", fmt.Errorf("not enough arguments for add-link") } nd, err := req.InvocContext().GetNode() if err != nil { return "", err } path := req.Arguments()[2] childk := key.B58KeyDecode(req.Arguments()[3]) create, _, err := req.Option("create").Bool() if err != nil { return "", err } var createfunc func() *dag.Node if create { createfunc = func() *dag.Node { return &dag.Node{Data: ft.FolderPBData()} } } e := dagutils.NewDagEditor(nd.DAG, root) childnd, err := nd.DAG.Get(req.Context(), childk) if err != nil { return "", err } err = e.InsertNodeAtPath(req.Context(), path, childnd, createfunc) if err != nil { return "", err } nnode := e.GetNode() return nnode.Key() }
func addDir(n *core.IpfsNode, dir files.File, out chan interface{}, progress bool, useTrickle bool) (*dag.Node, error) { log.Infof("adding directory: %s", dir.FileName()) tree := &dag.Node{Data: ft.FolderPBData()} for { file, err := dir.NextFile() if err != nil && err != io.EOF { return nil, err } if file == nil { break } node, err := addFile(n, file, out, progress, false, useTrickle) if err != nil { return nil, err } _, name := path.Split(file.FileName()) err = tree.AddNodeLink(name, node) if err != nil { return nil, err } } err := outputDagnode(out, dir.FileName(), tree) if err != nil { return nil, err } k, err := n.DAG.Add(tree) if err != nil { return nil, err } n.Pinning.GetManual().PinWithMode(k, pin.Indirect) return tree, nil }
//TODO: hrm, maybe this interface could be better func (s *Shell) PatchLink(root, npath, childhash string, create bool) (string, error) { p, err := path.ParsePath(root) if err != nil { return "", err } rootnd, err := core.Resolve(s.ctx, s.node, p) if err != nil { return "", err } childpath, err := path.ParsePath(childhash) if err != nil { return "", err } nnode, err := core.Resolve(s.ctx, s.node, childpath) if err != nil { return "", err } e := dagutils.NewDagEditor(rootnd, s.node.DAG) err = e.InsertNodeAtPath(s.ctx, npath, nnode, func() *dag.Node { return &dag.Node{Data: ft.FolderPBData()} }) if err != nil { return "", err } _, err = e.Finalize(s.node.DAG) if err != nil { return "", err } final, err := e.GetNode().Key() if err != nil { return "", err } return final.B58String(), nil }
// TODO: generalize this to more than unix-fs nodes. func NewDirNode() *dag.Node { return &dag.Node{Data: unixfs.FolderPBData()} }
func emptyDirNode() *dag.ProtoNode { return dag.NodeWithData(ft.FolderPBData()) }
// TODO: generalize this to more than unix-fs nodes. func newDirNode() *dag.Node { return &dag.Node{Data: ft.FolderPBData()} }
return } path := req.Arguments()[1] childk := key.B58KeyDecode(req.Arguments()[2]) create, _, err := req.Option("create").Bool() if err != nil { res.SetError(err, cmds.ErrNormal) return } var createfunc func() *dag.Node if create { createfunc = func() *dag.Node { return &dag.Node{Data: ft.FolderPBData()} } } e := dagutils.NewDagEditor(root, nd.DAG) childnd, err := nd.DAG.Get(req.Context(), childk) if err != nil { res.SetError(err, cmds.ErrNormal) return } err = e.InsertNodeAtPath(req.Context(), path, childnd, createfunc) if err != nil { res.SetError(err, cmds.ErrNormal) return
func TestDirectoryLoadFromDag(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() ds, rt := setupRoot(ctx, t) rootdir := rt.GetValue().(*Directory) nd := getRandFile(t, ds, 1000) _, err := ds.Add(nd) if err != nil { t.Fatal(err) } fihash, err := nd.Multihash() if err != nil { t.Fatal(err) } dir := &dag.Node{Data: ft.FolderPBData()} _, err = ds.Add(dir) if err != nil { t.Fatal(err) } dirhash, err := dir.Multihash() if err != nil { t.Fatal(err) } top := &dag.Node{ Data: ft.FolderPBData(), Links: []*dag.Link{ &dag.Link{ Name: "a", Hash: fihash, }, &dag.Link{ Name: "b", Hash: dirhash, }, }, } err = rootdir.AddChild("foo", top) if err != nil { t.Fatal(err) } // get this dir topi, err := rootdir.Child("foo") if err != nil { t.Fatal(err) } topd := topi.(*Directory) // mkdir over existing but unloaded child file should fail _, err = topd.Mkdir("a") if err == nil { t.Fatal("expected to fail!") } // mkdir over existing but unloaded child dir should fail _, err = topd.Mkdir("b") if err == nil { t.Fatal("expected to fail!") } // adding a child over an existing path fails err = topd.AddChild("b", nd) if err == nil { t.Fatal("expected to fail!") } err = assertFileAtPath(ds, rootdir, nd, "foo/a") if err != nil { t.Fatal(err) } err = assertDirAtPath(rootdir, "foo/b", nil) if err != nil { t.Fatal(err) } err = rootdir.Unlink("foo") if err != nil { t.Fatal(err) } err = assertDirAtPath(rootdir, "", nil) if err != nil { t.Fatal(err) } }
// NewEmptyDirectory returns an empty merkledag Node with a folder Data chunk func NewEmptyDirectory() *mdag.Node { return &mdag.Node{Data: format.FolderPBData()} }
"github.com/ipfs/go-ipfs/importer/chunk" mfs "github.com/ipfs/go-ipfs/mfs" "github.com/ipfs/go-ipfs/pin" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" bs "github.com/ipfs/go-ipfs/blocks/blockstore" "github.com/ipfs/go-ipfs/commands/files" core "github.com/ipfs/go-ipfs/core" dag "github.com/ipfs/go-ipfs/merkledag" unixfs "github.com/ipfs/go-ipfs/unixfs" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" ) var log = logging.Logger("coreunix") var folderData = unixfs.FolderPBData() // how many bytes of progress to wait before sending a progress update message const progressReaderIncrement = 1024 * 256 type Link struct { Name, Hash string Size uint64 } type Object struct { Hash string Links []Link } type hiddenFileError struct {
// NewEmptyDirectory returns an empty merkledag Node with a folder Data chunk func NewEmptyDirectory() *mdag.ProtoNode { nd := new(mdag.ProtoNode) nd.SetData(format.FolderPBData()) return nd }