Commit 68abb41a authored by Kevin Atkinson's avatar Kevin Atkinson

Add ability to change CID version.

parent 7333c60a
...@@ -13,7 +13,7 @@ import ( ...@@ -13,7 +13,7 @@ import (
) )
func usage() { func usage() {
fmt.Fprintf(os.Stderr, "usage: %s [-b multibase-code] <fmt-str> <cid> ...\n\n", os.Args[0]) fmt.Fprintf(os.Stderr, "usage: %s [-b multibase-code] [-v cid-version] <fmt-str> <cid> ...\n\n", os.Args[0])
fmt.Fprintf(os.Stderr, "<fmt-str> is either 'prefix' or a printf style format string:\n%s", fmtRef) fmt.Fprintf(os.Stderr, "<fmt-str> is either 'prefix' or a printf style format string:\n%s", fmtRef)
os.Exit(1) os.Exit(1)
} }
...@@ -46,16 +46,38 @@ func main() { ...@@ -46,16 +46,38 @@ func main() {
usage() usage()
} }
newBase := mb.Encoding(-1) newBase := mb.Encoding(-1)
var verConv func(cid *c.Cid) (*c.Cid, error)
args := os.Args[1:] args := os.Args[1:]
if args[0] == "-b" { outer:
if len(args) < 2 { for {
usage() switch args[0] {
} case "-b":
if len(args[1]) != 1 { if len(args) < 2 {
fmt.Fprintf(os.Stderr, "Error: Invalid multibase code: %s\n", args[1]) usage()
}
if len(args[1]) != 1 {
fmt.Fprintf(os.Stderr, "Error: Invalid multibase code: %s\n", args[1])
os.Exit(1)
}
newBase = mb.Encoding(args[1][0])
args = args[2:]
case "-v":
if len(args) < 2 {
usage()
}
switch args[1] {
case "0":
verConv = toCidV0
case "1":
verConv = toCidV1
default:
fmt.Fprintf(os.Stderr, "Error: Invalid cid version: %s\n", args[1])
os.Exit(1)
}
args = args[2:]
default:
break outer
} }
newBase = mb.Encoding(args[1][0])
args = args[2:]
} }
if len(args) < 2 { if len(args) < 2 {
usage() usage()
...@@ -71,15 +93,24 @@ func main() { ...@@ -71,15 +93,24 @@ func main() {
} }
for _, cidStr := range args[1:] { for _, cidStr := range args[1:] {
base, cid, err := decode(cidStr) base, cid, err := decode(cidStr)
if newBase != -1 {
base = newBase
}
if err != nil { if err != nil {
fmt.Fprintf(os.Stderr, "Error: %s: %v\n", cidStr, err) fmt.Fprintf(os.Stderr, "Error: %s: %v\n", cidStr, err)
fmt.Fprintf(os.Stdout, "!INVALID_CID!\n") fmt.Fprintf(os.Stdout, "!INVALID_CID!\n")
// Don't abort on a bad cid // Don't abort on a bad cid
continue continue
} }
if newBase != -1 {
base = newBase
}
if verConv != nil {
cid, err = verConv(cid)
if err != nil {
fmt.Fprintf(os.Stderr, "Error: %s: %v\n", cidStr, err)
fmt.Fprintf(os.Stdout, "!CONVERSION_ERROR!\n")
// Don't abort on a bad conversion
continue
}
}
str, err := fmtCid(fmtStr, base, cid) str, err := fmtCid(fmtStr, base, cid)
if err != nil { if err != nil {
fmt.Fprintf(os.Stderr, "Error: %v\n", err) fmt.Fprintf(os.Stderr, "Error: %v\n", err)
...@@ -221,3 +252,14 @@ func encode(base mb.Encoding, data []byte, strip bool) string { ...@@ -221,3 +252,14 @@ func encode(base mb.Encoding, data []byte, strip bool) string {
} }
return str return str
} }
func toCidV0(cid *c.Cid) (*c.Cid, error) {
if cid.Type() != c.DagProtobuf {
return nil, fmt.Errorf("can't convert non-protobuf nodes to cidv0")
}
return c.NewCidV0(cid.Hash()), nil
}
func toCidV1(cid *c.Cid) (*c.Cid, error) {
return c.NewCidV1(cid.Type(), cid.Hash()), nil
}
...@@ -71,3 +71,40 @@ func testFmt(t *testing.T, cidStr string, newBase mb.Encoding, fmtStr string, re ...@@ -71,3 +71,40 @@ func testFmt(t *testing.T, cidStr string, newBase mb.Encoding, fmtStr string, re
t.Error(fmt.Sprintf("expected: %s; but got: %s", result, str)) t.Error(fmt.Sprintf("expected: %s; but got: %s", result, str))
} }
} }
func TestCidConv(t *testing.T) {
cidv0 := "QmUNLLsPACCz1vLxQVkXqqLX5R1X345qqfHbsf67hvA3Nn"
cidv1 := "zdj7WbTaiJT1fgatdet9Ei9iDB5hdCxkbVyhyh8YTUnXMiwYi"
_, cid, err := decode(cidv0)
if err != nil {
t.Fatal(err)
}
cid, err = toCidV1(cid)
if err != nil {
t.Fatal(err)
}
if cid.String() != cidv1 {
t.Fatal("conversion failure")
}
cid, err = toCidV0(cid)
if err != nil {
t.Fatal(err)
}
cidStr := cid.String()
if cidStr != cidv0 {
t.Error(fmt.Sprintf("conversion failure, expected: %s; but got: %s", cidv0, cidStr))
}
}
func TestBadCidConv(t *testing.T) {
// this cid is a raw leaf and should not be able to convert to cidv0
cidv1 := "zb2rhhzX7uSKrtQ2ZZXFAabKiKFYZrJqKY2KE1cJ8yre2GSWZ"
_, cid, err := decode(cidv1)
if err != nil {
t.Fatal(err)
}
cid, err = toCidV0(cid)
if err == nil {
t.Fatal("expected failure")
}
}
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment