提交 b6fcfc87 作者: Kevin Atkinson

Add function to get the cid-base used in a path string.

Use it for "ipfs ls" and "ipfs resolve".  Resolve also reconized the
--cid-base option.

License: MIT
Signed-off-by: 's avatarKevin Atkinson <k@kevina.org>
上级 324d75ae
......@@ -77,7 +77,7 @@ The JSON output contains type information.
return
}
base, _, _, err := HandleCidBaseOld(req)
_, _, ctx, err := HandleCidBaseOld(req)
if err != nil {
res.SetError(err, cmdkit.ErrNormal)
return
......@@ -105,7 +105,7 @@ The JSON output contains type information.
ResolveOnce: uio.ResolveUnixfsOnce,
}
dagnode, err := core.Resolve(req.Context(), nd.Namesys, r, p)
dagnode, err := core.Resolve(ctx, nd.Namesys, r, p)
if err != nil {
res.SetError(err, cmdkit.ErrNormal)
return
......@@ -126,7 +126,7 @@ The JSON output contains type information.
if dir == nil {
links = dagnode.Links()
} else {
links, err = dir.Links(req.Context())
links, err = dir.Links(ctx)
if err != nil {
res.SetError(err, cmdkit.ErrNormal)
return
......@@ -146,7 +146,7 @@ The JSON output contains type information.
// No need to check with raw leaves
t = unixfspb.Data_File
case cid.DagProtobuf:
linkNode, err := link.GetNode(req.Context(), dserv)
linkNode, err := link.GetNode(ctx, dserv)
if err == ipld.ErrNotFound && !resolve {
// not an error
linkNode = nil
......@@ -164,6 +164,7 @@ The JSON output contains type information.
t = d.GetType()
}
}
base := GetCidBase(ctx, paths[i])
output[i].Links[j] = LsLink{
Name: link.Name,
Hash: link.Cid.Encode(base),
......
......@@ -87,6 +87,12 @@ Resolve the value of an IPFS DAG path:
name := req.Arguments()[0]
recursive, _, _ := req.Option("recursive").Bool()
_, _, ctx, err := HandleCidBaseOld(req)
if err != nil {
res.SetError(err, cmdkit.ErrNormal)
return
}
// the case when ipns is resolved step by step
if strings.HasPrefix(name, "/ipns/") && !recursive {
rc, rcok, _ := req.Option("dht-record-count").Int()
......@@ -107,7 +113,7 @@ Resolve the value of an IPFS DAG path:
}
ropts = append(ropts, nsopts.DhtTimeout(d))
}
p, err := n.Namesys.Resolve(req.Context(), name, ropts...)
p, err := n.Namesys.Resolve(ctx, name, ropts...)
// ErrResolveRecursion is fine
if err != nil && err != ns.ErrResolveRecursion {
res.SetError(err, cmdkit.ErrNormal)
......@@ -124,15 +130,17 @@ Resolve the value of an IPFS DAG path:
return
}
node, err := core.Resolve(req.Context(), n.Namesys, n.Resolver, p)
node, err := core.Resolve(ctx, n.Namesys, n.Resolver, p)
if err != nil {
res.SetError(err, cmdkit.ErrNormal)
return
}
c := node.Cid()
base := GetCidBase(ctx, name)
pathStr := "/ipfs/" + c.Encode(base)
res.SetOutput(&ResolvedPath{path.FromCid(c)})
res.SetOutput(&ResolvedPath{path.FromString(pathStr)})
},
Marshalers: cmds.MarshalerMap{
cmds.Text: func(res cmds.Response) (io.Reader, error) {
......
......@@ -256,3 +256,25 @@ func HandleCidBaseOld(req oldcmds.Request) (mbase.Encoder, bool, context.Context
encoder, _ := mbase.NewEncoder(mbase.Base58BTC)
return encoder, false, ctx, nil
}
// GetCidBase gets the cid base to use from either the context or
// another cid or path
func GetCidBase(ctx context.Context, cidStr string) mbase.Encoder {
encoder, ok := ctx.Value("cid-base").(mbase.Encoder)
if ok {
return encoder
}
defaultEncoder, _ := mbase.NewEncoder(mbase.Base58BTC)
if cidStr != "" {
cidStr = strings.TrimPrefix(cidStr, "/ipfs/")
if cidStr == "" || strings.HasPrefix(cidStr, "Qm") {
return defaultEncoder
}
encoder, err := mbase.NewEncoder(mbase.Encoding(cidStr[0]))
if err != nil {
return defaultEncoder
}
return encoder
}
return defaultEncoder
}
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论