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