Skip to content

Commit 52bb551

Browse files
committed
commands/ls: use new cmds lib
License: MIT Signed-off-by: Overbool <overbool.xu@gmail.com>
1 parent 3accb7b commit 52bb551

2 files changed

Lines changed: 40 additions & 66 deletions

File tree

core/commands/ls.go

Lines changed: 38 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,7 @@ import (
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

2424
type 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\tSize\tName")
171+
fmt.Fprintln(tw, "Hash\tSize\tName")
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
}

core/commands/root.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ var rootSubcommands = map[string]*cmds.Command{
131131
"id": IDCmd,
132132
"key": KeyCmd,
133133
"log": lgc.NewCommand(LogCmd),
134-
"ls": lgc.NewCommand(LsCmd),
134+
"ls": LsCmd,
135135
"mount": lgc.NewCommand(MountCmd),
136136
"name": name.NameCmd,
137137
"object": ocmd.ObjectCmd,
@@ -168,7 +168,7 @@ var rootROSubcommands = map[string]*cmds.Command{
168168
},
169169
"get": GetCmd,
170170
"dns": DNSCmd,
171-
"ls": lgc.NewCommand(LsCmd),
171+
"ls": LsCmd,
172172
"name": &cmds.Command{
173173
Subcommands: map[string]*cmds.Command{
174174
"resolve": name.IpnsCmd,

0 commit comments

Comments
 (0)