Skip to content

Commit

Permalink
Add global --cid-base option and enable it for most commands.
Browse files Browse the repository at this point in the history
This does it on ther server side for most commands.

This also adds a global --output-cidv1 option.

License: MIT
Signed-off-by: Kevin Atkinson <[email protected]>
  • Loading branch information
kevina committed Nov 22, 2018
1 parent 0bd3e80 commit f124585
Show file tree
Hide file tree
Showing 21 changed files with 532 additions and 151 deletions.
16 changes: 13 additions & 3 deletions core/commands/add.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import (
options "github.com/ipfs/go-ipfs/core/coreapi/interface/options"

pb "gx/ipfs/QmPtj12fdwuAqj9sBSTNUxBNu8kCGNp8b3o8yUzMm5GHpq/pb"
//cidenc "gx/ipfs/QmWf8NwKFLbTBvAvZst3bYF7WEEetzxWyMhvQ885cj9MM8/go-cidutil/cidenc"
files "gx/ipfs/QmZMWMvWMVKCbHetJ4RgndbuEF1io2UpUxwQwtNjtYPzSC/go-ipfs-files"
cmds "gx/ipfs/Qma6uuSyjkecGhMFFLfzyJDPyoDtNJSHJNweDccZhaWkgU/go-ipfs-cmds"
cmdkit "gx/ipfs/Qmde5VP1qUkyQXKCfmEUA7bP64V2HAptbJ7phuPp7jXWwg/go-ipfs-cmdkit"
Expand Down Expand Up @@ -167,6 +168,11 @@ You can now check what blocks have been created by:
return fmt.Errorf("unrecognized hash function: %s", strings.ToLower(hashFunStr))
}

enc, err := cmdenv.ProcCidBase(req)
if err != nil {
return err
}

events := make(chan interface{}, adderOutChanSize)

opts := []options.UnixfsAddOption{
Expand Down Expand Up @@ -212,9 +218,13 @@ You can now check what blocks have been created by:
_, err = api.Unixfs().Add(req.Context, req.Files, opts...)
}()

err = res.Emit(events)
if err != nil {
return err
for event := range events {
output := event.(*coreiface.AddEvent)
output.Hash, _ = enc.Recode(output.Hash)
err = res.Emit(event)
if err != nil {
return err
}
}

return <-errCh
Expand Down
50 changes: 50 additions & 0 deletions core/commands/cmdenv/cidbase.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package cmdenv

import (
cidenc "gx/ipfs/QmVjZoEZg2oxXGFGjbD28x3gGN6ALHAW6BN2LKRUcaJ21i/go-cidutil/cidenc"
cmds "gx/ipfs/Qma6uuSyjkecGhMFFLfzyJDPyoDtNJSHJNweDccZhaWkgU/go-ipfs-cmds"
cmdkit "gx/ipfs/Qmde5VP1qUkyQXKCfmEUA7bP64V2HAptbJ7phuPp7jXWwg/go-ipfs-cmdkit"
mbase "gx/ipfs/QmekxXDhCxCJRNuzmHreuaT3BsuJcsjcXWNrtV9C8DRHtd/go-multibase"
)

var OptionCidBase = cmdkit.StringOption("cid-base", "Multi-base encoding used for version 1 CIDs in output.")
var OptionOutputCidV1 = cmdkit.BoolOption("output-cidv1", "Upgrade CID version 0 to version 1 in output.")

// ProcCidBase processes the `cid-base` and `output-cidv1` options and
// returns a encoder to use based on those parameters.
func ProcCidBase(req *cmds.Request) (cidenc.Encoder, error) {
base, _ := req.Options["cid-base"].(string)
upgrade, upgradeDefined := req.Options["output-cidv1"].(bool)

var e cidenc.Encoder = cidenc.Default

if base != "" {
var err error
e.Base, err = mbase.EncoderByName(base)
if err != nil {
return e, err
}
e.Upgrade = true
}

if upgradeDefined {
e.Upgrade = upgrade
}

return e, nil
}

func CidBaseDefined(req *cmds.Request) bool {
base, _ := req.Options["cid-base"].(string)
return base != ""
}

// EnableCidBaseGlobal is a prerun function...
func EnableCidBaseGlobal(req *cmds.Request, env cmds.Environment) error {
enc, err := ProcCidBase(req)
if err != nil {
return err
}
cidenc.Default = enc
return nil
}
21 changes: 16 additions & 5 deletions core/commands/files.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import (
ft "gx/ipfs/QmUnHNqhSB1JgzVCxL1Kz3yb4bdyB4q1Z9AD5AUBVmt3fZ/go-unixfs"
mfs "gx/ipfs/QmV8mXUh1M9qztax7vVdL1Apuz4c1eJZC5YactGxaJfWom/go-mfs"
bservice "gx/ipfs/QmVDTbzzTwnuBwNbJdhW3u7LoBQp46bezm9yp4z1RoEepM/go-blockservice"
cidenc "gx/ipfs/QmVjZoEZg2oxXGFGjbD28x3gGN6ALHAW6BN2LKRUcaJ21i/go-cidutil/cidenc"
offline "gx/ipfs/QmYZwey1thDTynSrvd6qQkX24UpTka6TFhQ2v569UpoqxD/go-ipfs-exchange-offline"
cmds "gx/ipfs/Qma6uuSyjkecGhMFFLfzyJDPyoDtNJSHJNweDccZhaWkgU/go-ipfs-cmds"
dag "gx/ipfs/QmcGt25mrjuB2kKW2zhPbXVZNHc4yoTDQ65NA8m6auP2f1/go-merkledag"
Expand Down Expand Up @@ -136,6 +137,11 @@ var filesStatCmd = &cmds.Command{

withLocal, _ := req.Options[filesWithLocalOptionName].(bool)

enc, err := cmdenv.ProcCidBase(req)
if err != nil {
return err
}

var dagserv ipld.DAGService
if withLocal {
// an offline DAGService will not fetch from the network
Expand All @@ -152,7 +158,7 @@ var filesStatCmd = &cmds.Command{
return err
}

o, err := statNode(nd)
o, err := statNode(nd, enc)
if err != nil {
return err
}
Expand Down Expand Up @@ -217,7 +223,7 @@ func statGetFormatOptions(req *cmds.Request) (string, error) {
}
}

func statNode(nd ipld.Node) (*statOutput, error) {
func statNode(nd ipld.Node, enc cidenc.Interface) (*statOutput, error) {
c := nd.Cid()

cumulsize, err := nd.Size()
Expand All @@ -243,15 +249,15 @@ func statNode(nd ipld.Node) (*statOutput, error) {
}

return &statOutput{
Hash: c.String(),
Hash: enc.Encode(c),
Blocks: len(nd.Links()),
Size: d.FileSize(),
CumulativeSize: cumulsize,
Type: ndtype,
}, nil
case *dag.RawNode:
return &statOutput{
Hash: c.String(),
Hash: enc.Encode(c),
Blocks: 0,
Size: cumulsize,
CumulativeSize: cumulsize,
Expand Down Expand Up @@ -433,6 +439,11 @@ Examples:

long, _ := req.Options[longOptionName].(bool)

enc, err := cmdenv.ProcCidBase(req)
if err != nil {
return err
}

switch fsn := fsn.(type) {
case *mfs.Directory:
if !long {
Expand Down Expand Up @@ -470,7 +481,7 @@ Examples:
if err != nil {
return err
}
out.Entries[0].Hash = nd.Cid().String()
out.Entries[0].Hash = enc.Encode(nd.Cid())
}
return cmds.EmitOnce(res, out)
default:
Expand Down
10 changes: 9 additions & 1 deletion core/commands/filestore.go
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ The output is:
Options: []cmdkit.Option{
cmdkit.BoolOption(fileOrderOptionName, "sort the results based on the path of the backing file"),
},
PreRun: cmdenv.EnableCidBaseGlobal,
Run: func(req *cmds.Request, res cmds.ResponseEmitter, env cmds.Environment) error {
_, fs, err := getFilestore(env)
if err != nil {
Expand Down Expand Up @@ -121,6 +122,7 @@ For ERROR entries the error will also be printed to stderr.
Options: []cmdkit.Option{
cmdkit.BoolOption(fileOrderOptionName, "verify the objects based on the order of the backing file"),
},
PreRun: cmdenv.EnableCidBaseGlobal,
Run: func(req *cmds.Request, res cmds.ResponseEmitter, env cmds.Environment) error {
_, fs, err := getFilestore(env)
if err != nil {
Expand Down Expand Up @@ -184,6 +186,12 @@ var dupsFileStore = &cmds.Command{
if err != nil {
return err
}

enc, err := cmdenv.ProcCidBase(req)
if err != nil {
return err
}

ch, err := fs.FileManager().AllKeysChan(req.Context)
if err != nil {
return err
Expand All @@ -195,7 +203,7 @@ var dupsFileStore = &cmds.Command{
return res.Emit(&RefWrapper{Err: err.Error()})
}
if have {
if err := res.Emit(&RefWrapper{Ref: cid.String()}); err != nil {
if err := res.Emit(&RefWrapper{Ref: enc.Encode(cid)}); err != nil {
return err
}
}
Expand Down
15 changes: 10 additions & 5 deletions core/commands/ls.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import (
uio "gx/ipfs/QmUnHNqhSB1JgzVCxL1Kz3yb4bdyB4q1Z9AD5AUBVmt3fZ/go-unixfs/io"
unixfspb "gx/ipfs/QmUnHNqhSB1JgzVCxL1Kz3yb4bdyB4q1Z9AD5AUBVmt3fZ/go-unixfs/pb"
blockservice "gx/ipfs/QmVDTbzzTwnuBwNbJdhW3u7LoBQp46bezm9yp4z1RoEepM/go-blockservice"
cidenc "gx/ipfs/QmVjZoEZg2oxXGFGjbD28x3gGN6ALHAW6BN2LKRUcaJ21i/go-cidutil/cidenc"
offline "gx/ipfs/QmYZwey1thDTynSrvd6qQkX24UpTka6TFhQ2v569UpoqxD/go-ipfs-exchange-offline"
cmds "gx/ipfs/Qma6uuSyjkecGhMFFLfzyJDPyoDtNJSHJNweDccZhaWkgU/go-ipfs-cmds"
merkledag "gx/ipfs/QmcGt25mrjuB2kKW2zhPbXVZNHc4yoTDQ65NA8m6auP2f1/go-merkledag"
Expand Down Expand Up @@ -91,9 +92,13 @@ The JSON output contains type information.
if err != nil {
return err
}

paths := req.Arguments

enc, err := cmdenv.ProcCidBase(req)
if err != nil {
return err
}

var dagnodes []ipld.Node
for _, fpath := range paths {
p, err := iface.ParsePath(fpath)
Expand Down Expand Up @@ -131,7 +136,7 @@ The JSON output contains type information.
}
outputLinks := make([]LsLink, len(links))
for j, link := range links {
lsLink, err := makeLsLink(req, dserv, resolve, link)
lsLink, err := makeLsLink(req, dserv, resolve, link, enc)
if err != nil {
return err
}
Expand Down Expand Up @@ -165,7 +170,7 @@ The JSON output contains type information.
return linkResult.Err
}
link := linkResult.Link
lsLink, err := makeLsLink(req, dserv, resolve, link)
lsLink, err := makeLsLink(req, dserv, resolve, link, enc)
if err != nil {
return err
}
Expand Down Expand Up @@ -224,7 +229,7 @@ func makeDagNodeLinkResults(req *cmds.Request, dagnode ipld.Node) <-chan unixfs.
return linkResults
}

func makeLsLink(req *cmds.Request, dserv ipld.DAGService, resolve bool, link *ipld.Link) (*LsLink, error) {
func makeLsLink(req *cmds.Request, dserv ipld.DAGService, resolve bool, link *ipld.Link, enc cidenc.Interface) (*LsLink, error) {
t := unixfspb.Data_DataType(-1)

switch link.Cid.Type() {
Expand All @@ -250,7 +255,7 @@ func makeLsLink(req *cmds.Request, dserv ipld.DAGService, resolve bool, link *ip
}
return &LsLink{
Name: link.Name,
Hash: link.Cid.String(),
Hash: enc.Encode(link.Cid),
Size: link.Size,
Type: t,
}, nil
Expand Down
Loading

0 comments on commit f124585

Please sign in to comment.