@cryptotaxi247 / kubo / commits / 8a07a6264

added path resolution

Juan Batiz-Benet committed Jul 6, 2014 at 00:07 UTC 8a07a6264390906ecf9f13ca4f4fdd0872440764
5 files changed +97 -30
cli/cat.go
+1 -8
@@ -4,7 +4,6 @@ import (
4 "github.com/gonuts/flag"
5 "github.com/jbenet/commander"
6 u "github.com/jbenet/go-ipfs/util"
7 - mh "github.com/jbenet/go-multihash"
7 )
8
9 var cmdIpfsCat = &commander.Command{
@@ -31,13 +30,7 @@ func catCmd(c *commander.Command, inp []string) error {
30 }
31
32 for _, fn := range inp {
34 - // for now only hashes, no path resolution
35 - h, err := mh.FromB58String(fn)
36 - if err != nil {
37 - return err
38 - }
39 -
40 - nd, err := n.DAG.Get(u.Key(h))
33 + nd, err := n.Resolver.ResolvePath(fn)
34 if err != nil {
35 return err
36 }
cli/ls.go
+1 -8
@@ -4,7 +4,6 @@ import (
4 "github.com/gonuts/flag"
5 "github.com/jbenet/commander"
6 u "github.com/jbenet/go-ipfs/util"
7 - mh "github.com/jbenet/go-multihash"
7 )
8
9 var cmdIpfsLs = &commander.Command{
@@ -34,13 +33,7 @@ func lsCmd(c *commander.Command, inp []string) error {
33 }
34
35 for _, fn := range inp {
37 - // for now only hashes, no path resolution
38 - h, err := mh.FromB58String(fn)
39 - if err != nil {
40 - return err
41 - }
42 -
43 - nd, err := n.DAG.Get(u.Key(h))
36 + nd, err := n.Resolver.ResolvePath(fn)
37 if err != nil {
38 return err
39 }
cli/refs.go
+13 -11
@@ -3,6 +3,7 @@ package main
3 import (
4 "github.com/gonuts/flag"
5 "github.com/jbenet/commander"
6 + mdag "github.com/jbenet/go-ipfs/merkledag"
7 u "github.com/jbenet/go-ipfs/util"
8 mh "github.com/jbenet/go-multihash"
9 )
@@ -56,30 +57,31 @@ func refCmd(c *commander.Command, inp []string) error {
57 u.POut("%s\n", h.B58String())
58 }
59
59 - var printRefs func(h mh.Multihash, recursive bool)
60 - printRefs = func(h mh.Multihash, recursive bool) {
61 - nd, err := n.DAG.Get(u.Key(h))
62 - if err != nil {
63 - u.PErr("error: cannot retrieve %s (%s)\n", h.B58String(), err)
64 - return
65 - }
60 + var printRefs func(nd *mdag.Node, recursive bool)
61 + printRefs = func(nd *mdag.Node, recursive bool) {
62
63 for _, link := range nd.Links {
64 printRef(link.Hash)
65 +
66 if recursive {
70 - printRefs(link.Hash, recursive)
67 + nd, err := n.DAG.Get(u.Key(link.Hash))
68 + if err != nil {
69 + u.PErr("error: cannot retrieve %s (%s)\n", link.Hash.B58String(), err)
70 + return
71 + }
72 +
73 + printRefs(nd, recursive)
74 }
75 }
76 }
77
78 for _, fn := range inp {
76 - // for now only hashes, no path resolution
77 - h, err := mh.FromB58String(fn)
79 + nd, err := n.Resolver.ResolvePath(fn)
80 if err != nil {
81 return err
82 }
83
82 - printRefs(h, recursive)
84 + printRefs(nd, recursive)
85 }
86 return nil
87 }
core/core.go
+5 -3
@@ -6,6 +6,7 @@ import (
6 blocks "github.com/jbenet/go-ipfs/blocks"
7 config "github.com/jbenet/go-ipfs/config"
8 merkledag "github.com/jbenet/go-ipfs/merkledag"
9 + path "github.com/jbenet/go-ipfs/path"
10 peer "github.com/jbenet/go-ipfs/peer"
11 )
12
@@ -40,7 +41,7 @@ type IpfsNode struct {
41 DAG *merkledag.DAGService
42
43 // the path resolution system
43 - // Resolver *resolver.PathResolver
44 + Resolver *path.Resolver
45
46 // the name system, resolves paths to hashes
47 // Namesys *namesys.Namesys
@@ -61,14 +62,15 @@ func NewIpfsNode(cfg *config.Config) (*IpfsNode, error) {
62 return nil, err
63 }
64
64 - dag := &merkledag.DAGService{ Blocks: bs }
65 + dag := &merkledag.DAGService{Blocks: bs}
66
67 n := &IpfsNode{
68 Config: cfg,
69 PeerBook: &peer.PeerBook{},
70 Datastore: d,
71 Blocks: bs,
71 - DAG: dag,
72 + DAG: dag,
73 + Resolver: &path.Resolver{DAG: dag},
74 }
75
76 return n, nil
path/path.go
+77
@@ -0,0 +1,77 @@
1 +package path
2 +
3 +import (
4 + "fmt"
5 + merkledag "github.com/jbenet/go-ipfs/merkledag"
6 + u "github.com/jbenet/go-ipfs/util"
7 + mh "github.com/jbenet/go-multihash"
8 + "path"
9 + "strings"
10 +)
11 +
12 +// Path resolution for IPFS
13 +
14 +type Resolver struct {
15 + DAG *merkledag.DAGService
16 +}
17 +
18 +func (s *Resolver) ResolvePath(fpath string) (*merkledag.Node, error) {
19 + fpath = path.Clean(fpath)
20 +
21 + parts := strings.Split(fpath, "/")
22 +
23 + // skip over empty first elem
24 + if len(parts[0]) == 0 {
25 + parts = parts[1:]
26 + }
27 +
28 + // if nothing, bail.
29 + if len(parts) == 0 {
30 + return nil, fmt.Errorf("ipfs path must contain at least one component.")
31 + }
32 +
33 + // first element in the path is a b58 hash (for now)
34 + h, err := mh.FromB58String(parts[0])
35 + if err != nil {
36 + return nil, err
37 + }
38 +
39 + nd, err := s.DAG.Get(u.Key(h))
40 + if err != nil {
41 + return nil, err
42 + }
43 +
44 + return s.ResolveLinks(nd, parts[1:])
45 +}
46 +
47 +func (s *Resolver) ResolveLinks(ndd *merkledag.Node, names []string) (
48 + nd *merkledag.Node, err error) {
49 +
50 + nd = ndd // dup arg workaround
51 +
52 + // for each of the path components
53 + for _, name := range names {
54 +
55 + var next u.Key
56 + // for each of the links in nd, the current object
57 + for _, link := range nd.Links {
58 + if link.Name == name {
59 + next = u.Key(link.Hash)
60 + break
61 + }
62 + }
63 +
64 + if next == "" {
65 + h1, _ := nd.Multihash()
66 + h2 := h1.B58String()
67 + return nil, fmt.Errorf("no link named \"%s\" under %s", name, h2)
68 + }
69 +
70 + // fetch object for link and assign to nd
71 + nd, err = s.DAG.Get(next)
72 + if err != nil {
73 + return nd, err
74 + }
75 + }
76 + return
77 +}