Repository: gohugoio/hugo (language: go)

Issue:
New CLI command: hugo build
Does what `hugo` does now, just to clarify intent of the command. This is purely cosmetic, but keeps things consistent.


Discussion / hints:

Fix patch:
diff --git a/commands/commandeer.go b/commands/commandeer.go
index e8cde2114f3..841e8d81cba 100644
--- a/commands/commandeer.go
+++ b/commands/commandeer.go
@@ -499,16 +499,26 @@ func (r *rootCommand) IsTestRun() bool {
 }
 
 func (r *rootCommand) Init(cd *simplecobra.Commandeer) error {
+	return r.initRootCommand("", cd)
+}
+
+func (r *rootCommand) initRootCommand(subCommandName string, cd *simplecobra.Commandeer) error {
 	cmd := cd.CobraCommand
-	cmd.Use = "hugo [flags]"
-	cmd.Short = "hugo builds your site"
-	cmd.Long = `hugo is the main command, used to build your Hugo site.
+	commandName := "hugo"
+	if subCommandName != "" {
+		commandName = subCommandName
+	}
+	cmd.Use = fmt.Sprintf("%s [flags]", commandName)
+	cmd.Short = fmt.Sprintf("%s builds your site", commandName)
+	cmd.Long = `COMMAND_NAME is the main command, used to build your Hugo site.
 
 Hugo is a Fast and Flexible Static Site Generator
 built with love by spf13 and friends in Go.
 
 Complete documentation is available at https://gohugo.io/.`
 
+	cmd.Long = strings.ReplaceAll(cmd.Long, "COMMAND_NAME", commandName)
+
 	// Configure persistent flags
 	cmd.PersistentFlags().StringVarP(&r.source, "source", "s", "", "filesystem path to read files relative from")
 	_ = cmd.MarkFlagDirname("source")
diff --git a/commands/commands.go b/commands/commands.go
index e21d743ab90..10ab106e277 100644
--- a/commands/commands.go
+++ b/commands/commands.go
@@ -14,6 +14,8 @@
 package commands
 
 import (
+	"context"
+
 	"github.com/bep/simplecobra"
 )
 
@@ -21,6 +23,7 @@ import (
 func newExec() (*simplecobra.Exec, error) {
 	rootCmd := &rootCommand{
 		commands: []simplecobra.Commander{
+			newHugoBuildCmd(),
 			newVersionCmd(),
 			newEnvCommand(),
 			newServerCommand(),
@@ -38,3 +41,33 @@ func newExec() (*simplecobra.Exec, error) {
 
 	return simplecobra.New(rootCmd)
 }
+
+func newHugoBuildCmd() simplecobra.Commander {
+	return &hugoBuildCommand{}
+}
+
+// hugoBuildCommand just delegates to the rootCommand.
+type hugoBuildCommand struct {
+	rootCmd *rootCommand
+}
+
+func (c *hugoBuildCommand) Commands() []simplecobra.Commander {
+	return nil
+}
+
+func (c *hugoBuildCommand) Name() string {
+	return "build"
+}
+
+func (c *hugoBuildCommand) Init(cd *simplecobra.Commandeer) error {
+	c.rootCmd = cd.Root.Command.(*rootCommand)
+	return c.rootCmd.initRootCommand("build", cd)
+}
+
+func (c *hugoBuildCommand) PreRun(cd, runner *simplecobra.Commandeer) error {
+	return c.rootCmd.PreRun(cd, runner)
+}
+
+func (c *hugoBuildCommand) Run(ctx context.Context, cd *simplecobra.Commandeer, args []string) error {
+	return c.rootCmd.Run(ctx, cd, args)
+}
diff --git a/docs/content/en/commands/hugo.md b/docs/content/en/commands/hugo.md
index cfbe66053fd..badd6d7eacf 100644
--- a/docs/content/en/commands/hugo.md
+++ b/docs/content/en/commands/hugo.md
@@ -70,6 +70,7 @@ hugo [flags]
 
 ### SEE ALSO
 
+* [hugo build](/commands/hugo_build/)	 - build builds your site
 * [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_build.md b/docs/content/en/commands/hugo_build.md
new file mode 100644
index 00000000000..72686cb9be2
--- /dev/null
+++ b/docs/content/en/commands/hugo_build.md
@@ -0,0 +1,74 @@
+---
+title: "hugo build"
+slug: hugo_build
+url: /commands/hugo_build/
+---
+## hugo build
+
+build builds your site
+
+### Synopsis
+
+build is the main command, used to build your Hugo site.
+
+Hugo is a Fast and Flexible Static Site Generator
+built with love by spf13 and friends in Go.
+
+Complete documentation is available at https://gohugo.io/.
+
+```
+hugo build [flags]
+```
+
+### Options
+
+```
+  -b, --baseURL string             hostname (and path) to the root, e.g. https://spf13.com/
+  -D, --buildDrafts                include content marked as draft
+  -E, --buildExpired               include expired content
+  -F, --buildFuture                include content with publishdate in the future
+      --cacheDir string            filesystem path to cache directory
+      --cleanDestinationDir        remove files from destination not found in static directories
+      --clock string               set the clock used by Hugo, e.g. --clock 2021-11-06T22:30:00.00+09:00
+      --config string              config file (default is hugo.yaml|json|toml)
+      --configDir string           config dir (default "config")
+  -c, --contentDir string          filesystem path to content directory
+      --debug                      debug output
+  -d, --destination string         filesystem path to write files to
+      --disableKinds strings       disable different kind of pages (home, RSS etc.)
+      --enableGitInfo              add Git revision, date, author, and CODEOWNERS info to the pages
+  -e, --environment string         build environment
+      --forceSyncStatic            copy all files when static is changed.
+      --gc                         enable to run some cleanup tasks (remove unused cache files) after the build
+  -h, --help                       help for build
+      --ignoreCache                ignores the cache directory
+      --ignoreVendorPaths string   ignores any _vendor for module paths matching the given Glob pattern
+  -l, --layoutDir string           filesystem path to layout directory
+      --logLevel string            log level (debug|info|warn|error)
+      --minify                     minify any supported output format (HTML, XML etc.)
+      --noBuildLock                don't create .hugo_build.lock file
+      --noChmod                    don't sync permission mode of files
+      --noTimes                    don't sync modification time of files
+      --panicOnWarning             panic on first WARNING log
+      --poll string                set this to a poll interval, e.g --poll 700ms, to use a poll based approach to watch for file system changes
+      --printI18nWarnings          print missing translations
+      --printMemoryUsage           print memory usage to screen at intervals
+      --printPathWarnings          print warnings on duplicate target paths etc.
+      --printUnusedTemplates       print warnings on unused templates.
+      --quiet                      build in quiet mode
+      --renderSegments strings     named segments to render (configured in the segments config)
+  -M, --renderToMemory             render to memory (mostly useful when running the server)
+  -s, --source string              filesystem path to read files relative from
+      --templateMetrics            display metrics about template executions
+      --templateMetricsHints       calculate some improvement hints when combined with --templateMetrics
+  -t, --theme strings              themes to use (located in /themes/THEMENAME/)
+      --themesDir string           filesystem path to themes directory
+      --trace file                 write trace to file (not useful in general)
+  -v, --verbose                    verbose output
+  -w, --watch                      watch filesystem for changes and recreate as needed
+```
+
+### SEE ALSO
+
+* [hugo](/commands/hugo/)	 - hugo builds your site
+


Test patch:
diff --git a/testscripts/commands/gen.txt b/testscripts/commands/gen.txt
index 22a936b415f..16db9fe4a9d 100644
--- a/testscripts/commands/gen.txt
+++ b/testscripts/commands/gen.txt
@@ -1,6 +1,6 @@
 # Test the gen commands.
 # Note that adding new commands will require updating the NUM_COMMANDS value.
-env NUM_COMMANDS=43
+env NUM_COMMANDS=44
 
 hugo gen -h
 stdout 'A collection of several useful generators\.'
diff --git a/testscripts/commands/hugo_build.txt b/testscripts/commands/hugo_build.txt
new file mode 100644
index 00000000000..0bcbcba7ad3
--- /dev/null
+++ b/testscripts/commands/hugo_build.txt
@@ -0,0 +1,20 @@
+# Test the hugo build command (alias for hugo)
+
+hugo build
+stdout 'Pages.*|1'
+stdout 'Total in'
+checkfile public/index.html
+checkfile public/p1/index.html
+grep 'IsServer: false;IsProduction: true'  public/index.html
+
+-- hugo.toml --
+baseURL = "http://example.org/"
+disableKinds = ["RSS", "sitemap", "robotsTXT", "404", "taxonomy", "term"]
+-- layouts/index.html --
+Home|IsServer: {{ hugo.IsServer }};IsProduction: {{ hugo.IsProduction }}|
+-- layouts/_default/single.html --
+Title: {{ .Title }}
+-- content/p1.md --
+---
+title: "P1"
+---