Commit 5d18c570 authored by Brandon Philips's avatar Brandon Philips
Browse files

dm: cleanup CLI UX for people getting started

Before this patch dm would print out the wall of usage text that would
scroll off the screen in many error cases. This made learning dm hard.
Instead have more compact error output, like kubectl, and only return
non-zero on real errors.

```
$ dm foo ; echo $?
Error: unknown command 'foo' for 'dm'
Run 'dm --help' for usage
1
$ dm deployed-instances; echo $?
No type name supplied
1
$ dm 2> /dev/null; echo $?
0
```

There is more to do to make this tool friendlier but this was
low-hanging.
parent 5343c35b
main Release add-codeql dependabot/go_modules/github.com/docker/distribution-2.8.2incompatible dependabot/go_modules/github.com/lib/pq-1.10.9 dependabot/go_modules/github.com/rubenv/sql-migrate-1.4.0 dependabot/go_modules/golang.org/x/crypto-0.9.0 dependabot/go_modules/golang.org/x/term-0.8.0 dependabot/go_modules/k8s.io/klog/v2-2.100.1 dev-v2 feat-v3/event-emitter-lua kube-update-test release-2.0 release-2.1 release-2.10 release-2.11 release-2.12 release-2.13 release-2.14 release-2.15 release-2.16 release-2.17 release-2.2 release-2.3 release-2.4 release-2.5 release-2.6 release-2.7 release-2.8 release-2.9 release-3.0 release-3.1 release-3.10 release-3.11 release-3.12 release-3.2 release-3.3 release-3.4 release-3.5 release-3.6 release-3.6.1 release-3.6.2 release-3.7 release-3.8 release-3.9 release-v1.2.1 release-v3.0.0-beta.4 1.999.0 v3.12.0 v3.12.0-rc.1 v3.12.0-dev.1 v3.11.3 v3.11.2 v3.11.1 v3.11.0 v3.11.0-rc.2 v3.11.0-rc.1 v3.10.3 v3.10.2 v3.10.1 v3.10.0 v3.10.0-rc.1 v3.9.4 v3.9.3 v3.9.2 v3.9.1 v3.9.0 v3.9.0-rc.1 v3.8.2 v3.8.1 v3.8.0 v3.8.0-rc.2 v3.8.0-rc.1 v3.7.2 v3.7.1 v3.7.0 v3.7.0-rc.3 v3.7.0-rc.2 v3.7.0-rc.1 v3.6.3 v3.6.2 v3.6.1 v3.6.0 v3.6.0-rc.1 v3.5.4 v3.5.3 v3.5.2 v3.5.1 v3.5.0 v3.5.0-rc.2 v3.5.0-rc.1 v3.4.2 v3.4.1 v3.4.0 v3.4.0-rc.1 v3.3.4 v3.3.3 v3.3.2 v3.3.1 v3.3.0 v3.3.0-rc.2 v3.3.0-rc.1 v3.2.4 v3.2.3 v3.2.2 v3.2.1 v3.2.0 v3.2.0-rc.1 v3.1.3 v3.1.2 v3.1.1 v3.1.0 v3.1.0-rc.3 v3.1.0-rc.2 v3.1.0-rc.1 v3.0.3 v3.0.2 v3.0.1 v3.0.0 v3.0.0-rc.4 v3.0.0-rc.3 v3.0.0-rc.2 v3.0.0-rc.1 v3.0.0-beta.5 v3.0.0-beta.4 v3.0.0-beta.3 v3.0.0-beta.2 v3.0.0-beta.1 v3.0.0-alpha.2 v3.0.0-alpha.1 v2.17.0 v2.17.0-rc.1 v2.16.12 v2.16.11 v2.16.10 v2.16.9 v2.16.8 v2.16.7 v2.16.6 v2.16.5 v2.16.4 v2.16.3 v2.16.2 v2.16.1 v2.16.0 v2.16.0-rc.2 v2.16.0-rc.1 v2.15.2 v2.15.1 v2.15.0 v2.15.0-rc.2 v2.15.0-rc.1 v2.14.3 v2.14.2 v2.14.1 v2.14.0 v2.14.0-rc.2 v2.14.0-rc.1 v2.13.1 v2.13.1-rc.1 v2.13.0 v2.13.0-rc.2 v2.13.0-rc.1 v2.12.3 v2.12.2 v2.12.1 v2.12.0 v2.12.0-rc.2 v2.12.0-rc.1 v2.11.0 v2.11.0-rc.4 v2.11.0-rc.3 v2.11.0-rc.2 v2.11.0-rc.1 v2.10.0 v2.10.0-rc.3 v2.10.0-rc.2 v2.10.0-rc.1 v2.9.1 v2.9.0 v2.9.0-rc5 v2.9.0-rc4 v2.9.0-rc3 v2.9.0-rc2 v2.9.0-rc1 v2.8.2 v2.8.2-rc1 v2.8.1 v2.8.0 v2.8.0-rc.1 v2.7.2 v2.7.1 v2.7.0 v2.7.0-rc1 v2.6.2 v2.6.1 v2.6.0 v2.5.1 v2.5.0 v2.4.2 v2.4.1 v2.4.0 v2.3.1 v2.3.0 v2.2.3 v2.2.2 v2.2.1 v2.2.0 v2.1.3 v2.1.2 v2.1.1 v2.1.0 v2.0.2 v2.0.1 v2.0.0 v2.0.0-rc.2 v2.0.0-rc.1 v2.0.0-beta.2 v2.0.0-beta.1 v2.0.0-alpha.5 v2.0.0-alpha.4 v2.0.0-alpha.3 v2.0.0-alpha.2 v2.0.0-alpha.1 v1.2.1 v1.2 v1.1 v1.0
No related merge requests found
Showing with 12 additions and 11 deletions
+12 -11
...@@ -83,7 +83,7 @@ var usage = func() { ...@@ -83,7 +83,7 @@ var usage = func() {
fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr)
fmt.Fprintln(os.Stderr, "--stdin requires a file name and either the file contents or a tar archive containing the named file.") fmt.Fprintln(os.Stderr, "--stdin requires a file name and either the file contents or a tar archive containing the named file.")
fmt.Fprintln(os.Stderr, " a tar archive may include any additional files referenced directly or indirectly by the named file.") fmt.Fprintln(os.Stderr, " a tar archive may include any additional files referenced directly or indirectly by the named file.")
panic("\n") os.Exit(0)
} }
func getGithubCredential() *common.RegistryCredential { func getGithubCredential() *common.RegistryCredential {
...@@ -136,7 +136,6 @@ func execute() { ...@@ -136,7 +136,6 @@ func execute() {
flag.Parse() flag.Parse()
args := flag.Args() args := flag.Args()
if len(args) < 1 { if len(args) < 1 {
fmt.Fprintln(os.Stderr, "No command supplied")
usage() usage()
} }
...@@ -173,7 +172,7 @@ func execute() { ...@@ -173,7 +172,7 @@ func execute() {
case "get": case "get":
if len(args) < 2 { if len(args) < 2 {
fmt.Fprintln(os.Stderr, "No deployment name supplied") fmt.Fprintln(os.Stderr, "No deployment name supplied")
usage() os.Exit(1)
} }
path := fmt.Sprintf("deployments/%s", args[1]) path := fmt.Sprintf("deployments/%s", args[1])
...@@ -183,14 +182,14 @@ func execute() { ...@@ -183,14 +182,14 @@ func execute() {
msg := "Must specify manifest in the form <deployment>/<manifest> or <deployment> to list." msg := "Must specify manifest in the form <deployment>/<manifest> or <deployment> to list."
if len(args) < 2 { if len(args) < 2 {
fmt.Fprintln(os.Stderr, msg) fmt.Fprintln(os.Stderr, msg)
usage() os.Exit(1)
} }
s := strings.Split(args[1], "/") s := strings.Split(args[1], "/")
ls := len(s) ls := len(s)
if ls < 1 || ls > 2 { if ls < 1 || ls > 2 {
fmt.Fprintln(os.Stderr, fmt.Sprintf("Invalid manifest (%s), %s", args[1], msg)) fmt.Fprintln(os.Stderr, fmt.Sprintf("Invalid manifest (%s), %s", args[1], msg))
usage() os.Exit(1)
} }
path := fmt.Sprintf("deployments/%s/manifests", s[0]) path := fmt.Sprintf("deployments/%s/manifests", s[0])
...@@ -203,7 +202,7 @@ func execute() { ...@@ -203,7 +202,7 @@ func execute() {
case "delete": case "delete":
if len(args) < 2 { if len(args) < 2 {
fmt.Fprintln(os.Stderr, "No deployment name supplied") fmt.Fprintln(os.Stderr, "No deployment name supplied")
usage() os.Exit(1)
} }
path := fmt.Sprintf("deployments/%s", args[1]) path := fmt.Sprintf("deployments/%s", args[1])
...@@ -219,7 +218,7 @@ func execute() { ...@@ -219,7 +218,7 @@ func execute() {
case "deployed-instances": case "deployed-instances":
if len(args) < 2 { if len(args) < 2 {
fmt.Fprintln(os.Stderr, "No type name supplied") fmt.Fprintln(os.Stderr, "No type name supplied")
usage() os.Exit(1)
} }
tUrls := getDownloadURLs(args[1]) tUrls := getDownloadURLs(args[1])
...@@ -237,7 +236,9 @@ func execute() { ...@@ -237,7 +236,9 @@ func execute() {
case "registries": case "registries":
callService("registries", "GET", "list registries", nil) callService("registries", "GET", "list registries", nil)
default: default:
usage() fmt.Fprintf(os.Stderr, "Error: unknown command '%s' for 'dm'\n", args[0])
fmt.Fprintln(os.Stderr, "Run 'dm --help' for usage")
os.Exit(1)
} }
} }
...@@ -292,7 +293,7 @@ func callHttp(path, method, action string, reader io.ReadCloser) string { ...@@ -292,7 +293,7 @@ func callHttp(path, method, action string, reader io.ReadCloser) string {
func describeType(args []string) { func describeType(args []string) {
if len(args) != 2 { if len(args) != 2 {
fmt.Fprintln(os.Stderr, "No type name or URL supplied") fmt.Fprintln(os.Stderr, "No type name or URL supplied")
usage() os.Exit(1)
} }
tUrls := getDownloadURLs(args[1]) tUrls := getDownloadURLs(args[1])
...@@ -320,12 +321,12 @@ func loadTemplate(args []string) *common.Template { ...@@ -320,12 +321,12 @@ func loadTemplate(args []string) *common.Template {
var err error var err error
if len(args) < 2 { if len(args) < 2 {
fmt.Fprintln(os.Stderr, "No template name or configuration(s) supplied") fmt.Fprintln(os.Stderr, "No template name or configuration(s) supplied")
usage() os.Exit(1)
} }
if *stdin { if *stdin {
if len(args) < 2 { if len(args) < 2 {
usage() os.Exit(1)
} }
input, err := ioutil.ReadAll(os.Stdin) input, err := ioutil.ReadAll(os.Stdin)
......
Supports Markdown
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