Repository: urfave/cli
Pull request #1350 (2022-04-19 20:27:44)

Auto-detect zsh via `SHELL` (#1218)
as re-opening #1218 is not currently possible given the source branch was deleted.

This PR is the result of:

```bash
curl -fsSL \
  https://patch-diff.githubusercontent.com/raw/urfave/cli/pull/1218.patch |
  git am
```

## What type of PR is this?

_(REQUIRED)_

- documentation
- feature

## What this PR does / why we need it:

See #1218 

## Which issue(s) this PR fixes:

See #1218


Patch:
diff --git a/autocomplete/zsh_autocomplete b/autocomplete/zsh_autocomplete
index cf39c88..b519666 100644
--- a/autocomplete/zsh_autocomplete
+++ b/autocomplete/zsh_autocomplete
@@ -1,14 +1,13 @@
 #compdef $PROG
 
 _cli_zsh_autocomplete() {
-
   local -a opts
   local cur
   cur=${words[-1]}
   if [[ "$cur" == "-"* ]]; then
-    opts=("${(@f)$(_CLI_ZSH_AUTOCOMPLETE_HACK=1 ${words[@]:0:#words[@]-1} ${cur} --generate-bash-completion)}")
+    opts=("${(@f)$(${words[@]:0:#words[@]-1} ${cur} --generate-bash-completion)}")
   else
-    opts=("${(@f)$(_CLI_ZSH_AUTOCOMPLETE_HACK=1 ${words[@]:0:#words[@]-1} --generate-bash-completion)}")
+    opts=("${(@f)$(${words[@]:0:#words[@]-1} --generate-bash-completion)}")
   fi
 
   if [[ "${opts[1]}" != "" ]]; then
@@ -16,8 +15,6 @@ _cli_zsh_autocomplete() {
   else
     _files
   fi
-
-  return
 }
 
 compdef _cli_zsh_autocomplete $PROG
diff --git a/docs/v2/manual.md b/docs/v2/manual.md
index 3e0bf95..fd5656a 100644
--- a/docs/v2/manual.md
+++ b/docs/v2/manual.md
@@ -1165,15 +1165,14 @@ func main() {
 ```
 
 #### ZSH Support
-Auto-completion for ZSH is also supported using the `autocomplete/zsh_autocomplete` 
-file included in this repo. Two environment variables are used, `PROG` and `_CLI_ZSH_AUTOCOMPLETE_HACK`. 
-Set `PROG` to the program name as before, set `_CLI_ZSH_AUTOCOMPLETE_HACK` to `1`, and 
-then `source path/to/autocomplete/zsh_autocomplete`. Adding the following lines to your ZSH 
-configuration file (usually `.zshrc`) will allow the auto-completion to persist across new shells:
+Auto-completion for ZSH is also supported using the `autocomplete/zsh_autocomplete`
+file included in this repo. One environment variable is used, `PROG`.  Set
+`PROG` to the program name as before, and then `source path/to/autocomplete/zsh_autocomplete`.
+Adding the following lines to your ZSH configuration file (usually `.zshrc`)
+will allow the auto-completion to persist across new shells:
 
 ```
 PROG=<myprogram>
-_CLI_ZSH_AUTOCOMPLETE_HACK=1
 source  path/to/autocomplete/zsh_autocomplete
 ```
 #### ZSH default auto-complete example
diff --git a/help.go b/help.go
index 5103392..26c497b 100644
--- a/help.go
+++ b/help.go
@@ -107,7 +107,7 @@ func printCommandSuggestions(commands []*Command, writer io.Writer) {
 		if command.Hidden {
 			continue
 		}
-		if os.Getenv("_CLI_ZSH_AUTOCOMPLETE_HACK") == "1" {
+		if strings.HasSuffix(os.Getenv("SHELL"), "zsh") {
 			for _, name := range command.Names() {
 				_, _ = fmt.Fprintf(writer, "%s:%s\n", name, command.Usage)
 			}


Test patch:
diff --git a/app_test.go b/app_test.go
index 28b497c..26ae28a 100644
--- a/app_test.go
+++ b/app_test.go
@@ -228,6 +228,7 @@ func ExampleApp_Run_subcommandNoAction() {
 }
 
 func ExampleApp_Run_bashComplete_withShortFlag() {
+	os.Setenv("SHELL", "bash")
 	os.Args = []string{"greet", "-", "--generate-bash-completion"}
 
 	app := NewApp()
@@ -255,6 +256,7 @@ func ExampleApp_Run_bashComplete_withShortFlag() {
 }
 
 func ExampleApp_Run_bashComplete_withLongFlag() {
+	os.Setenv("SHELL", "bash")
 	os.Args = []string{"greet", "--s", "--generate-bash-completion"}
 
 	app := NewApp()
@@ -283,6 +285,7 @@ func ExampleApp_Run_bashComplete_withLongFlag() {
 	// --similar-flag
 }
 func ExampleApp_Run_bashComplete_withMultipleLongFlag() {
+	os.Setenv("SHELL", "bash")
 	os.Args = []string{"greet", "--st", "--generate-bash-completion"}
 
 	app := NewApp()
@@ -315,7 +318,7 @@ func ExampleApp_Run_bashComplete_withMultipleLongFlag() {
 }
 
 func ExampleApp_Run_bashComplete() {
-	// set args for examples sake
+	os.Setenv("SHELL", "bash")
 	os.Args = []string{"greet", "--generate-bash-completion"}
 
 	app := &App{
@@ -355,7 +358,7 @@ func ExampleApp_Run_bashComplete() {
 func ExampleApp_Run_zshComplete() {
 	// set args for examples sake
 	os.Args = []string{"greet", "--generate-bash-completion"}
-	_ = os.Setenv("_CLI_ZSH_AUTOCOMPLETE_HACK", "1")
+	_ = os.Setenv("SHELL", "/usr/bin/zsh")
 
 	app := NewApp()
 	app.Name = "greet"
diff --git a/help_test.go b/help_test.go
index 98530dd..17a263d 100644
--- a/help_test.go
+++ b/help_test.go
@@ -1040,12 +1040,16 @@ func TestHideHelpCommand_WithSubcommands(t *testing.T) {
 }
 
 func TestDefaultCompleteWithFlags(t *testing.T) {
+	origEnv := os.Environ()
 	origArgv := os.Args
 
 	t.Cleanup(func() {
 		os.Args = origArgv
+		resetEnv(origEnv)
 	})
 
+	os.Setenv("SHELL", "bash")
+
 	for _, tc := range []struct {
 		name     string
 		c        *Context