@cryptotaxi247 / kubo / commits / cd108a0f8

cmds/file: use new cmds lib

License: MIT Signed-off-by: Overbool <overbool.xu@gmail.com>

Overbool committed Nov 9, 2018 at 09:26 UTC cd108a0f88ca56e327b94491440c8527a7ea31ab
3 files changed +45 -80
core/commands/root.go
+1 -1
@@ -138,7 +138,7 @@ var rootSubcommands = map[string]*cmds.Command{
138 "resolve": ResolveCmd,
139 "swarm": SwarmCmd,
140 "tar": TarCmd,
141 - "file": lgc.NewCommand(unixfs.UnixFSCmd),
141 + "file": unixfs.UnixFSCmd,
142 "update": lgc.NewCommand(ExternalBinary()),
143 "urlstore": urlStoreCmd,
144 "version": VersionCmd,
core/commands/unixfs/ls.go
+42 -61
@@ -1,17 +1,16 @@
1 package unixfs
2
3 import (
4 - "bytes"
4 "fmt"
5 "io"
6 "sort"
7 "text/tabwriter"
8
10 - cmds "github.com/ipfs/go-ipfs/commands"
11 - e "github.com/ipfs/go-ipfs/core/commands/e"
9 + cmdenv "github.com/ipfs/go-ipfs/core/commands/cmdenv"
10 iface "github.com/ipfs/go-ipfs/core/coreapi/interface"
11
12 unixfs "gx/ipfs/QmXLCwhHh7bxRsBnCKNE9BAN87V44aSxXLquZYTtjr6fZ3/go-unixfs"
13 + cmds "gx/ipfs/Qma6uuSyjkecGhMFFLfzyJDPyoDtNJSHJNweDccZhaWkgU/go-ipfs-cmds"
14 merkledag "gx/ipfs/QmaDBne4KeY3UepeqSVKYpSmQGa3q9zP6x3LfVF2UjF3Hc/go-merkledag"
15 cmdkit "gx/ipfs/Qmde5VP1qUkyQXKCfmEUA7bP64V2HAptbJ7phuPp7jXWwg/go-ipfs-cmdkit"
16 )
@@ -72,20 +71,22 @@ possible, please use 'ipfs ls' instead.
71 Arguments: []cmdkit.Argument{
72 cmdkit.StringArg("ipfs-path", true, true, "The path to the IPFS object(s) to list links from.").EnableStdin(),
73 },
75 - Run: func(req cmds.Request, res cmds.Response) {
76 - node, err := req.InvocContext().GetNode()
74 + Run: func(req *cmds.Request, res cmds.ResponseEmitter, env cmds.Environment) error {
75 + nd, err := cmdenv.GetNode(env)
76 if err != nil {
78 - res.SetError(err, cmdkit.ErrNormal)
79 - return
77 + return err
78 }
79
82 - api, err := req.InvocContext().GetApi()
80 + api, err := cmdenv.GetApi(env)
81 if err != nil {
84 - res.SetError(err, cmdkit.ErrNormal)
85 - return
82 + return err
83 }
84
88 - paths := req.Arguments()
85 + if err := req.ParseBodyArgs(); err != nil {
86 + return err
87 + }
88 +
89 + paths := req.Arguments
90
91 output := LsOutput{
92 Arguments: map[string]string{},
@@ -93,18 +94,16 @@ possible, please use 'ipfs ls' instead.
94 }
95
96 for _, p := range paths {
96 - ctx := req.Context()
97 + ctx := req.Context
98
99 fpath, err := iface.ParsePath(p)
100 if err != nil {
100 - res.SetError(err, cmdkit.ErrNormal)
101 - return
101 + return err
102 }
103
104 merkleNode, err := api.ResolveNode(ctx, fpath)
105 if err != nil {
106 - res.SetError(err, cmdkit.ErrNormal)
107 - return
106 + return err
107 }
108
109 c := merkleNode.Cid()
@@ -119,14 +118,12 @@ possible, please use 'ipfs ls' instead.
118
119 ndpb, ok := merkleNode.(*merkledag.ProtoNode)
120 if !ok {
122 - res.SetError(merkledag.ErrNotProtobuf, cmdkit.ErrNormal)
123 - return
121 + return merkledag.ErrNotProtobuf
122 }
123
124 unixFSNode, err := unixfs.FSNodeFromBytes(ndpb.Data())
125 if err != nil {
128 - res.SetError(err, cmdkit.ErrNormal)
129 - return
126 + return err
127 }
128
129 t := unixFSNode.Type()
@@ -142,27 +139,23 @@ possible, please use 'ipfs ls' instead.
139 break
140 case unixfs.THAMTShard:
141 // We need a streaming ls API for this.
145 - res.SetError(fmt.Errorf("cannot list large directories yet"), cmdkit.ErrNormal)
146 - return
142 + return fmt.Errorf("cannot list large directories yet")
143 case unixfs.TDirectory:
144 links := make([]LsLink, len(merkleNode.Links()))
145 output.Objects[hash].Links = links
146 for i, link := range merkleNode.Links() {
151 - linkNode, err := link.GetNode(ctx, node.DAG)
147 + linkNode, err := link.GetNode(ctx, nd.DAG)
148 if err != nil {
153 - res.SetError(err, cmdkit.ErrNormal)
154 - return
149 + return err
150 }
151 lnpb, ok := linkNode.(*merkledag.ProtoNode)
152 if !ok {
158 - res.SetError(merkledag.ErrNotProtobuf, cmdkit.ErrNormal)
159 - return
153 + return merkledag.ErrNotProtobuf
154 }
155
156 d, err := unixfs.FSNodeFromBytes(lnpb.Data())
157 if err != nil {
164 - res.SetError(err, cmdkit.ErrNormal)
165 - return
158 + return err
159 }
160 t := d.Type()
161 lsLink := LsLink{
@@ -178,36 +171,24 @@ possible, please use 'ipfs ls' instead.
171 links[i] = lsLink
172 }
173 case unixfs.TSymlink:
181 - res.SetError(fmt.Errorf("cannot list symlinks yet"), cmdkit.ErrNormal)
182 - return
174 + return fmt.Errorf("cannot list symlinks yet")
175 default:
184 - res.SetError(fmt.Errorf("unrecognized type: %s", t), cmdkit.ErrImplementation)
185 - return
176 + return fmt.Errorf("unrecognized type: %s", t)
177 }
178 }
179
189 - res.SetOutput(&output)
180 + return cmds.EmitOnce(res, &output)
181 },
191 - Marshalers: cmds.MarshalerMap{
192 - cmds.Text: func(res cmds.Response) (io.Reader, error) {
193 - v, err := unwrapOutput(res.Output())
194 - if err != nil {
195 - return nil, err
196 - }
197 -
198 - output, ok := v.(*LsOutput)
199 - if !ok {
200 - return nil, e.TypeErr(output, v)
201 - }
202 - buf := new(bytes.Buffer)
203 - w := tabwriter.NewWriter(buf, 1, 2, 1, ' ', 0)
182 + Encoders: cmds.EncoderMap{
183 + cmds.Text: cmds.MakeTypedEncoder(func(req *cmds.Request, w io.Writer, out *LsOutput) error {
184 + tw := tabwriter.NewWriter(w, 1, 2, 1, ' ', 0)
185
186 nonDirectories := []string{}
187 directories := []string{}
207 - for argument, hash := range output.Arguments {
208 - object, ok := output.Objects[hash]
188 + for argument, hash := range out.Arguments {
189 + object, ok := out.Objects[hash]
190 if !ok {
210 - return nil, fmt.Errorf("unresolved hash: %s", hash)
191 + return fmt.Errorf("unresolved hash: %s", hash)
192 }
193
194 if object.Type == "Directory" {
@@ -220,36 +201,36 @@ possible, please use 'ipfs ls' instead.
201 sort.Strings(directories)
202
203 for _, argument := range nonDirectories {
223 - fmt.Fprintf(w, "%s\n", argument)
204 + fmt.Fprintf(tw, "%s\n", argument)
205 }
206
207 seen := map[string]bool{}
208 for i, argument := range directories {
228 - hash := output.Arguments[argument]
209 + hash := out.Arguments[argument]
210 if _, ok := seen[hash]; ok {
211 continue
212 }
213 seen[hash] = true
214
234 - object := output.Objects[hash]
215 + object := out.Objects[hash]
216 if i > 0 || len(nonDirectories) > 0 {
236 - fmt.Fprintln(w)
217 + fmt.Fprintln(tw)
218 }
238 - if len(output.Arguments) > 1 {
219 + if len(out.Arguments) > 1 {
220 for _, arg := range directories[i:] {
240 - if output.Arguments[arg] == hash {
241 - fmt.Fprintf(w, "%s:\n", arg)
221 + if out.Arguments[arg] == hash {
222 + fmt.Fprintf(tw, "%s:\n", arg)
223 }
224 }
225 }
226 for _, link := range object.Links {
246 - fmt.Fprintf(w, "%s\n", link.Name)
227 + fmt.Fprintf(tw, "%s\n", link.Name)
228 }
229 }
249 - w.Flush()
230 + tw.Flush()
231
251 - return buf, nil
252 - },
232 + return nil
233 + }),
234 },
235 Type: LsOutput{},
236 }
core/commands/unixfs/unixfs.go
+2 -18
@@ -1,10 +1,8 @@
1 package unixfs
2
3 import (
4 - cmds "github.com/ipfs/go-ipfs/commands"
5 - e "github.com/ipfs/go-ipfs/core/commands/e"
6 -
7 - "gx/ipfs/Qmde5VP1qUkyQXKCfmEUA7bP64V2HAptbJ7phuPp7jXWwg/go-ipfs-cmdkit"
4 + cmds "gx/ipfs/Qma6uuSyjkecGhMFFLfzyJDPyoDtNJSHJNweDccZhaWkgU/go-ipfs-cmds"
5 + cmdkit "gx/ipfs/Qmde5VP1qUkyQXKCfmEUA7bP64V2HAptbJ7phuPp7jXWwg/go-ipfs-cmdkit"
6 )
7
8 var UnixFSCmd = &cmds.Command{
@@ -26,17 +24,3 @@ objects (e.g. fanout and chunking).
24 "ls": LsCmd,
25 },
26 }
29 -
30 -// copy+pasted from ../commands.go
31 -func unwrapOutput(i interface{}) (interface{}, error) {
32 - var (
33 - ch <-chan interface{}
34 - ok bool
35 - )
36 -
37 - if ch, ok = i.(<-chan interface{}); !ok {
38 - return nil, e.TypeErr(ch, i)
39 - }
40 -
41 - return <-ch, nil
42 -}