From 0021d7829f4de2b35969cd6d3dc822770d0e55e3 Mon Sep 17 00:00:00 2001 From: Will Scott Date: Thu, 6 Jan 2022 10:22:53 +0100 Subject: [PATCH 1/2] make specification of root cid in get-dag cmd optional add a test script --- cmd/car/get.go | 35 ++++++++++++++++++++++++--------- cmd/car/testdata/script/get.txt | 6 ++++++ 2 files changed, 32 insertions(+), 9 deletions(-) create mode 100644 cmd/car/testdata/script/get.txt diff --git a/cmd/car/get.go b/cmd/car/get.go index 324f050a..de220c52 100644 --- a/cmd/car/get.go +++ b/cmd/car/get.go @@ -66,27 +66,41 @@ func GetCarBlock(c *cli.Context) error { // GetCarDag is a command to get a dag out of a car func GetCarDag(c *cli.Context) error { - if c.Args().Len() < 3 { - return fmt.Errorf("usage: car get-dag [-s selector] ") + if c.Args().Len() < 2 { + return fmt.Errorf("usage: car get-dag [-s selector] [root cid] ") } - // string to CID for the root of the DAG to extract - rootCid, err := cid.Parse(c.Args().Get(1)) - if err != nil { - return err - } + // if root cid is emitted we'll read it from the root of file.car. + output := c.Args().Get(1) + var rootCid cid.Cid bs, err := blockstore.OpenReadOnly(c.Args().Get(0)) if err != nil { return err } - output := c.Args().Get(2) + if c.Args().Len() == 2 { + roots, err := bs.Roots() + if err != nil { + return err + } + if len(roots) != 1 { + return fmt.Errorf("car file has does not have exactly one root, dag root must be specified explicitly") + } + rootCid = roots[0] + } else { + rootCid, err = cid.Parse(output) + if err != nil { + return err + } + output = c.Args().Get(2) + } + strict := c.Bool("strict") // selector traversal, default to ExploreAllRecursively which only explores the DAG blocks // because we only care about the blocks loaded during the walk, not the nodes matched - sel := selectorParser.CommonSelector_ExploreAllRecursively + sel := selectorParser.CommonSelector_MatchAllRecursively if c.IsSet("selector") { sel, err = selectorParser.ParseJSONSelector(c.String("selector")) if err != nil { @@ -127,6 +141,9 @@ func writeCarV2(rootCid cid.Cid, output string, bs *blockstore.ReadOnly, strict } return nil, err } + if err := outStore.Put(blk); err != nil { + return nil, err + } return bytes.NewBuffer(blk.RawData()), nil } return nil, fmt.Errorf("unknown link type: %T", l) diff --git a/cmd/car/testdata/script/get.txt b/cmd/car/testdata/script/get.txt new file mode 100644 index 00000000..85751a08 --- /dev/null +++ b/cmd/car/testdata/script/get.txt @@ -0,0 +1,6 @@ +env SAMPLE_CID='bafy2bzaceaycv7jhaegckatnncu5yugzkrnzeqsppzegufr35lroxxnsnpspu' +car get-dag ${INPUTS}/sample-v1.car ${SAMPLE_CID} out.car +! stderr . +car list out.car +! stderr . +stdout -count=1 '^bafy2bzaceaycv7jhaegckatnncu5yugzkrnzeqsppzegufr35lroxxnsnpspu' \ No newline at end of file From 037eebd0c3c1b605011af0c27fc0bf7260926201 Mon Sep 17 00:00:00 2001 From: Will Scott Date: Thu, 6 Jan 2022 11:22:47 +0100 Subject: [PATCH 2/2] rename get-dag test --- cmd/car/testdata/script/{get.txt => get-dag.txt} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename cmd/car/testdata/script/{get.txt => get-dag.txt} (100%) diff --git a/cmd/car/testdata/script/get.txt b/cmd/car/testdata/script/get-dag.txt similarity index 100% rename from cmd/car/testdata/script/get.txt rename to cmd/car/testdata/script/get-dag.txt