Repository: gohugoio/hugo (language: go)

Issue:
Duplicate methods of generating shell completion scripts
This may not be considered a bug, but I wanted to make the maintainers aware of the situation.

```
$ hugo gen autocomplete -h |head -1
Generates a shell autocompletion script for Hugo.

$ hugo completion -h | head -2
Generate the autocompletion script for hugo for the specified shell.
```

To facilitate the use of shell completion, Cobra 1.2 automatically provides a "completion" command (https://github.com/spf13/cobra/releases/tag/v1.2.0).  This command needs to be explicitly disabled for programs that don't want to use it (https://github.com/spf13/cobra/blob/master/shell_completions.md#adapting-the-default-completion-command).

Hugo 0.87.0 moved to Cobra 1.2.1 and has inherited this new "completion" command.

Note that the "completion" command provided by Cobra is more complete that the one defined in Hugo:
- it provides completion descriptions for Powershell and Bash
- it allows individual users to disable completion descriptions for all shells with the `--no-descriptions` flag
- it uses bash completion V2 which has a 250-line script instead of the 3200-line one generated by Hugo

It is in part to avoid projects missing some of these subtle tweaks that Cobra provides the completion command itself.

### What version of Hugo are you using (`hugo version`)?
0.87.0

### Does this issue reproduce with the latest release?
Yes


Discussion / hints:

Fix patch:
diff --git a/commands/gen.go b/commands/gen.go
index 6878cfe70e2..c44eba36c49 100644
--- a/commands/gen.go
+++ b/commands/gen.go
@@ -31,7 +31,6 @@ func newGenCmd() *genCmd {
 	})
 
 	cc.cmd.AddCommand(
-		newGenautocompleteCmd().getCommand(),
 		newGenDocCmd().getCommand(),
 		newGenManCmd().getCommand(),
 		createGenDocsHelper().getCommand(),
diff --git a/commands/genautocomplete.go b/commands/genautocomplete.go
deleted file mode 100644
index 5cdb7b688ae..00000000000
--- a/commands/genautocomplete.go
+++ /dev/null
@@ -1,93 +0,0 @@
-// Copyright 2015 The Hugo Authors. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package commands
-
-import (
-	"io"
-	"os"
-
-	"github.com/spf13/cobra"
-	jww "github.com/spf13/jwalterweatherman"
-)
-
-var _ cmder = (*genautocompleteCmd)(nil)
-
-type genautocompleteCmd struct {
-	autocompleteTarget string
-
-	// bash, zsh, fish or powershell
-	autocompleteType string
-
-	*baseCmd
-}
-
-func newGenautocompleteCmd() *genautocompleteCmd {
-	cc := &genautocompleteCmd{}
-
-	cc.baseCmd = newBaseCmd(&cobra.Command{
-		Use:   "autocomplete",
-		Short: "Generate shell autocompletion script for Hugo",
-		Long: `Generates a shell autocompletion script for Hugo.
-
-The script is written to the console (stdout).
-
-To write to file, add the ` + "`--completionfile=/path/to/file`" + ` flag.
-
-Add ` + "`--type={bash, zsh, fish or powershell}`" + ` flag to set alternative
-shell type.
-
-Logout and in again to reload the completion scripts,
-or just source them in directly:
-
-	$ . /etc/bash_completion or /path/to/file`,
-
-		RunE: func(cmd *cobra.Command, args []string) error {
-			var err error
-			var target io.Writer
-
-			if cc.autocompleteTarget == "" {
-				target = os.Stdout
-			} else {
-				target, _ = os.OpenFile(cc.autocompleteTarget, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
-			}
-
-			switch cc.autocompleteType {
-			case "bash":
-				err = cmd.Root().GenBashCompletion(target)
-			case "zsh":
-				err = cmd.Root().GenZshCompletion(target)
-			case "fish":
-				err = cmd.Root().GenFishCompletion(target, true)
-			case "powershell":
-				err = cmd.Root().GenPowerShellCompletion(target)
-			default:
-				return newUserError("Unsupported completion type")
-			}
-
-			if err != nil {
-				return err
-			}
-
-			if cc.autocompleteTarget != "" {
-				jww.FEEDBACK.Println(cc.autocompleteType+" completion file for Hugo saved to", cc.autocompleteTarget)
-			}
-			return nil
-		},
-	})
-
-	cc.cmd.PersistentFlags().StringVarP(&cc.autocompleteTarget, "completionfile", "f", "", "autocompletion file, defaults to stdout")
-	cc.cmd.PersistentFlags().StringVarP(&cc.autocompleteType, "type", "t", "bash", "autocompletion type (bash, zsh, fish, or powershell)")
-
-	return cc
-}
diff --git a/docs/content/en/commands/hugo.md b/docs/content/en/commands/hugo.md
index 94d933c8aae..827bb89e6cb 100644
--- a/docs/content/en/commands/hugo.md
+++ b/docs/content/en/commands/hugo.md
@@ -68,7 +68,6 @@ hugo [flags]
 
 ### SEE ALSO
 
-* [hugo check](/commands/hugo_check/)	 - Contains some verification checks
 * [hugo completion](/commands/hugo_completion/)	 - generate the autocompletion script for the specified shell
 * [hugo config](/commands/hugo_config/)	 - Print the site configuration
 * [hugo convert](/commands/hugo_convert/)	 - Convert your content to different formats
diff --git a/docs/content/en/commands/hugo_gen.md b/docs/content/en/commands/hugo_gen.md
index fc321a9e96b..55fb1f2bbb9 100644
--- a/docs/content/en/commands/hugo_gen.md
+++ b/docs/content/en/commands/hugo_gen.md
@@ -33,7 +33,6 @@ A collection of several useful generators.
 ### SEE ALSO
 
 * [hugo](/commands/hugo/)	 - hugo builds your site
-* [hugo gen autocomplete](/commands/hugo_gen_autocomplete/)	 - Generate shell autocompletion script for Hugo
 * [hugo gen chromastyles](/commands/hugo_gen_chromastyles/)	 - Generate CSS stylesheet for the Chroma code highlighter
 * [hugo gen doc](/commands/hugo_gen_doc/)	 - Generate Markdown documentation for the Hugo CLI.
 * [hugo gen man](/commands/hugo_gen_man/)	 - Generate man pages for the Hugo CLI
diff --git a/docs/content/en/commands/hugo_gen_autocomplete.md b/docs/content/en/commands/hugo_gen_autocomplete.md
deleted file mode 100644
index 77f2fa07611..00000000000
--- a/docs/content/en/commands/hugo_gen_autocomplete.md
+++ /dev/null
@@ -1,58 +0,0 @@
----
-title: "hugo gen autocomplete"
-slug: hugo_gen_autocomplete
-url: /commands/hugo_gen_autocomplete/
----
-## hugo gen autocomplete
-
-Generate shell autocompletion script for Hugo
-
-### Synopsis
-
-Generates a shell autocompletion script for Hugo.
-
-The script is written to the console (stdout).
-
-To write to file, add the `--completionfile=/path/to/file` flag.
-
-Add `--type={bash, zsh, fish or powershell}` flag to set alternative
-shell type.
-
-Logout and in again to reload the completion scripts,
-or just source them in directly:
-
-	$ . /etc/bash_completion or /path/to/file
-
-```
-hugo gen autocomplete [flags]
-```
-
-### Options
-
-```
-  -f, --completionfile string   autocompletion file, defaults to stdout
-  -h, --help                    help for autocomplete
-  -t, --type string             autocompletion type (bash, zsh, fish, or powershell) (default "bash")
-```
-
-### Options inherited from parent commands
-
-```
-      --config string              config file (default is path/config.yaml|json|toml)
-      --configDir string           config dir (default "config")
-      --debug                      debug output
-  -e, --environment string         build environment
-      --ignoreVendorPaths string   ignores any _vendor for module paths matching the given Glob pattern
-      --log                        enable Logging
-      --logFile string             log File path (if set, logging enabled automatically)
-      --quiet                      build in quiet mode
-  -s, --source string              filesystem path to read files relative from
-      --themesDir string           filesystem path to themes directory
-  -v, --verbose                    verbose output
-      --verboseLog                 verbose logging
-```
-
-### SEE ALSO
-
-* [hugo gen](/commands/hugo_gen/)	 - A collection of several useful generators.
-
diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml
index fa9605949fe..bb11afc7233 100644
--- a/snap/snapcraft.yaml
+++ b/snap/snapcraft.yaml
@@ -65,7 +65,7 @@ parts:
       ldd hugo || :
 
       echo " * Building shell completion..."
-      ./hugo gen autocomplete --completionfile=hugo-completion
+      ./hugo completion bash > hugo-completion
 
       echo " * Installing to ${SNAPCRAFT_PART_INSTALL}..."
       install -d $SNAPCRAFT_PART_INSTALL/bin


Test patch:
diff --git a/commands/commands_test.go b/commands/commands_test.go
index 9966cd93787..beb81752773 100644
--- a/commands/commands_test.go
+++ b/commands/commands_test.go
@@ -274,11 +274,14 @@ func TestCommandsExecute(t *testing.T) {
 		// no args = hugo build
 		{nil, []string{sourceFlag}, ""},
 		{nil, []string{sourceFlag, "--renderToMemory"}, ""},
+		{[]string{"completion", "bash"}, nil, ""},
+		{[]string{"completion", "fish"}, nil, ""},
+		{[]string{"completion", "powershell"}, nil, ""},
+		{[]string{"completion", "zsh"}, nil, ""},
 		{[]string{"config"}, []string{sourceFlag}, ""},
 		{[]string{"convert", "toTOML"}, []string{sourceFlag, "-o=" + filepath.Join(dirOut, "toml")}, ""},
 		{[]string{"convert", "toYAML"}, []string{sourceFlag, "-o=" + filepath.Join(dirOut, "yaml")}, ""},
 		{[]string{"convert", "toJSON"}, []string{sourceFlag, "-o=" + filepath.Join(dirOut, "json")}, ""},
-		{[]string{"gen", "autocomplete"}, []string{"--completionfile=" + filepath.Join(dirOut, "autocomplete.txt")}, ""},
 		{[]string{"gen", "chromastyles"}, []string{"--style=manni"}, ""},
 		{[]string{"gen", "doc"}, []string{"--dir=" + filepath.Join(dirOut, "doc")}, ""},
 		{[]string{"gen", "man"}, []string{"--dir=" + filepath.Join(dirOut, "man")}, ""},