提交 ccbded69 作者: Łukasz Magiera

WIP

License: MIT
Signed-off-by: 's avatarŁukasz Magiera <magik6k@gmail.com>
上级 abf45ff9
...@@ -22,9 +22,9 @@ import ( ...@@ -22,9 +22,9 @@ import (
u "gx/ipfs/QmPdKqUcHGFdeSpvjVoaTRPPstGif9GBZb5Q56RVw9o69A/go-ipfs-util" u "gx/ipfs/QmPdKqUcHGFdeSpvjVoaTRPPstGif9GBZb5Q56RVw9o69A/go-ipfs-util"
offline "gx/ipfs/QmPf114DXfa6TqGKYhBGR7EtXRho4rCJgwyA1xkuMY5vwF/go-ipfs-exchange-offline" offline "gx/ipfs/QmPf114DXfa6TqGKYhBGR7EtXRho4rCJgwyA1xkuMY5vwF/go-ipfs-exchange-offline"
cmds "gx/ipfs/QmaFrNcnXHp579hUixbcTH1TNtNwsMogtBCwUUUwzBwYoM/go-ipfs-cmds"
cid "gx/ipfs/QmapdYm1b22Frv3k17fqrBYTFRxwiaVJkB299Mfn33edeB/go-cid" cid "gx/ipfs/QmapdYm1b22Frv3k17fqrBYTFRxwiaVJkB299Mfn33edeB/go-cid"
"gx/ipfs/QmdE4gMduCKCGAcczM2F5ioYDfdeKuPix138wrES1YSr7f/go-ipfs-cmdkit" "gx/ipfs/QmdE4gMduCKCGAcczM2F5ioYDfdeKuPix138wrES1YSr7f/go-ipfs-cmdkit"
cmds "gx/ipfs/QmaFrNcnXHp579hUixbcTH1TNtNwsMogtBCwUUUwzBwYoM/go-ipfs-cmds"
) )
var PinCmd = &cmds.Command{ var PinCmd = &cmds.Command{
...@@ -282,6 +282,7 @@ Example: ...@@ -282,6 +282,7 @@ Example:
Options: []cmdkit.Option{ Options: []cmdkit.Option{
cmdkit.StringOption("type", "t", "The type of pinned keys to list. Can be \"direct\", \"indirect\", \"recursive\", or \"all\".").WithDefault("all"), cmdkit.StringOption("type", "t", "The type of pinned keys to list. Can be \"direct\", \"indirect\", \"recursive\", or \"all\".").WithDefault("all"),
cmdkit.BoolOption("quiet", "q", "Write just hashes of objects."), cmdkit.BoolOption("quiet", "q", "Write just hashes of objects."),
cmdkit.BoolOption("stream", "Don't buffer pins before sending."),
}, },
Run: func(req *cmds.Request, res cmds.ResponseEmitter, env cmds.Environment) { Run: func(req *cmds.Request, res cmds.ResponseEmitter, env cmds.Environment) {
n, err := GetNode(env) n, err := GetNode(env)
...@@ -291,6 +292,7 @@ Example: ...@@ -291,6 +292,7 @@ Example:
} }
typeStr, _ := req.Options["type"].(string) typeStr, _ := req.Options["type"].(string)
stream, _ := req.Options["stream"].(bool)
switch typeStr { switch typeStr {
case "all", "direct", "indirect", "recursive": case "all", "direct", "indirect", "recursive":
...@@ -300,21 +302,36 @@ Example: ...@@ -300,21 +302,36 @@ Example:
return return
} }
emit := res.Emit
lgcList := map[string]RefObject{}
if !stream {
emit = func(v interface{}) error {
obj := v.(*RefKeyObject)
lgcList[obj.Cid] = RefObject{Type: obj.Type}
return nil
}
}
if len(req.Arguments) > 0 { if len(req.Arguments) > 0 {
err = pinLsKeys(req.Context, req.Arguments, typeStr, n, res.Emit) err = pinLsKeys(req.Context, req.Arguments, typeStr, n, emit)
} else { } else {
err = pinLsAll(req.Context, typeStr, n, res.Emit) err = pinLsAll(req.Context, typeStr, n, emit)
}
if !stream {
res.Emit(&RefKeyList{lgcList})
} }
if err != nil { if err != nil {
res.SetError(err, cmdkit.ErrNormal) res.SetError(err, cmdkit.ErrNormal)
} }
}, },
Type: RefKeyObject{},
Encoders: cmds.EncoderMap{ Encoders: cmds.EncoderMap{
cmds.Text: cmds.MakeEncoder(func(req *cmds.Request, w io.Writer, v interface{}) error { cmds.Text: cmds.MakeEncoder(func(req *cmds.Request, w io.Writer, v interface{}) error {
quiet, _ := req.Options["quiet"].(bool) quiet, _ := req.Options["quiet"].(bool)
stream, _ := req.Options["stream"].(bool)
if stream {
obj, ok := v.(*RefKeyObject) obj, ok := v.(*RefKeyObject)
if !ok { if !ok {
return e.TypeErr(obj, v) return e.TypeErr(obj, v)
...@@ -325,6 +342,22 @@ Example: ...@@ -325,6 +342,22 @@ Example:
fmt.Fprintf(w, "%s %s\n", obj.Cid, obj.Type) fmt.Fprintf(w, "%s %s\n", obj.Cid, obj.Type)
} }
return nil return nil
}
keys, ok := v.(*RefKeyList)
if !ok {
return e.TypeErr(keys, v)
}
for k, v := range keys.Keys {
if quiet {
fmt.Fprintf(w, "%s\n", k)
} else {
fmt.Fprintf(w, "%s %s\n", k, v.Type)
}
}
return nil
}), }),
}, },
} }
...@@ -472,6 +505,14 @@ type RefKeyObject struct { ...@@ -472,6 +505,14 @@ type RefKeyObject struct {
Type string Type string
} }
type RefObject struct {
Type string
}
type RefKeyList struct {
Keys map[string]RefObject
}
func pinLsKeys(ctx context.Context, args []string, typeStr string, n *core.IpfsNode, emit func(value interface{}) error) error { func pinLsKeys(ctx context.Context, args []string, typeStr string, n *core.IpfsNode, emit func(value interface{}) error) error {
mode, ok := pin.StringToMode(typeStr) mode, ok := pin.StringToMode(typeStr)
...@@ -479,8 +520,6 @@ func pinLsKeys(ctx context.Context, args []string, typeStr string, n *core.IpfsN ...@@ -479,8 +520,6 @@ func pinLsKeys(ctx context.Context, args []string, typeStr string, n *core.IpfsN
return fmt.Errorf("invalid pin mode '%s'", typeStr) return fmt.Errorf("invalid pin mode '%s'", typeStr)
} }
keys := make(map[string]struct{})
r := &resolver.Resolver{ r := &resolver.Resolver{
DAG: n.DAG, DAG: n.DAG,
ResolveOnce: uio.ResolveUnixfsOnce, ResolveOnce: uio.ResolveUnixfsOnce,
...@@ -511,7 +550,6 @@ func pinLsKeys(ctx context.Context, args []string, typeStr string, n *core.IpfsN ...@@ -511,7 +550,6 @@ func pinLsKeys(ctx context.Context, args []string, typeStr string, n *core.IpfsN
default: default:
pinType = "indirect through " + pinType pinType = "indirect through " + pinType
} }
keys[c.String()] = struct{}{}
emit(&RefKeyObject{ emit(&RefKeyObject{
Type: pinType, Type: pinType,
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论