66 "io"
77 "text/tabwriter"
88
9- cmds "github.com/ipfs/go-ipfs/commands"
10- e "github.com/ipfs/go-ipfs/core/commands/e"
9+ cmdenv "github.com/ipfs/go-ipfs/core/commands/cmdenv"
1110 iface "github.com/ipfs/go-ipfs/core/coreapi/interface"
1211
1312 cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid"
@@ -18,7 +17,8 @@ import (
1817 blockservice "gx/ipfs/QmWfhv1D18DRSiSm73r4QGcByspzPtxxRTcmHW3axFXZo8/go-blockservice"
1918 merkledag "gx/ipfs/QmY8BMUSpCwNiTmFhACmC9Bt1qT63cHP35AoQAus4x14qH/go-merkledag"
2019 ipld "gx/ipfs/QmdDXJs4axxefSPgK6Y1QhpJWKuDPnGJiqgq4uncb4rFHL/go-ipld-format"
21- "gx/ipfs/Qmde5VP1qUkyQXKCfmEUA7bP64V2HAptbJ7phuPp7jXWwg/go-ipfs-cmdkit"
20+ cmds "gx/ipfs/QmdTmGruUz23vgzym3uWpnAEQdGdGifQqBvP8UXSRjG8gZ/go-ipfs-cmds"
21+ cmdkit "gx/ipfs/Qmde5VP1qUkyQXKCfmEUA7bP64V2HAptbJ7phuPp7jXWwg/go-ipfs-cmdkit"
2222)
2323
2424type LsLink struct {
@@ -61,30 +61,18 @@ The JSON output contains type information.
6161 cmdkit .BoolOption (lsHeadersOptionNameTime , "v" , "Print table headers (Hash, Size, Name)." ),
6262 cmdkit .BoolOption (lsResolveTypeOptionName , "Resolve linked objects to find out their types." ).WithDefault (true ),
6363 },
64- Run : func (req cmds.Request , res cmds.Response ) {
65- nd , err := req . InvocContext (). GetNode ()
64+ Run : func (req * cmds.Request , res cmds.ResponseEmitter , env cmds. Environment ) error {
65+ nd , err := cmdenv . GetNode (env )
6666 if err != nil {
67- res .SetError (err , cmdkit .ErrNormal )
68- return
67+ return err
6968 }
7069
71- api , err := req . InvocContext (). GetApi ()
70+ api , err := cmdenv . GetApi (env )
7271 if err != nil {
73- res .SetError (err , cmdkit .ErrNormal )
74- return
72+ return err
7573 }
7674
77- // get options early -> exit early in case of error
78- if _ , _ , err := req .Option (lsHeadersOptionNameTime ).Bool (); err != nil {
79- res .SetError (err , cmdkit .ErrNormal )
80- return
81- }
82-
83- resolve , _ , err := req .Option (lsResolveTypeOptionName ).Bool ()
84- if err != nil {
85- res .SetError (err , cmdkit .ErrNormal )
86- return
87- }
75+ resolve , _ := req .Options [lsResolveTypeOptionName ].(bool )
8876
8977 dserv := nd .DAG
9078 if ! resolve {
@@ -93,43 +81,39 @@ The JSON output contains type information.
9381 dserv = merkledag .NewDAGService (bserv )
9482 }
9583
96- paths := req .Arguments ()
84+ paths := req .Arguments
9785
9886 var dagnodes []ipld.Node
9987 for _ , fpath := range paths {
10088 p , err := iface .ParsePath (fpath )
10189 if err != nil {
102- res .SetError (err , cmdkit .ErrNormal )
103- return
90+ return err
10491 }
10592
106- dagnode , err := api .ResolveNode (req .Context () , p )
93+ dagnode , err := api .ResolveNode (req .Context , p )
10794 if err != nil {
108- res .SetError (err , cmdkit .ErrNormal )
109- return
95+ return err
11096 }
11197 dagnodes = append (dagnodes , dagnode )
11298 }
11399
114- output := make ([]LsObject , len (req .Arguments () ))
115- ng := merkledag .NewSession (req .Context () , nd .DAG )
100+ output := make ([]LsObject , len (req .Arguments ))
101+ ng := merkledag .NewSession (req .Context , nd .DAG )
116102 ro := merkledag .NewReadOnlyDagService (ng )
117103
118104 for i , dagnode := range dagnodes {
119105 dir , err := uio .NewDirectoryFromNode (ro , dagnode )
120106 if err != nil && err != uio .ErrNotADir {
121- res .SetError (fmt .Errorf ("the data in %s (at %q) is not a UnixFS directory: %s" , dagnode .Cid (), paths [i ], err ), cmdkit .ErrNormal )
122- return
107+ return fmt .Errorf ("the data in %s (at %q) is not a UnixFS directory: %s" , dagnode .Cid (), paths [i ], err )
123108 }
124109
125110 var links []* ipld.Link
126111 if dir == nil {
127112 links = dagnode .Links ()
128113 } else {
129- links , err = dir .Links (req .Context () )
114+ links , err = dir .Links (req .Context )
130115 if err != nil {
131- res .SetError (err , cmdkit .ErrNormal )
132- return
116+ return err
133117 }
134118 }
135119
@@ -146,20 +130,18 @@ The JSON output contains type information.
146130 // No need to check with raw leaves
147131 t = unixfs .TFile
148132 case cid .DagProtobuf :
149- linkNode , err := link .GetNode (req .Context () , dserv )
133+ linkNode , err := link .GetNode (req .Context , dserv )
150134 if err == ipld .ErrNotFound && ! resolve {
151135 // not an error
152136 linkNode = nil
153137 } else if err != nil {
154- res .SetError (err , cmdkit .ErrNormal )
155- return
138+ return err
156139 }
157140
158141 if pn , ok := linkNode .(* merkledag.ProtoNode ); ok {
159142 d , err := unixfs .FSNodeFromBytes (pn .Data ())
160143 if err != nil {
161- res .SetError (err , cmdkit .ErrNormal )
162- return
144+ return err
163145 }
164146 t = d .Type ()
165147 }
@@ -173,45 +155,37 @@ The JSON output contains type information.
173155 }
174156 }
175157
176- res .SetOutput (& LsOutput {output })
158+ return res .Emit (& LsOutput {output })
177159 },
178- Marshalers : cmds.MarshalerMap {
179- cmds .Text : func (res cmds.Response ) (io.Reader , error ) {
180-
181- v , err := unwrapOutput (res .Output ())
182- if err != nil {
183- return nil , err
184- }
185-
186- headers , _ , _ := res .Request ().Option (lsHeadersOptionNameTime ).Bool ()
187- output , ok := v .(* LsOutput )
188- if ! ok {
189- return nil , e .TypeErr (output , v )
190- }
160+ Encoders : cmds.EncoderMap {
161+ cmds .Text : cmds .MakeTypedEncoder (func (req * cmds.Request , w io.Writer , out * LsOutput ) error {
162+ headers , _ := req .Options [lsHeadersOptionNameTime ].(bool )
191163
192164 buf := new (bytes.Buffer )
193- w := tabwriter .NewWriter (buf , 1 , 2 , 1 , ' ' , 0 )
194- for _ , object := range output .Objects {
195- if len (output .Objects ) > 1 {
196- fmt .Fprintf (w , "%s:\n " , object .Hash )
165+ tw := tabwriter .NewWriter (buf , 1 , 2 , 1 , ' ' , 0 )
166+ for _ , object := range out .Objects {
167+ if len (out .Objects ) > 1 {
168+ fmt .Fprintf (tw , "%s:\n " , object .Hash )
197169 }
198170 if headers {
199- fmt .Fprintln (w , "Hash\t Size\t Name" )
171+ fmt .Fprintln (tw , "Hash\t Size\t Name" )
200172 }
201173 for _ , link := range object .Links {
202174 if link .Type == unixfs .TDirectory {
203175 link .Name += "/"
204176 }
205- fmt .Fprintf (w , "%s\t %v\t %s\n " , link .Hash , link .Size , link .Name )
177+ fmt .Fprintf (tw , "%s\t %v\t %s\n " , link .Hash , link .Size , link .Name )
206178 }
207- if len (output .Objects ) > 1 {
208- fmt .Fprintln (w )
179+ if len (out .Objects ) > 1 {
180+ fmt .Fprintln (tw )
209181 }
210182 }
211- w .Flush ()
183+ tw .Flush ()
184+
185+ fmt .Fprint (w , buf )
212186
213- return buf , nil
214- },
187+ return nil
188+ }) ,
215189 },
216190 Type : LsOutput {},
217191}
0 commit comments