提交 cd108a0f 作者: Overbool

cmds/file: use new cmds lib

License: MIT
Signed-off-by: 's avatarOverbool <overbool.xu@gmail.com>
上级 81896502
...@@ -138,7 +138,7 @@ var rootSubcommands = map[string]*cmds.Command{ ...@@ -138,7 +138,7 @@ var rootSubcommands = map[string]*cmds.Command{
"resolve": ResolveCmd, "resolve": ResolveCmd,
"swarm": SwarmCmd, "swarm": SwarmCmd,
"tar": TarCmd, "tar": TarCmd,
"file": lgc.NewCommand(unixfs.UnixFSCmd), "file": unixfs.UnixFSCmd,
"update": lgc.NewCommand(ExternalBinary()), "update": lgc.NewCommand(ExternalBinary()),
"urlstore": urlStoreCmd, "urlstore": urlStoreCmd,
"version": VersionCmd, "version": VersionCmd,
......
package unixfs package unixfs
import ( import (
"bytes"
"fmt" "fmt"
"io" "io"
"sort" "sort"
"text/tabwriter" "text/tabwriter"
cmds "github.com/ipfs/go-ipfs/commands" cmdenv "github.com/ipfs/go-ipfs/core/commands/cmdenv"
e "github.com/ipfs/go-ipfs/core/commands/e"
iface "github.com/ipfs/go-ipfs/core/coreapi/interface" iface "github.com/ipfs/go-ipfs/core/coreapi/interface"
unixfs "gx/ipfs/QmXLCwhHh7bxRsBnCKNE9BAN87V44aSxXLquZYTtjr6fZ3/go-unixfs" unixfs "gx/ipfs/QmXLCwhHh7bxRsBnCKNE9BAN87V44aSxXLquZYTtjr6fZ3/go-unixfs"
cmds "gx/ipfs/Qma6uuSyjkecGhMFFLfzyJDPyoDtNJSHJNweDccZhaWkgU/go-ipfs-cmds"
merkledag "gx/ipfs/QmaDBne4KeY3UepeqSVKYpSmQGa3q9zP6x3LfVF2UjF3Hc/go-merkledag" merkledag "gx/ipfs/QmaDBne4KeY3UepeqSVKYpSmQGa3q9zP6x3LfVF2UjF3Hc/go-merkledag"
cmdkit "gx/ipfs/Qmde5VP1qUkyQXKCfmEUA7bP64V2HAptbJ7phuPp7jXWwg/go-ipfs-cmdkit" cmdkit "gx/ipfs/Qmde5VP1qUkyQXKCfmEUA7bP64V2HAptbJ7phuPp7jXWwg/go-ipfs-cmdkit"
) )
...@@ -72,20 +71,22 @@ possible, please use 'ipfs ls' instead. ...@@ -72,20 +71,22 @@ possible, please use 'ipfs ls' instead.
Arguments: []cmdkit.Argument{ Arguments: []cmdkit.Argument{
cmdkit.StringArg("ipfs-path", true, true, "The path to the IPFS object(s) to list links from.").EnableStdin(), cmdkit.StringArg("ipfs-path", true, true, "The path to the IPFS object(s) to list links from.").EnableStdin(),
}, },
Run: func(req cmds.Request, res cmds.Response) { Run: func(req *cmds.Request, res cmds.ResponseEmitter, env cmds.Environment) error {
node, err := req.InvocContext().GetNode() nd, err := cmdenv.GetNode(env)
if err != nil { if err != nil {
res.SetError(err, cmdkit.ErrNormal) return err
return
} }
api, err := req.InvocContext().GetApi() api, err := cmdenv.GetApi(env)
if err != nil { if err != nil {
res.SetError(err, cmdkit.ErrNormal) return err
return
} }
paths := req.Arguments() if err := req.ParseBodyArgs(); err != nil {
return err
}
paths := req.Arguments
output := LsOutput{ output := LsOutput{
Arguments: map[string]string{}, Arguments: map[string]string{},
...@@ -93,18 +94,16 @@ possible, please use 'ipfs ls' instead. ...@@ -93,18 +94,16 @@ possible, please use 'ipfs ls' instead.
} }
for _, p := range paths { for _, p := range paths {
ctx := req.Context() ctx := req.Context
fpath, err := iface.ParsePath(p) fpath, err := iface.ParsePath(p)
if err != nil { if err != nil {
res.SetError(err, cmdkit.ErrNormal) return err
return
} }
merkleNode, err := api.ResolveNode(ctx, fpath) merkleNode, err := api.ResolveNode(ctx, fpath)
if err != nil { if err != nil {
res.SetError(err, cmdkit.ErrNormal) return err
return
} }
c := merkleNode.Cid() c := merkleNode.Cid()
...@@ -119,14 +118,12 @@ possible, please use 'ipfs ls' instead. ...@@ -119,14 +118,12 @@ possible, please use 'ipfs ls' instead.
ndpb, ok := merkleNode.(*merkledag.ProtoNode) ndpb, ok := merkleNode.(*merkledag.ProtoNode)
if !ok { if !ok {
res.SetError(merkledag.ErrNotProtobuf, cmdkit.ErrNormal) return merkledag.ErrNotProtobuf
return
} }
unixFSNode, err := unixfs.FSNodeFromBytes(ndpb.Data()) unixFSNode, err := unixfs.FSNodeFromBytes(ndpb.Data())
if err != nil { if err != nil {
res.SetError(err, cmdkit.ErrNormal) return err
return
} }
t := unixFSNode.Type() t := unixFSNode.Type()
...@@ -142,27 +139,23 @@ possible, please use 'ipfs ls' instead. ...@@ -142,27 +139,23 @@ possible, please use 'ipfs ls' instead.
break break
case unixfs.THAMTShard: case unixfs.THAMTShard:
// We need a streaming ls API for this. // We need a streaming ls API for this.
res.SetError(fmt.Errorf("cannot list large directories yet"), cmdkit.ErrNormal) return fmt.Errorf("cannot list large directories yet")
return
case unixfs.TDirectory: case unixfs.TDirectory:
links := make([]LsLink, len(merkleNode.Links())) links := make([]LsLink, len(merkleNode.Links()))
output.Objects[hash].Links = links output.Objects[hash].Links = links
for i, link := range merkleNode.Links() { for i, link := range merkleNode.Links() {
linkNode, err := link.GetNode(ctx, node.DAG) linkNode, err := link.GetNode(ctx, nd.DAG)
if err != nil { if err != nil {
res.SetError(err, cmdkit.ErrNormal) return err
return
} }
lnpb, ok := linkNode.(*merkledag.ProtoNode) lnpb, ok := linkNode.(*merkledag.ProtoNode)
if !ok { if !ok {
res.SetError(merkledag.ErrNotProtobuf, cmdkit.ErrNormal) return merkledag.ErrNotProtobuf
return
} }
d, err := unixfs.FSNodeFromBytes(lnpb.Data()) d, err := unixfs.FSNodeFromBytes(lnpb.Data())
if err != nil { if err != nil {
res.SetError(err, cmdkit.ErrNormal) return err
return
} }
t := d.Type() t := d.Type()
lsLink := LsLink{ lsLink := LsLink{
...@@ -178,36 +171,24 @@ possible, please use 'ipfs ls' instead. ...@@ -178,36 +171,24 @@ possible, please use 'ipfs ls' instead.
links[i] = lsLink links[i] = lsLink
} }
case unixfs.TSymlink: case unixfs.TSymlink:
res.SetError(fmt.Errorf("cannot list symlinks yet"), cmdkit.ErrNormal) return fmt.Errorf("cannot list symlinks yet")
return
default: default:
res.SetError(fmt.Errorf("unrecognized type: %s", t), cmdkit.ErrImplementation) return fmt.Errorf("unrecognized type: %s", t)
return
} }
} }
res.SetOutput(&output) return cmds.EmitOnce(res, &output)
}, },
Marshalers: cmds.MarshalerMap{ Encoders: cmds.EncoderMap{
cmds.Text: func(res cmds.Response) (io.Reader, error) { cmds.Text: cmds.MakeTypedEncoder(func(req *cmds.Request, w io.Writer, out *LsOutput) error {
v, err := unwrapOutput(res.Output()) tw := tabwriter.NewWriter(w, 1, 2, 1, ' ', 0)
if err != nil {
return nil, err
}
output, ok := v.(*LsOutput)
if !ok {
return nil, e.TypeErr(output, v)
}
buf := new(bytes.Buffer)
w := tabwriter.NewWriter(buf, 1, 2, 1, ' ', 0)
nonDirectories := []string{} nonDirectories := []string{}
directories := []string{} directories := []string{}
for argument, hash := range output.Arguments { for argument, hash := range out.Arguments {
object, ok := output.Objects[hash] object, ok := out.Objects[hash]
if !ok { if !ok {
return nil, fmt.Errorf("unresolved hash: %s", hash) return fmt.Errorf("unresolved hash: %s", hash)
} }
if object.Type == "Directory" { if object.Type == "Directory" {
...@@ -220,36 +201,36 @@ possible, please use 'ipfs ls' instead. ...@@ -220,36 +201,36 @@ possible, please use 'ipfs ls' instead.
sort.Strings(directories) sort.Strings(directories)
for _, argument := range nonDirectories { for _, argument := range nonDirectories {
fmt.Fprintf(w, "%s\n", argument) fmt.Fprintf(tw, "%s\n", argument)
} }
seen := map[string]bool{} seen := map[string]bool{}
for i, argument := range directories { for i, argument := range directories {
hash := output.Arguments[argument] hash := out.Arguments[argument]
if _, ok := seen[hash]; ok { if _, ok := seen[hash]; ok {
continue continue
} }
seen[hash] = true seen[hash] = true
object := output.Objects[hash] object := out.Objects[hash]
if i > 0 || len(nonDirectories) > 0 { if i > 0 || len(nonDirectories) > 0 {
fmt.Fprintln(w) fmt.Fprintln(tw)
} }
if len(output.Arguments) > 1 { if len(out.Arguments) > 1 {
for _, arg := range directories[i:] { for _, arg := range directories[i:] {
if output.Arguments[arg] == hash { if out.Arguments[arg] == hash {
fmt.Fprintf(w, "%s:\n", arg) fmt.Fprintf(tw, "%s:\n", arg)
} }
} }
} }
for _, link := range object.Links { for _, link := range object.Links {
fmt.Fprintf(w, "%s\n", link.Name) fmt.Fprintf(tw, "%s\n", link.Name)
} }
} }
w.Flush() tw.Flush()
return buf, nil return nil
}, }),
}, },
Type: LsOutput{}, Type: LsOutput{},
} }
package unixfs package unixfs
import ( import (
cmds "github.com/ipfs/go-ipfs/commands" cmds "gx/ipfs/Qma6uuSyjkecGhMFFLfzyJDPyoDtNJSHJNweDccZhaWkgU/go-ipfs-cmds"
e "github.com/ipfs/go-ipfs/core/commands/e" cmdkit "gx/ipfs/Qmde5VP1qUkyQXKCfmEUA7bP64V2HAptbJ7phuPp7jXWwg/go-ipfs-cmdkit"
"gx/ipfs/Qmde5VP1qUkyQXKCfmEUA7bP64V2HAptbJ7phuPp7jXWwg/go-ipfs-cmdkit"
) )
var UnixFSCmd = &cmds.Command{ var UnixFSCmd = &cmds.Command{
...@@ -26,17 +24,3 @@ objects (e.g. fanout and chunking). ...@@ -26,17 +24,3 @@ objects (e.g. fanout and chunking).
"ls": LsCmd, "ls": LsCmd,
}, },
} }
// copy+pasted from ../commands.go
func unwrapOutput(i interface{}) (interface{}, error) {
var (
ch <-chan interface{}
ok bool
)
if ch, ok = i.(<-chan interface{}); !ok {
return nil, e.TypeErr(ch, i)
}
return <-ch, nil
}
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论