提交 d31e92b4 作者: Overbool

cmds/dag: use new cmds lib

License: MIT
Signed-off-by: 's avatarOverbool <overbool.xu@gmail.com>
上级 2235472d
package dagcmd package dagcmd
import ( import (
"bytes"
"fmt" "fmt"
"io" "io"
"math" "math"
"strings"
path "gx/ipfs/QmRKuTyCzg7HFBcV1YUhzStroGtJSb8iWgyxfsDCwFhWTS/go-path" "github.com/ipfs/go-ipfs/core/commands/cmdenv"
"github.com/ipfs/go-ipfs/core/commands/e"
cmds "github.com/ipfs/go-ipfs/commands" "github.com/ipfs/go-ipfs/core/coredag"
e "github.com/ipfs/go-ipfs/core/commands/e" "github.com/ipfs/go-ipfs/pin"
coredag "github.com/ipfs/go-ipfs/core/coredag"
pin "github.com/ipfs/go-ipfs/pin"
cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid"
mh "gx/ipfs/QmPnFwZ2JXKnXgMw8CdBPxn7FWh6LLdjUjxV1fKHuJnkr8/go-multihash" mh "gx/ipfs/QmPnFwZ2JXKnXgMw8CdBPxn7FWh6LLdjUjxV1fKHuJnkr8/go-multihash"
path "gx/ipfs/QmRKuTyCzg7HFBcV1YUhzStroGtJSb8iWgyxfsDCwFhWTS/go-path"
files "gx/ipfs/QmZMWMvWMVKCbHetJ4RgndbuEF1io2UpUxwQwtNjtYPzSC/go-ipfs-files" files "gx/ipfs/QmZMWMvWMVKCbHetJ4RgndbuEF1io2UpUxwQwtNjtYPzSC/go-ipfs-files"
ipld "gx/ipfs/QmdDXJs4axxefSPgK6Y1QhpJWKuDPnGJiqgq4uncb4rFHL/go-ipld-format" ipld "gx/ipfs/QmdDXJs4axxefSPgK6Y1QhpJWKuDPnGJiqgq4uncb4rFHL/go-ipld-format"
cmds "gx/ipfs/QmdTmGruUz23vgzym3uWpnAEQdGdGifQqBvP8UXSRjG8gZ/go-ipfs-cmds"
cmdkit "gx/ipfs/Qmde5VP1qUkyQXKCfmEUA7bP64V2HAptbJ7phuPp7jXWwg/go-ipfs-cmdkit" cmdkit "gx/ipfs/Qmde5VP1qUkyQXKCfmEUA7bP64V2HAptbJ7phuPp7jXWwg/go-ipfs-cmdkit"
) )
...@@ -66,21 +64,16 @@ into an object of the specified format. ...@@ -66,21 +64,16 @@ into an object of the specified format.
cmdkit.BoolOption("pin", "Pin this object when adding."), cmdkit.BoolOption("pin", "Pin this object when adding."),
cmdkit.StringOption("hash", "Hash function to use").WithDefault(""), cmdkit.StringOption("hash", "Hash function to use").WithDefault(""),
}, },
Run: func(req cmds.Request, res cmds.Response) { Run: func(req *cmds.Request, res cmds.ResponseEmitter, env cmds.Environment) error {
n, err := req.InvocContext().GetNode() nd, err := cmdenv.GetNode(env)
if err != nil { if err != nil {
res.SetError(err, cmdkit.ErrNormal) return err
return
} }
ienc, _, _ := req.Option("input-enc").String() ienc, _ := req.Options["input-enc"].(string)
format, _, _ := req.Option("format").String() format, _ := req.Options["format"].(string)
hash, _, err := req.Option("hash").String() hash, _ := req.Options["hash"].(string)
dopin, _, err := req.Option("pin").Bool() dopin, _ := req.Options["pin"].(bool)
if err != nil {
res.SetError(err, cmdkit.ErrNormal)
return
}
// mhType tells inputParser which hash should be used. MaxUint64 means 'use // mhType tells inputParser which hash should be used. MaxUint64 means 'use
// default hash' (sha256 for cbor, sha1 for git..) // default hash' (sha256 for cbor, sha1 for git..)
...@@ -90,18 +83,15 @@ into an object of the specified format. ...@@ -90,18 +83,15 @@ into an object of the specified format.
var ok bool var ok bool
mhType, ok = mh.Names[hash] mhType, ok = mh.Names[hash]
if !ok { if !ok {
res.SetError(fmt.Errorf("%s in not a valid multihash name", hash), cmdkit.ErrNormal) return fmt.Errorf("%s in not a valid multihash name", hash)
return
} }
} }
outChan := make(chan interface{}, 8) outChan := make(chan interface{}, 8)
res.SetOutput((<-chan interface{})(outChan))
addAllAndPin := func(f files.File) error { addAllAndPin := func(f files.File) error {
cids := cid.NewSet() cids := cid.NewSet()
b := ipld.NewBatch(req.Context(), n.DAG) b := ipld.NewBatch(req.Context, nd.DAG)
for { for {
file, err := f.NextFile() file, err := f.NextFile()
...@@ -132,7 +122,7 @@ into an object of the specified format. ...@@ -132,7 +122,7 @@ into an object of the specified format.
select { select {
case outChan <- &OutputObject{Cid: cid}: case outChan <- &OutputObject{Cid: cid}:
case <-req.Context().Done(): case <-req.Context.Done():
return nil return nil
} }
} }
...@@ -142,14 +132,14 @@ into an object of the specified format. ...@@ -142,14 +132,14 @@ into an object of the specified format.
} }
if dopin { if dopin {
defer n.Blockstore.PinLock().Unlock() defer nd.Blockstore.PinLock().Unlock()
cids.ForEach(func(c cid.Cid) error { cids.ForEach(func(c cid.Cid) error {
n.Pinning.PinWithMode(c, pin.Recursive) nd.Pinning.PinWithMode(c, pin.Recursive)
return nil return nil
}) })
err := n.Pinning.Flush() err := nd.Pinning.Flush()
if err != nil { if err != nil {
return err return err
} }
...@@ -158,29 +148,27 @@ into an object of the specified format. ...@@ -158,29 +148,27 @@ into an object of the specified format.
return nil return nil
} }
errC := make(chan error)
go func() { go func() {
var err error
defer func() { errC <- err }()
defer close(outChan) defer close(outChan)
if err := addAllAndPin(req.Files()); err != nil { err = addAllAndPin(req.Files)
res.SetError(err, cmdkit.ErrNormal)
return
}
}() }()
},
Type: OutputObject{},
Marshalers: cmds.MarshalerMap{
cmds.Text: func(res cmds.Response) (io.Reader, error) {
v, err := unwrapOutput(res.Output())
if err != nil {
return nil, err
}
oobj, ok := v.(*OutputObject) err = res.Emit(outChan)
if !ok { if err != nil {
return nil, e.TypeErr(oobj, v) return err
} }
return strings.NewReader(oobj.Cid.String() + "\n"), nil return <-errC
}, },
Type: OutputObject{},
Encoders: cmds.EncoderMap{
cmds.Text: cmds.MakeTypedEncoder(func(req *cmds.Request, w io.Writer, out *OutputObject) error {
fmt.Fprintln(w, out.Cid.String())
return nil
}),
}, },
} }
...@@ -195,41 +183,35 @@ format. ...@@ -195,41 +183,35 @@ format.
Arguments: []cmdkit.Argument{ Arguments: []cmdkit.Argument{
cmdkit.StringArg("ref", true, false, "The object to get").EnableStdin(), cmdkit.StringArg("ref", true, false, "The object to get").EnableStdin(),
}, },
Run: func(req cmds.Request, res cmds.Response) { Run: func(req *cmds.Request, res cmds.ResponseEmitter, env cmds.Environment) error {
n, err := req.InvocContext().GetNode() nd, err := cmdenv.GetNode(env)
if err != nil { if err != nil {
res.SetError(err, cmdkit.ErrNormal) return err
return
} }
p, err := path.ParsePath(req.Arguments()[0]) p, err := path.ParsePath(req.Arguments[0])
if err != nil { if err != nil {
res.SetError(err, cmdkit.ErrNormal) return err
return
} }
lastCid, rem, err := n.Resolver.ResolveToLastNode(req.Context(), p) lastCid, rem, err := nd.Resolver.ResolveToLastNode(req.Context, p)
if err != nil { if err != nil {
res.SetError(err, cmdkit.ErrNormal) return err
return
} }
obj, err := n.DAG.Get(req.Context(), lastCid) obj, err := nd.DAG.Get(req.Context, lastCid)
if err != nil { if err != nil {
res.SetError(err, cmdkit.ErrNormal) return err
return
} }
var out interface{} = obj var out interface{} = obj
if len(rem) > 0 { if len(rem) > 0 {
final, _, err := obj.Resolve(rem) final, _, err := obj.Resolve(rem)
if err != nil { if err != nil {
res.SetError(err, cmdkit.ErrNormal) return err
return
} }
out = final out = final
} }
return res.Emit(&out)
res.SetOutput(out)
}, },
} }
...@@ -244,48 +226,37 @@ var DagResolveCmd = &cmds.Command{ ...@@ -244,48 +226,37 @@ var DagResolveCmd = &cmds.Command{
Arguments: []cmdkit.Argument{ Arguments: []cmdkit.Argument{
cmdkit.StringArg("ref", true, false, "The path to resolve").EnableStdin(), cmdkit.StringArg("ref", true, false, "The path to resolve").EnableStdin(),
}, },
Run: func(req cmds.Request, res cmds.Response) { Run: func(req *cmds.Request, res cmds.ResponseEmitter, env cmds.Environment) error {
n, err := req.InvocContext().GetNode() nd, err := cmdenv.GetNode(env)
if err != nil { if err != nil {
res.SetError(err, cmdkit.ErrNormal) return err
return
} }
p, err := path.ParsePath(req.Arguments()[0]) p, err := path.ParsePath(req.Arguments[0])
if err != nil { if err != nil {
res.SetError(err, cmdkit.ErrNormal) return err
return
} }
lastCid, rem, err := n.Resolver.ResolveToLastNode(req.Context(), p) lastCid, rem, err := nd.Resolver.ResolveToLastNode(req.Context, p)
if err != nil { if err != nil {
res.SetError(err, cmdkit.ErrNormal) return err
return
} }
res.SetOutput(&ResolveOutput{ return res.Emit(&ResolveOutput{
Cid: lastCid, Cid: lastCid,
RemPath: path.Join(rem), RemPath: path.Join(rem),
}) })
}, },
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 *ResolveOutput) error {
v, err := unwrapOutput(res.Output()) p := out.Cid.String()
if err != nil { if out.RemPath != "" {
return nil, err p = path.Join([]string{p, out.RemPath})
}
output := v.(*ResolveOutput)
buf := new(bytes.Buffer)
p := output.Cid.String()
if output.RemPath != "" {
p = path.Join([]string{p, output.RemPath})
} }
buf.WriteString(p) fmt.Fprint(w, p)
return nil
return buf, nil }),
},
}, },
Type: ResolveOutput{}, Type: ResolveOutput{},
} }
......
...@@ -124,7 +124,7 @@ var rootSubcommands = map[string]*cmds.Command{ ...@@ -124,7 +124,7 @@ var rootSubcommands = map[string]*cmds.Command{
"stats": StatsCmd, "stats": StatsCmd,
"bootstrap": lgc.NewCommand(BootstrapCmd), "bootstrap": lgc.NewCommand(BootstrapCmd),
"config": lgc.NewCommand(ConfigCmd), "config": lgc.NewCommand(ConfigCmd),
"dag": lgc.NewCommand(dag.DagCmd), "dag": dag.DagCmd,
"dht": lgc.NewCommand(DhtCmd), "dht": lgc.NewCommand(DhtCmd),
"diag": lgc.NewCommand(DiagCmd), "diag": lgc.NewCommand(DiagCmd),
"dns": lgc.NewCommand(DNSCmd), "dns": lgc.NewCommand(DNSCmd),
...@@ -169,7 +169,7 @@ var rootROSubcommands = map[string]*cmds.Command{ ...@@ -169,7 +169,7 @@ var rootROSubcommands = map[string]*cmds.Command{
"get": GetCmd, "get": GetCmd,
"dns": lgc.NewCommand(DNSCmd), "dns": lgc.NewCommand(DNSCmd),
"ls": lgc.NewCommand(LsCmd), "ls": lgc.NewCommand(LsCmd),
"name": &cmds.Command{ "name": {
Subcommands: map[string]*cmds.Command{ Subcommands: map[string]*cmds.Command{
"resolve": name.IpnsCmd, "resolve": name.IpnsCmd,
}, },
...@@ -182,12 +182,12 @@ var rootROSubcommands = map[string]*cmds.Command{ ...@@ -182,12 +182,12 @@ var rootROSubcommands = map[string]*cmds.Command{
"stat": ocmd.ObjectStatCmd, "stat": ocmd.ObjectStatCmd,
}, },
}), }),
"dag": lgc.NewCommand(&oldcmds.Command{ "dag": {
Subcommands: map[string]*oldcmds.Command{ Subcommands: map[string]*cmds.Command{
"get": dag.DagGetCmd, "get": dag.DagGetCmd,
"resolve": dag.DagResolveCmd, "resolve": dag.DagResolveCmd,
}, },
}), },
"resolve": ResolveCmd, "resolve": ResolveCmd,
"version": lgc.NewCommand(VersionCmd), "version": lgc.NewCommand(VersionCmd),
} }
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论