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
+}