提交 b4a00872 作者: Kevin Atkinson

"pin verify": fix API

License: MIT
Signed-off-by: 's avatarKevin Atkinson <k@kevina.org>
上级 7a4031dd
...@@ -429,21 +429,43 @@ var verifyPinCmd = &cmds.Command{ ...@@ -429,21 +429,43 @@ var verifyPinCmd = &cmds.Command{
verbose, _, _ := res.Request().Option("verbose").Bool() verbose, _, _ := res.Request().Option("verbose").Bool()
quiet, _, _ := res.Request().Option("quiet").Bool() quiet, _, _ := res.Request().Option("quiet").Bool()
rdr, wtr := io.Pipe() if verbose && quiet {
out := pinVerify(req.Context(), n) res.SetError(fmt.Errorf("The --verbose and --quiet options can not be used at the same time"), cmds.ErrNormal)
}
opts := pinVerifyOpts{
explain: !quiet,
includeOk: verbose,
}
out := pinVerify(req.Context(), n, opts)
res.SetOutput(out)
},
Type: PinVerifyRes{},
Marshalers: cmds.MarshalerMap{
cmds.Text: func(res cmds.Response) (io.Reader, error) {
quiet, _, _ := res.Request().Option("quiet").Bool()
outChan, ok := res.Output().(<-chan interface{})
if !ok {
return nil, u.ErrCast()
}
rdr, wtr := io.Pipe()
go func() { go func() {
defer wtr.Close() defer wtr.Close()
for r := range out { for r0 := range outChan {
if quiet && len(r.badNodes) > 0 { r := r0.(*PinVerifyRes)
fmt.Fprintf(wtr, "%s\n", r.cid) if quiet && !r.Ok {
fmt.Fprintf(wtr, "%s\n", r.Cid)
} else if !quiet { } else if !quiet {
r.Format(wtr, verbose) r.Format(wtr)
} }
} }
}() }()
res.SetOutput(rdr) return rdr, nil
},
}, },
} }
...@@ -529,27 +551,36 @@ func pinLsAll(typeStr string, ctx context.Context, n *core.IpfsNode) (map[string ...@@ -529,27 +551,36 @@ func pinLsAll(typeStr string, ctx context.Context, n *core.IpfsNode) (map[string
return keys, nil return keys, nil
} }
type pinStatus struct { // PinVerifyRes is the result returned for each pin checked in "pin verify"
badNodes []badNode type PinVerifyRes struct {
Cid string
PinStatus
}
// PinStatus is part of PinVerifyRes, do not use directly
type PinStatus struct {
Ok bool
BadNodes []BadNode `json:",omitempty"`
} }
type badNode struct { // BadNode is used in PinVerifyRes
cid *cid.Cid type BadNode struct {
err error Cid string
Err string
} }
type pinVerifyRes struct { type pinVerifyOpts struct {
cid *cid.Cid explain bool
pinStatus includeOk bool
} }
func pinVerify(ctx context.Context, n *core.IpfsNode) <-chan pinVerifyRes { func pinVerify(ctx context.Context, n *core.IpfsNode, opts pinVerifyOpts) <-chan interface{} {
visited := make(map[string]pinStatus) visited := make(map[string]PinStatus)
getLinks := n.DAG.GetOfflineLinkService().GetLinks getLinks := n.DAG.GetOfflineLinkService().GetLinks
recPins := n.Pinning.RecursiveKeys() recPins := n.Pinning.RecursiveKeys()
var checkPin func(root *cid.Cid) pinStatus var checkPin func(root *cid.Cid) PinStatus
checkPin = func(root *cid.Cid) pinStatus { checkPin = func(root *cid.Cid) PinStatus {
key := root.String() key := root.String()
if status, ok := visited[key]; ok { if status, ok := visited[key]; ok {
return status return status
...@@ -557,16 +588,20 @@ func pinVerify(ctx context.Context, n *core.IpfsNode) <-chan pinVerifyRes { ...@@ -557,16 +588,20 @@ func pinVerify(ctx context.Context, n *core.IpfsNode) <-chan pinVerifyRes {
links, err := getLinks(ctx, root) links, err := getLinks(ctx, root)
if err != nil { if err != nil {
status := pinStatus{[]badNode{badNode{cid: root, err: err}}} status := PinStatus{Ok: false}
if opts.explain {
status.BadNodes = []BadNode{BadNode{Cid: key, Err: err.Error()}}
}
visited[key] = status visited[key] = status
return status return status
} }
status := pinStatus{} status := PinStatus{Ok: true}
for _, lnk := range links { for _, lnk := range links {
res := checkPin(lnk.Cid) res := checkPin(lnk.Cid)
if len(res.badNodes) > 0 { if !res.Ok {
status.badNodes = append(status.badNodes, res.badNodes...) status.Ok = false
status.BadNodes = append(status.BadNodes, res.BadNodes...)
} }
} }
...@@ -574,27 +609,28 @@ func pinVerify(ctx context.Context, n *core.IpfsNode) <-chan pinVerifyRes { ...@@ -574,27 +609,28 @@ func pinVerify(ctx context.Context, n *core.IpfsNode) <-chan pinVerifyRes {
return status return status
} }
out := make(chan pinVerifyRes) out := make(chan interface{})
go func() { go func() {
defer close(out) defer close(out)
for _, cid := range recPins { for _, cid := range recPins {
pinStatus := checkPin(cid) pinStatus := checkPin(cid)
out <- pinVerifyRes{cid, pinStatus} if !pinStatus.Ok || opts.includeOk {
out <- &PinVerifyRes{cid.String(), pinStatus}
}
} }
}() }()
return out return out
} }
func (r pinVerifyRes) Format(out io.Writer, verbose bool) { // Format formats PinVerifyRes
if len(r.badNodes) == 0 { func (r PinVerifyRes) Format(out io.Writer) {
if verbose { if r.Ok {
fmt.Fprintf(out, "%s ok\n", r.cid) fmt.Fprintf(out, "%s ok\n", r.Cid)
}
} else { } else {
fmt.Fprintf(out, "%s broken\n", r.cid) fmt.Fprintf(out, "%s broken\n", r.Cid)
for _, e := range r.badNodes { for _, e := range r.BadNodes {
fmt.Fprintf(out, " %s: %s\n", e.cid, e.err) fmt.Fprintf(out, " %s: %s\n", e.Cid, e.Err)
} }
} }
} }
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论