mirror of
https://github.com/containers/skopeo.git
synced 2025-09-19 17:15:32 +00:00
main: Error out if an unrecognized subcommand is provided
Surprisingly, the spf13/cobra CLI parsing logic, when presented with an unknown subcommand outputs usage to stdout and *exits successfully*. This is bad for both users and scripts. Cargo cult some code I found in podman to handle this. Motivated by https://github.com/containers/containers-image-proxy-rs/pull/1 Signed-off-by: Colin Walters <walters@verbum.org>
This commit is contained in:
committed by
Lokesh Mandvekar
parent
c2732cb15d
commit
4acc9f0d2c
@@ -3,6 +3,7 @@ package main
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
commonFlag "github.com/containers/common/pkg/flag"
|
commonFlag "github.com/containers/common/pkg/flag"
|
||||||
@@ -34,6 +35,21 @@ type globalOptions struct {
|
|||||||
tmpDir string // Path to use for big temporary files
|
tmpDir string // Path to use for big temporary files
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// requireSubcommand returns an error if no sub command is provided
|
||||||
|
// This was copied from podman: `github.com/containers/podman/cmd/podman/validate/args.go
|
||||||
|
// Some small style changes to match skopeo were applied, but try to apply any
|
||||||
|
// bugfixes there first.
|
||||||
|
func requireSubcommand(cmd *cobra.Command, args []string) error {
|
||||||
|
if len(args) > 0 {
|
||||||
|
suggestions := cmd.SuggestionsFor(args[0])
|
||||||
|
if len(suggestions) == 0 {
|
||||||
|
return fmt.Errorf("Unrecognized command `%[1]s %[2]s`\nTry '%[1]s --help' for more information", cmd.CommandPath(), args[0])
|
||||||
|
}
|
||||||
|
return fmt.Errorf("Unrecognized command `%[1]s %[2]s`\n\nDid you mean this?\n\t%[3]s\n\nTry '%[1]s --help' for more information", cmd.CommandPath(), args[0], strings.Join(suggestions, "\n\t"))
|
||||||
|
}
|
||||||
|
return fmt.Errorf("Missing command '%[1]s COMMAND'\nTry '%[1]s --help' for more information", cmd.CommandPath())
|
||||||
|
}
|
||||||
|
|
||||||
// createApp returns a cobra.Command, and the underlying globalOptions object, to be run or tested.
|
// createApp returns a cobra.Command, and the underlying globalOptions object, to be run or tested.
|
||||||
func createApp() (*cobra.Command, *globalOptions) {
|
func createApp() (*cobra.Command, *globalOptions) {
|
||||||
opts := globalOptions{}
|
opts := globalOptions{}
|
||||||
@@ -41,6 +57,7 @@ func createApp() (*cobra.Command, *globalOptions) {
|
|||||||
rootCommand := &cobra.Command{
|
rootCommand := &cobra.Command{
|
||||||
Use: "skopeo",
|
Use: "skopeo",
|
||||||
Long: "Various operations with container images and container image registries",
|
Long: "Various operations with container images and container image registries",
|
||||||
|
RunE: requireSubcommand,
|
||||||
PersistentPreRunE: func(cmd *cobra.Command, args []string) error {
|
PersistentPreRunE: func(cmd *cobra.Command, args []string) error {
|
||||||
return opts.before(cmd)
|
return opts.before(cmd)
|
||||||
},
|
},
|
||||||
|
Reference in New Issue
Block a user