1
1
package unixfs
2
2
3
3
import (
4
- "bytes"
5
4
"fmt"
6
5
"io"
7
6
"sort"
8
7
"text/tabwriter"
9
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"
12
10
iface "github.com/ipfs/go-ipfs/core/coreapi/interface"
13
11
14
12
unixfs "gx/ipfs/QmXLCwhHh7bxRsBnCKNE9BAN87V44aSxXLquZYTtjr6fZ3/go-unixfs"
13
+ cmds "gx/ipfs/Qma6uuSyjkecGhMFFLfzyJDPyoDtNJSHJNweDccZhaWkgU/go-ipfs-cmds"
15
14
merkledag "gx/ipfs/QmaDBne4KeY3UepeqSVKYpSmQGa3q9zP6x3LfVF2UjF3Hc/go-merkledag"
16
15
cmdkit "gx/ipfs/Qmde5VP1qUkyQXKCfmEUA7bP64V2HAptbJ7phuPp7jXWwg/go-ipfs-cmdkit"
17
16
)
@@ -72,39 +71,39 @@ possible, please use 'ipfs ls' instead.
72
71
Arguments : []cmdkit.Argument {
73
72
cmdkit .StringArg ("ipfs-path" , true , true , "The path to the IPFS object(s) to list links from." ).EnableStdin (),
74
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 )
77
76
if err != nil {
78
- res .SetError (err , cmdkit .ErrNormal )
79
- return
77
+ return err
80
78
}
81
79
82
- api , err := req . InvocContext (). GetApi ()
80
+ api , err := cmdenv . GetApi (env )
83
81
if err != nil {
84
- res .SetError (err , cmdkit .ErrNormal )
85
- return
82
+ return err
86
83
}
87
84
88
- paths := req .Arguments ()
85
+ if err := req .ParseBodyArgs (); err != nil {
86
+ return err
87
+ }
88
+
89
+ paths := req .Arguments
89
90
90
91
output := LsOutput {
91
92
Arguments : map [string ]string {},
92
93
Objects : map [string ]* LsObject {},
93
94
}
94
95
95
96
for _ , p := range paths {
96
- ctx := req .Context ()
97
+ ctx := req .Context
97
98
98
99
fpath , err := iface .ParsePath (p )
99
100
if err != nil {
100
- res .SetError (err , cmdkit .ErrNormal )
101
- return
101
+ return err
102
102
}
103
103
104
104
merkleNode , err := api .ResolveNode (ctx , fpath )
105
105
if err != nil {
106
- res .SetError (err , cmdkit .ErrNormal )
107
- return
106
+ return err
108
107
}
109
108
110
109
c := merkleNode .Cid ()
@@ -119,14 +118,12 @@ possible, please use 'ipfs ls' instead.
119
118
120
119
ndpb , ok := merkleNode .(* merkledag.ProtoNode )
121
120
if ! ok {
122
- res .SetError (merkledag .ErrNotProtobuf , cmdkit .ErrNormal )
123
- return
121
+ return merkledag .ErrNotProtobuf
124
122
}
125
123
126
124
unixFSNode , err := unixfs .FSNodeFromBytes (ndpb .Data ())
127
125
if err != nil {
128
- res .SetError (err , cmdkit .ErrNormal )
129
- return
126
+ return err
130
127
}
131
128
132
129
t := unixFSNode .Type ()
@@ -142,27 +139,23 @@ possible, please use 'ipfs ls' instead.
142
139
break
143
140
case unixfs .THAMTShard :
144
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" )
147
143
case unixfs .TDirectory :
148
144
links := make ([]LsLink , len (merkleNode .Links ()))
149
145
output .Objects [hash ].Links = links
150
146
for i , link := range merkleNode .Links () {
151
- linkNode , err := link .GetNode (ctx , node .DAG )
147
+ linkNode , err := link .GetNode (ctx , nd .DAG )
152
148
if err != nil {
153
- res .SetError (err , cmdkit .ErrNormal )
154
- return
149
+ return err
155
150
}
156
151
lnpb , ok := linkNode .(* merkledag.ProtoNode )
157
152
if ! ok {
158
- res .SetError (merkledag .ErrNotProtobuf , cmdkit .ErrNormal )
159
- return
153
+ return merkledag .ErrNotProtobuf
160
154
}
161
155
162
156
d , err := unixfs .FSNodeFromBytes (lnpb .Data ())
163
157
if err != nil {
164
- res .SetError (err , cmdkit .ErrNormal )
165
- return
158
+ return err
166
159
}
167
160
t := d .Type ()
168
161
lsLink := LsLink {
@@ -178,36 +171,24 @@ possible, please use 'ipfs ls' instead.
178
171
links [i ] = lsLink
179
172
}
180
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" )
183
175
default :
184
- res .SetError (fmt .Errorf ("unrecognized type: %s" , t ), cmdkit .ErrImplementation )
185
- return
176
+ return fmt .Errorf ("unrecognized type: %s" , t )
186
177
}
187
178
}
188
179
189
- res . SetOutput ( & output )
180
+ return cmds . EmitOnce ( res , & output )
190
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 )
204
185
205
186
nonDirectories := []string {}
206
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 ]
209
190
if ! ok {
210
- return nil , fmt .Errorf ("unresolved hash: %s" , hash )
191
+ return fmt .Errorf ("unresolved hash: %s" , hash )
211
192
}
212
193
213
194
if object .Type == "Directory" {
@@ -220,36 +201,36 @@ possible, please use 'ipfs ls' instead.
220
201
sort .Strings (directories )
221
202
222
203
for _ , argument := range nonDirectories {
223
- fmt .Fprintf (w , "%s\n " , argument )
204
+ fmt .Fprintf (tw , "%s\n " , argument )
224
205
}
225
206
226
207
seen := map [string ]bool {}
227
208
for i , argument := range directories {
228
- hash := output .Arguments [argument ]
209
+ hash := out .Arguments [argument ]
229
210
if _ , ok := seen [hash ]; ok {
230
211
continue
231
212
}
232
213
seen [hash ] = true
233
214
234
- object := output .Objects [hash ]
215
+ object := out .Objects [hash ]
235
216
if i > 0 || len (nonDirectories ) > 0 {
236
- fmt .Fprintln (w )
217
+ fmt .Fprintln (tw )
237
218
}
238
- if len (output .Arguments ) > 1 {
219
+ if len (out .Arguments ) > 1 {
239
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 )
242
223
}
243
224
}
244
225
}
245
226
for _ , link := range object .Links {
246
- fmt .Fprintf (w , "%s\n " , link .Name )
227
+ fmt .Fprintf (tw , "%s\n " , link .Name )
247
228
}
248
229
}
249
- w .Flush ()
230
+ tw .Flush ()
250
231
251
- return buf , nil
252
- },
232
+ return nil
233
+ }) ,
253
234
},
254
235
Type : LsOutput {},
255
236
}
0 commit comments