@cryptotaxi247 / kubo / commits / 6faeee830

cmds2/add: temp fix for -r. horrible hack

This will be removed soon, just gets us past landing cmds2.

Juan Batiz-Benet committed Nov 11, 2014 at 22:43 UTC 6faeee830098166c371640669ff8877d73fbe951
1 file changed +104 -12
core/commands2/add.go
+104 -12
@@ -4,6 +4,9 @@ import (
4 "errors"
5 "fmt"
6 "io"
7 + "io/ioutil"
8 + "os"
9 + "path/filepath"
10
11 cmds "github.com/jbenet/go-ipfs/commands"
12 core "github.com/jbenet/go-ipfs/core"
@@ -12,6 +15,7 @@ import (
15 "github.com/jbenet/go-ipfs/importer/chunk"
16 dag "github.com/jbenet/go-ipfs/merkledag"
17 pinning "github.com/jbenet/go-ipfs/pin"
18 + ft "github.com/jbenet/go-ipfs/unixfs"
19 )
20
21 // Error indicating the max depth has been exceded.
@@ -26,7 +30,7 @@ var addCmd = &cmds.Command{
30 cmds.BoolOption("recursive", "r", "Must be specified when adding directories"),
31 },
32 Arguments: []cmds.Argument{
29 - cmds.FileArg("file", true, true, "The path to a file to be added to IPFS"),
33 + cmds.StringArg("file", true, true, "The path to a file to be added to IPFS"),
34 },
35 Description: "Add an object to ipfs.",
36 Help: `Adds contents of <path> to ipfs. Use -r to add directories.
@@ -37,27 +41,115 @@ remains to be implemented.
41 Run: func(req cmds.Request) (interface{}, error) {
42 n := req.Context().Node
43
40 - readers, err := internal.CastToReaders(req.Arguments())
41 - if err != nil {
42 - return nil, err
44 + // THIS IS A HORRIBLE HACK -- FIXME!!!
45 + // see https://github.com/jbenet/go-ipfs/issues/309
46 + var added []*Object
47 +
48 + // returns the last one
49 + addDagnodes := func(dns []*dag.Node) error {
50 + for _, dn := range dns {
51 + o, err := getOutput(dn)
52 + if err != nil {
53 + return err
54 + }
55 +
56 + added = append(added, o)
57 + }
58 + return nil
59 }
60
45 - dagnodes, err := add(n, readers)
46 - if err != nil {
47 - return nil, err
61 + addFile := func(name string) (*dag.Node, error) {
62 + f, err := os.Open(name)
63 + if err != nil {
64 + return nil, err
65 + }
66 + defer f.Close()
67 +
68 + dns, err := add(n, []io.Reader{f})
69 + if err != nil {
70 + return nil, err
71 + }
72 +
73 + if err := addDagnodes(dns); err != nil {
74 + return nil, err
75 + }
76 + return dns[len(dns)-1], nil // last dag node is the file.
77 }
78
50 - // TODO: include fs paths in output (will need a way to specify paths in underlying filearg system)
51 - added := make([]*Object, 0, len(req.Arguments()))
52 - for _, dagnode := range dagnodes {
53 - object, err := getOutput(dagnode)
79 + var addPath func(name string) (*dag.Node, error)
80 + addDir := func(name string) (*dag.Node, error) {
81 + tree := &dag.Node{Data: ft.FolderPBData()}
82 +
83 + entries, err := ioutil.ReadDir(name)
84 if err != nil {
85 return nil, err
86 }
87
58 - added = append(added, object)
88 + // construct nodes for containing files.
89 + for _, e := range entries {
90 + fp := filepath.Join(name, e.Name())
91 + nd, err := addPath(fp)
92 + if err != nil {
93 + return nil, err
94 + }
95 +
96 + if err = tree.AddNodeLink(e.Name(), nd); err != nil {
97 + return nil, err
98 + }
99 + }
100 +
101 + log.Infof("adding dir: %s", name)
102 +
103 + if err := addDagnodes([]*dag.Node{tree}); err != nil {
104 + return nil, err
105 + }
106 + return tree, nil
107 + }
108 +
109 + addPath = func(fpath string) (*dag.Node, error) {
110 + fi, err := os.Stat(fpath)
111 + if err != nil {
112 + return nil, err
113 + }
114 +
115 + if fi.IsDir() {
116 + return addDir(fpath)
117 + }
118 + return addFile(fpath)
119 }
120
121 + paths, err := internal.CastToStrings(req.Arguments())
122 + if err != nil {
123 + return nil, err
124 + }
125 +
126 + for _, f := range paths {
127 + if _, err := addPath(f); err != nil {
128 + return nil, err
129 + }
130 + }
131 +
132 + // readers, err := internal.CastToReaders(req.Arguments())
133 + // if err != nil {
134 + // return nil, err
135 + // }
136 + //
137 + // dagnodes, err := add(n, readers)
138 + // if err != nil {
139 + // return nil, err
140 + // }
141 + //
142 + // // TODO: include fs paths in output (will need a way to specify paths in underlying filearg system)
143 + // added := make([]*Object, 0, len(req.Arguments()))
144 + // for _, dagnode := range dagnodes {
145 + // object, err := getOutput(dagnode)
146 + // if err != nil {
147 + // return nil, err
148 + // }
149 + //
150 + // added = append(added, object)
151 + // }
152 +
153 return &AddOutput{added}, nil
154 },
155 Marshallers: map[cmds.EncodingType]cmds.Marshaller{