diff --git a/cmd/restic/cmd_cat.go b/cmd/restic/cmd_cat.go index 693c26790..d3e98b2ff 100644 --- a/cmd/restic/cmd_cat.go +++ b/cmd/restic/cmd_cat.go @@ -12,6 +12,8 @@ import ( "github.com/restic/restic/internal/restic" ) +var catAllowedCmds = []string{"config", "index", "snapshot", "key", "masterkey", "lock", "pack", "blob", "tree"} + var cmdCat = &cobra.Command{ Use: "cat [flags] [masterkey|config|pack ID|blob ID|snapshot ID|index ID|key ID|lock ID|tree snapshot:subfolder]", Short: "Print internal objects to stdout", @@ -30,6 +32,7 @@ Exit status is 11 if the repository is already locked. RunE: func(cmd *cobra.Command, args []string) error { return runCat(cmd.Context(), globalOptions, args) }, + ValidArgs: catAllowedCmds, } func init() { @@ -37,21 +40,19 @@ func init() { } func validateCatArgs(args []string) error { - var allowedCmds = []string{"config", "index", "snapshot", "key", "masterkey", "lock", "pack", "blob", "tree"} - if len(args) < 1 { return errors.Fatal("type not specified") } validType := false - for _, v := range allowedCmds { + for _, v := range catAllowedCmds { if v == args[0] { validType = true break } } if !validType { - return errors.Fatalf("invalid type %q, must be one of [%s]", args[0], strings.Join(allowedCmds, "|")) + return errors.Fatalf("invalid type %q, must be one of [%s]", args[0], strings.Join(catAllowedCmds, "|")) } if args[0] != "masterkey" && args[0] != "config" && len(args) != 2 { diff --git a/cmd/restic/cmd_stats.go b/cmd/restic/cmd_stats.go index 8a78d57f7..60ab1e5bc 100644 --- a/cmd/restic/cmd_stats.go +++ b/cmd/restic/cmd_stats.go @@ -70,10 +70,20 @@ type StatsOptions struct { var statsOptions StatsOptions +func must(err error) { + if err != nil { + panic(fmt.Sprintf("error during setup: %v", err)) + } +} + func init() { cmdRoot.AddCommand(cmdStats) f := cmdStats.Flags() f.StringVar(&statsOptions.countMode, "mode", countModeRestoreSize, "counting mode: restore-size (default), files-by-contents, blobs-per-file or raw-data") + must(cmdStats.RegisterFlagCompletionFunc("mode", func(_ *cobra.Command, _ []string, _ string) ([]string, cobra.ShellCompDirective) { + return []string{countModeRestoreSize, countModeUniqueFilesByContents, countModeBlobsPerFile, countModeRawData}, cobra.ShellCompDirectiveDefault + })) + initMultiSnapshotFilter(f, &statsOptions.SnapshotFilter, true) }