From e76f1f8a7268105d7f76695df170c1fa93c83dee Mon Sep 17 00:00:00 2001 From: Jarek Kowalski Date: Tue, 24 Oct 2017 21:59:40 -0700 Subject: [PATCH] refactored various show command into one --- cli/app.go | 1 + cli/command_block_index_list.go | 29 +++++++++++++++ ...dex.go => command_block_index_optimize.go} | 2 +- cli/command_block_index_show.go | 35 +++++++++++++++++++ cli/command_block_show.go | 7 ++-- cli/command_object_ls.go | 18 ++-------- cli/command_object_show.go | 5 ++- cli/show_utils.go | 20 +++++++++-- 8 files changed, 92 insertions(+), 25 deletions(-) create mode 100644 cli/command_block_index_list.go rename cli/{command_block_reindex.go => command_block_index_optimize.go} (84%) create mode 100644 cli/command_block_index_show.go diff --git a/cli/app.go b/cli/app.go index 2fa35f13e..6e00f9f57 100644 --- a/cli/app.go +++ b/cli/app.go @@ -16,6 +16,7 @@ var ( metadataCommands = app.Command("metadata", "Low-level commands to manipulate metadata items.").Alias("md") objectCommands = app.Command("object", "Commands to manipulate objects in repository.").Alias("obj") blockCommands = app.Command("block", "Commands to manipulate blocks in repository.").Alias("blk") + blockIndexCommands = blockCommands.Command("index", "Commands to manipulate block indexes.") ) func init() { diff --git a/cli/command_block_index_list.go b/cli/command_block_index_list.go new file mode 100644 index 000000000..af9224856 --- /dev/null +++ b/cli/command_block_index_list.go @@ -0,0 +1,29 @@ +package cli + +import ( + "fmt" + + kingpin "gopkg.in/alecthomas/kingpin.v2" +) + +var ( + blockIndexListCommand = blockIndexCommands.Command("list", "List block indexes").Alias("ls") +) + +func runListBlockIndexesAction(context *kingpin.ParseContext) error { + rep := mustOpenRepository(nil) + defer rep.Close() + + ch, cancel := rep.Storage.ListBlocks("P") + defer cancel() + + for b := range ch { + fmt.Printf("%-34v %10v %v\n", b.BlockID, b.Length, b.TimeStamp.Local().Format(timeFormat)) + } + + return nil +} + +func init() { + blockIndexListCommand.Action(runListBlockIndexesAction) +} diff --git a/cli/command_block_reindex.go b/cli/command_block_index_optimize.go similarity index 84% rename from cli/command_block_reindex.go rename to cli/command_block_index_optimize.go index 32e23b680..cc5dd0e75 100644 --- a/cli/command_block_reindex.go +++ b/cli/command_block_index_optimize.go @@ -7,7 +7,7 @@ import ( ) var ( - optimizeCommand = blockCommands.Command("reindex", "Optimize block indexes.") + optimizeCommand = blockIndexCommands.Command("optimize", "Optimize block indexes.") optimizeMinAge = optimizeCommand.Flag("min-age", "Minimum age of blocks to re-index").Default("24h").Duration() ) diff --git a/cli/command_block_index_show.go b/cli/command_block_index_show.go new file mode 100644 index 000000000..1abda10b8 --- /dev/null +++ b/cli/command_block_index_show.go @@ -0,0 +1,35 @@ +package cli + +import ( + "bytes" + "fmt" + + kingpin "gopkg.in/alecthomas/kingpin.v2" +) + +var ( + blockIndexShowCommand = blockIndexCommands.Command("show", "List block indexes").Alias("cat") + blockIndexShowIDs = blockIndexShowCommand.Arg("id", "IDs of index blocks to show").Required().Strings() +) + +func runShowBlockIndexesAction(context *kingpin.ParseContext) error { + rep := mustOpenRepository(nil) + defer rep.Close() + + for _, blockID := range *blockIndexShowIDs { + data, err := rep.Blocks.GetBlock(blockID) + if err != nil { + return fmt.Errorf("can't read block %q: %v", blockID, err) + } + + if err := showContentWithFlags(bytes.NewReader(data), true, true); err != nil { + return err + } + } + + return nil +} + +func init() { + blockIndexShowCommand.Action(runShowBlockIndexesAction) +} diff --git a/cli/command_block_show.go b/cli/command_block_show.go index fb5f7ff38..49ba30a99 100644 --- a/cli/command_block_show.go +++ b/cli/command_block_show.go @@ -11,9 +11,7 @@ import ( var ( showBlockCommand = blockCommands.Command("show", "Show contents of a block.").Alias("cat") - showBlockIDs = showBlockCommand.Arg("id", "IDs of blocks to show").Required().Strings() - showBlockJSON = showBlockCommand.Flag("json", "Pretty-print JSON content").Short('j').Bool() - showBlockUnzip = showBlockCommand.Flag("unzip", "Transparently unzip the content").Short('z').Bool() + showBlockIDs = showBlockCommand.Arg("id", "IDs of blocks to show").Required().Strings() ) func runShowBlockCommand(context *kingpin.ParseContext) error { @@ -35,9 +33,10 @@ func showBlock(r *repo.Repository, blockID string) error { return err } - return showContent(bytes.NewReader(data), *showBlockUnzip, *showBlockJSON) + return showContent(bytes.NewReader(data)) } func init() { + setupShowCommand(showBlockCommand) showBlockCommand.Action(runShowBlockCommand) } diff --git a/cli/command_object_ls.go b/cli/command_object_ls.go index ef6034f57..c9fb000fd 100644 --- a/cli/command_object_ls.go +++ b/cli/command_object_ls.go @@ -2,9 +2,6 @@ package cli import ( "fmt" - "strings" - - "github.com/kopia/kopia/repo" kingpin "gopkg.in/alecthomas/kingpin.v2" ) @@ -18,19 +15,10 @@ func runListObjectsAction(context *kingpin.ParseContext) error { rep := mustOpenRepository(nil) defer rep.Close() - ch, cancel := rep.Storage.ListBlocks(*objectListPrefix) - defer cancel() + info := rep.Blocks.ListBlocks(*objectListPrefix, "all") - for b := range ch { - if b.Error != nil { - return b.Error - } - - if strings.HasPrefix(b.BlockID, repo.MetadataBlockPrefix) { - continue - } - - fmt.Printf("D%-34v %10v %v\n", b.BlockID, b.Length, b.TimeStamp.Local().Format(timeFormat)) + for _, b := range info { + fmt.Printf("D%-34v %10v %v\n", b.BlockID, b.Length, b.Timestamp.Local().Format(timeFormat)) } return nil diff --git a/cli/command_object_show.go b/cli/command_object_show.go index 89b7deee6..eea1d2658 100644 --- a/cli/command_object_show.go +++ b/cli/command_object_show.go @@ -15,8 +15,6 @@ var ( showCommand = objectCommands.Command("show", "Show contents of a repository object.").Alias("cat") showObjectIDs = showCommand.Arg("id", "IDs of objects to show").Required().Strings() - showJSON = showCommand.Flag("json", "Pretty-print JSON content").Short('j').Bool() - showUnzip = showCommand.Flag("unzip", "Transparently unzip the content").Short('z').Bool() ) func runShowCommand(context *kingpin.ParseContext) error { @@ -48,9 +46,10 @@ func showObject(r *repo.Repository, oid object.ID) error { } defer rd.Close() - return showContent(rd, *showUnzip, *showJSON) + return showContent(rd) } func init() { + setupShowCommand(showCommand) showCommand.Action(runShowCommand) } diff --git a/cli/show_utils.go b/cli/show_utils.go index dd3658d7a..8a4b84f57 100644 --- a/cli/show_utils.go +++ b/cli/show_utils.go @@ -8,9 +8,25 @@ import ( "io" "io/ioutil" "os" + + "gopkg.in/alecthomas/kingpin.v2" ) -func showContent(rd io.Reader, unzip, formatJSON bool) error { +var ( + commonIndentJSON bool + commonUnzip bool +) + +func setupShowCommand(cmd *kingpin.CmdClause) { + cmd.Flag("json", "Pretty-print JSON content").Short('j').BoolVar(&commonIndentJSON) + cmd.Flag("unzip", "Transparently unzip the content").Short('z').BoolVar(&commonUnzip) +} + +func showContent(rd io.Reader) error { + return showContentWithFlags(rd, commonUnzip, commonIndentJSON) +} + +func showContentWithFlags(rd io.Reader, unzip, indentJSON bool) error { if unzip { gz, err := gzip.NewReader(rd) if err != nil { @@ -21,7 +37,7 @@ func showContent(rd io.Reader, unzip, formatJSON bool) error { } var buf1, buf2 bytes.Buffer - if formatJSON { + if indentJSON { if _, err := io.Copy(&buf1, rd); err != nil { return err }