commands: Reinstate some of the removed build flags (e.g. --theme) to new and mod

Fixes #11018
This commit is contained in:
Bjørn Erik Pedersen 2023-05-28 10:44:40 +02:00
parent e96cdfe966
commit 43f1282e73
13 changed files with 84 additions and 33 deletions

View file

@ -504,7 +504,7 @@ Complete documentation is available at https://gohugo.io/.`
_ = cmd.PersistentFlags().SetAnnotation("logFile", cobra.BashCompFilenameExt, []string{}) _ = cmd.PersistentFlags().SetAnnotation("logFile", cobra.BashCompFilenameExt, []string{})
// Configure local flags // Configure local flags
applyLocalBuildFlags(cmd, r) applyLocalFlagsBuild(cmd, r)
// Set bash-completion. // Set bash-completion.
// Each flag must first be defined before using the SetAnnotation() call. // Each flag must first be defined before using the SetAnnotation() call.
@ -513,17 +513,26 @@ Complete documentation is available at https://gohugo.io/.`
return nil return nil
} }
func applyLocalBuildFlags(cmd *cobra.Command, r *rootCommand) { // A sub set of the complete build flags. These flags are used by new and mod.
func applyLocalFlagsBuildConfig(cmd *cobra.Command, r *rootCommand) {
cmd.Flags().StringSliceP("theme", "t", []string{}, "themes to use (located in /themes/THEMENAME/)")
cmd.Flags().StringVarP(&r.baseURL, "baseURL", "b", "", "hostname (and path) to the root, e.g. https://spf13.com/")
cmd.Flags().StringP("cacheDir", "", "", "filesystem path to cache directory. Defaults: $TMPDIR/hugo_cache/")
_ = cmd.Flags().SetAnnotation("cacheDir", cobra.BashCompSubdirsInDir, []string{})
cmd.Flags().StringP("contentDir", "c", "", "filesystem path to content directory")
cmd.Flags().StringP("layoutDir", "l", "", "filesystem path to layout directory")
_ = cmd.Flags().SetAnnotation("theme", cobra.BashCompSubdirsInDir, []string{"themes"})
}
// Flags needed to do a build (used by hugo and hugo server commands)
func applyLocalFlagsBuild(cmd *cobra.Command, r *rootCommand) {
applyLocalFlagsBuildConfig(cmd, r)
cmd.Flags().Bool("cleanDestinationDir", false, "remove files from destination not found in static directories") cmd.Flags().Bool("cleanDestinationDir", false, "remove files from destination not found in static directories")
cmd.Flags().BoolP("buildDrafts", "D", false, "include content marked as draft") cmd.Flags().BoolP("buildDrafts", "D", false, "include content marked as draft")
cmd.Flags().BoolP("buildFuture", "F", false, "include content with publishdate in the future") cmd.Flags().BoolP("buildFuture", "F", false, "include content with publishdate in the future")
cmd.Flags().BoolP("buildExpired", "E", false, "include expired content") cmd.Flags().BoolP("buildExpired", "E", false, "include expired content")
cmd.Flags().StringP("contentDir", "c", "", "filesystem path to content directory")
cmd.Flags().StringP("layoutDir", "l", "", "filesystem path to layout directory")
cmd.Flags().StringP("cacheDir", "", "", "filesystem path to cache directory. Defaults: $TMPDIR/hugo_cache/")
cmd.Flags().BoolP("ignoreCache", "", false, "ignores the cache directory") cmd.Flags().BoolP("ignoreCache", "", false, "ignores the cache directory")
cmd.Flags().StringSliceP("theme", "t", []string{}, "themes to use (located in /themes/THEMENAME/)")
cmd.Flags().StringVarP(&r.baseURL, "baseURL", "b", "", "hostname (and path) to the root, e.g. https://spf13.com/")
cmd.Flags().Bool("enableGitInfo", false, "add Git revision, date, author, and CODEOWNERS info to the pages") cmd.Flags().Bool("enableGitInfo", false, "add Git revision, date, author, and CODEOWNERS info to the pages")
cmd.Flags().BoolVar(&r.gc, "gc", false, "enable to run some cleanup tasks (remove unused cache files) after the build") cmd.Flags().BoolVar(&r.gc, "gc", false, "enable to run some cleanup tasks (remove unused cache files) after the build")
cmd.Flags().StringVar(&r.poll, "poll", "", "set this to a poll interval, e.g --poll 700ms, to use a poll based approach to watch for file system changes") cmd.Flags().StringVar(&r.poll, "poll", "", "set this to a poll interval, e.g --poll 700ms, to use a poll based approach to watch for file system changes")
@ -549,12 +558,8 @@ func applyLocalBuildFlags(cmd *cobra.Command, r *rootCommand) {
cmd.Flags().MarkHidden("profile-mutex") cmd.Flags().MarkHidden("profile-mutex")
cmd.Flags().StringSlice("disableKinds", []string{}, "disable different kind of pages (home, RSS etc.)") cmd.Flags().StringSlice("disableKinds", []string{}, "disable different kind of pages (home, RSS etc.)")
cmd.Flags().Bool("minify", false, "minify any supported output format (HTML, XML etc.)") cmd.Flags().Bool("minify", false, "minify any supported output format (HTML, XML etc.)")
_ = cmd.Flags().SetAnnotation("cacheDir", cobra.BashCompSubdirsInDir, []string{})
_ = cmd.Flags().SetAnnotation("destination", cobra.BashCompSubdirsInDir, []string{}) _ = cmd.Flags().SetAnnotation("destination", cobra.BashCompSubdirsInDir, []string{})
_ = cmd.Flags().SetAnnotation("theme", cobra.BashCompSubdirsInDir, []string{"themes"})
} }
@ -569,7 +574,7 @@ type simpleCommand struct {
short string short string
long string long string
run func(ctx context.Context, cd *simplecobra.Commandeer, rootCmd *rootCommand, args []string) error run func(ctx context.Context, cd *simplecobra.Commandeer, rootCmd *rootCommand, args []string) error
withc func(cmd *cobra.Command) withc func(cmd *cobra.Command, r *rootCommand)
initc func(cd *simplecobra.Commandeer) error initc func(cd *simplecobra.Commandeer) error
commands []simplecobra.Commander commands []simplecobra.Commander
@ -593,6 +598,7 @@ func (c *simpleCommand) Run(ctx context.Context, cd *simplecobra.Commandeer, arg
} }
func (c *simpleCommand) Init(cd *simplecobra.Commandeer) error { func (c *simpleCommand) Init(cd *simplecobra.Commandeer) error {
c.rootCmd = cd.Root.Command.(*rootCommand)
cmd := cd.CobraCommand cmd := cd.CobraCommand
cmd.Short = c.short cmd.Short = c.short
cmd.Long = c.long cmd.Long = c.long
@ -600,13 +606,12 @@ func (c *simpleCommand) Init(cd *simplecobra.Commandeer) error {
cmd.Use = c.use cmd.Use = c.use
} }
if c.withc != nil { if c.withc != nil {
c.withc(cmd) c.withc(cmd, c.rootCmd)
} }
return nil return nil
} }
func (c *simpleCommand) PreRun(cd, runner *simplecobra.Commandeer) error { func (c *simpleCommand) PreRun(cd, runner *simplecobra.Commandeer) error {
c.rootCmd = cd.Root.Command.(*rootCommand)
if c.initc != nil { if c.initc != nil {
return c.initc(cd) return c.initc(cd)
} }

View file

@ -45,7 +45,7 @@ to use JSON for the front matter.`,
run: func(ctx context.Context, cd *simplecobra.Commandeer, r *rootCommand, args []string) error { run: func(ctx context.Context, cd *simplecobra.Commandeer, r *rootCommand, args []string) error {
return c.convertContents(metadecoders.JSON) return c.convertContents(metadecoders.JSON)
}, },
withc: func(cmd *cobra.Command) { withc: func(cmd *cobra.Command, r *rootCommand) {
}, },
}, },
&simpleCommand{ &simpleCommand{
@ -56,7 +56,7 @@ to use TOML for the front matter.`,
run: func(ctx context.Context, cd *simplecobra.Commandeer, r *rootCommand, args []string) error { run: func(ctx context.Context, cd *simplecobra.Commandeer, r *rootCommand, args []string) error {
return c.convertContents(metadecoders.TOML) return c.convertContents(metadecoders.TOML)
}, },
withc: func(cmd *cobra.Command) { withc: func(cmd *cobra.Command, r *rootCommand) {
}, },
}, },
&simpleCommand{ &simpleCommand{
@ -67,7 +67,7 @@ to use YAML for the front matter.`,
run: func(ctx context.Context, cd *simplecobra.Commandeer, r *rootCommand, args []string) error { run: func(ctx context.Context, cd *simplecobra.Commandeer, r *rootCommand, args []string) error {
return c.convertContents(metadecoders.YAML) return c.convertContents(metadecoders.YAML)
}, },
withc: func(cmd *cobra.Command) { withc: func(cmd *cobra.Command, r *rootCommand) {
}, },
}, },
}, },

View file

@ -58,7 +58,7 @@ documentation.
} }
return deployer.Deploy(ctx) return deployer.Deploy(ctx)
}, },
withc: func(cmd *cobra.Command) { withc: func(cmd *cobra.Command, r *rootCommand) {
cmd.Flags().String("target", "", "target deployment from deployments section in config file; defaults to the first one") cmd.Flags().String("target", "", "target deployment from deployments section in config file; defaults to the first one")
cmd.Flags().Bool("confirm", false, "ask for confirmation before making changes to the target") cmd.Flags().Bool("confirm", false, "ask for confirmation before making changes to the target")
cmd.Flags().Bool("dryRun", false, "dry run") cmd.Flags().Bool("dryRun", false, "dry run")

View file

@ -41,7 +41,7 @@ func newDeployCommand() simplecobra.Commander {
run: func(ctx context.Context, cd *simplecobra.Commandeer, r *rootCommand, args []string) error { run: func(ctx context.Context, cd *simplecobra.Commandeer, r *rootCommand, args []string) error {
return nil return nil
}, },
withc: func(cmd *cobra.Command) { withc: func(cmd *cobra.Command, r *rootCommand) {
cmd.Hidden = true cmd.Hidden = true
}, },
} }

View file

@ -70,7 +70,7 @@ See https://xyproto.github.io/splash/docs/all.html for a preview of the availabl
formatter.WriteCSS(os.Stdout, style) formatter.WriteCSS(os.Stdout, style)
return nil return nil
}, },
withc: func(cmd *cobra.Command) { withc: func(cmd *cobra.Command, r *rootCommand) {
cmd.PersistentFlags().StringVar(&style, "style", "friendly", "highlighter style (see https://xyproto.github.io/splash/docs/)") cmd.PersistentFlags().StringVar(&style, "style", "friendly", "highlighter style (see https://xyproto.github.io/splash/docs/)")
cmd.PersistentFlags().StringVar(&highlightStyle, "highlightStyle", "bg:#ffffcc", "style used for highlighting lines (see https://github.com/alecthomas/chroma)") cmd.PersistentFlags().StringVar(&highlightStyle, "highlightStyle", "bg:#ffffcc", "style used for highlighting lines (see https://github.com/alecthomas/chroma)")
cmd.PersistentFlags().StringVar(&linesStyle, "linesStyle", "", "style used for line numbers (see https://github.com/alecthomas/chroma)") cmd.PersistentFlags().StringVar(&linesStyle, "linesStyle", "", "style used for line numbers (see https://github.com/alecthomas/chroma)")
@ -110,7 +110,7 @@ See https://xyproto.github.io/splash/docs/all.html for a preview of the availabl
return nil return nil
}, },
withc: func(cmd *cobra.Command) { withc: func(cmd *cobra.Command, r *rootCommand) {
cmd.PersistentFlags().StringVar(&genmandir, "dir", "man/", "the directory to write the man pages.") cmd.PersistentFlags().StringVar(&genmandir, "dir", "man/", "the directory to write the man pages.")
// For bash-completion // For bash-completion
cmd.PersistentFlags().SetAnnotation("dir", cobra.BashCompSubdirsInDir, []string{}) cmd.PersistentFlags().SetAnnotation("dir", cobra.BashCompSubdirsInDir, []string{})
@ -167,7 +167,7 @@ url: %s
return nil return nil
}, },
withc: func(cmd *cobra.Command) { withc: func(cmd *cobra.Command, r *rootCommand) {
cmd.PersistentFlags().StringVar(&gendocdir, "dir", "/tmp/hugodoc/", "the directory to write the doc.") cmd.PersistentFlags().StringVar(&gendocdir, "dir", "/tmp/hugodoc/", "the directory to write the doc.")
// For bash-completion // For bash-completion
cmd.PersistentFlags().SetAnnotation("dir", cobra.BashCompSubdirsInDir, []string{}) cmd.PersistentFlags().SetAnnotation("dir", cobra.BashCompSubdirsInDir, []string{})
@ -204,7 +204,7 @@ url: %s
r.Println("Done!") r.Println("Done!")
return nil return nil
}, },
withc: func(cmd *cobra.Command) { withc: func(cmd *cobra.Command, r *rootCommand) {
cmd.Hidden = true cmd.Hidden = true
cmd.PersistentFlags().StringVarP(&docsHelperTarget, "dir", "", "docs/data", "data dir") cmd.PersistentFlags().StringVarP(&docsHelperTarget, "dir", "", "docs/data", "data dir")
}, },

View file

@ -59,7 +59,7 @@ Import from Jekyll requires two paths, e.g. ` + "`hugo import jekyll jekyll_root
} }
return c.importFromJekyll(args) return c.importFromJekyll(args)
}, },
withc: func(cmd *cobra.Command) { withc: func(cmd *cobra.Command, r *rootCommand) {
cmd.Flags().BoolVar(&c.force, "force", false, "allow import into non-empty target directory") cmd.Flags().BoolVar(&c.force, "force", false, "allow import into non-empty target directory")
}, },
}, },

View file

@ -61,6 +61,9 @@ This command is marked as 'Experimental'. We think it's a great idea, so it's no
removed from Hugo, but we need to test this out in "real life" to get a feel of it, removed from Hugo, but we need to test this out in "real life" to get a feel of it,
so this may/will change in future versions of Hugo. so this may/will change in future versions of Hugo.
`, `,
withc: func(cmd *cobra.Command, r *rootCommand) {
applyLocalFlagsBuildConfig(cmd, r)
},
run: func(ctx context.Context, cd *simplecobra.Commandeer, r *rootCommand, args []string) error { run: func(ctx context.Context, cd *simplecobra.Commandeer, r *rootCommand, args []string) error {
h, err := r.Hugo(flagsToCfg(cd, nil)) h, err := r.Hugo(flagsToCfg(cd, nil))
if err != nil { if err != nil {
@ -85,6 +88,9 @@ so this may/will change in future versions of Hugo.
Note that Hugo Modules supports multi-module projects, so you can initialize a Hugo Module Note that Hugo Modules supports multi-module projects, so you can initialize a Hugo Module
inside a subfolder on GitHub, as one example. inside a subfolder on GitHub, as one example.
`, `,
withc: func(cmd *cobra.Command, r *rootCommand) {
applyLocalFlagsBuildConfig(cmd, r)
},
run: func(ctx context.Context, cd *simplecobra.Commandeer, r *rootCommand, args []string) error { run: func(ctx context.Context, cd *simplecobra.Commandeer, r *rootCommand, args []string) error {
h, err := r.Hugo(flagsToCfg(cd, nil)) h, err := r.Hugo(flagsToCfg(cd, nil))
if err != nil { if err != nil {
@ -101,7 +107,8 @@ so this may/will change in future versions of Hugo.
name: "verify", name: "verify",
short: "Verify dependencies.", short: "Verify dependencies.",
long: `Verify checks that the dependencies of the current module, which are stored in a local downloaded source cache, have not been modified since being downloaded.`, long: `Verify checks that the dependencies of the current module, which are stored in a local downloaded source cache, have not been modified since being downloaded.`,
withc: func(cmd *cobra.Command) { withc: func(cmd *cobra.Command, r *rootCommand) {
applyLocalFlagsBuildConfig(cmd, r)
cmd.Flags().BoolVarP(&clean, "clean", "", false, "delete module cache for dependencies that fail verification") cmd.Flags().BoolVarP(&clean, "clean", "", false, "delete module cache for dependencies that fail verification")
}, },
run: func(ctx context.Context, cd *simplecobra.Commandeer, r *rootCommand, args []string) error { run: func(ctx context.Context, cd *simplecobra.Commandeer, r *rootCommand, args []string) error {
@ -119,7 +126,8 @@ so this may/will change in future versions of Hugo.
long: `Print a module dependency graph with information about module status (disabled, vendored). long: `Print a module dependency graph with information about module status (disabled, vendored).
Note that for vendored modules, that is the version listed and not the one from go.mod. Note that for vendored modules, that is the version listed and not the one from go.mod.
`, `,
withc: func(cmd *cobra.Command) { withc: func(cmd *cobra.Command, r *rootCommand) {
applyLocalFlagsBuildConfig(cmd, r)
cmd.Flags().BoolVarP(&clean, "clean", "", false, "delete module cache for dependencies that fail verification") cmd.Flags().BoolVarP(&clean, "clean", "", false, "delete module cache for dependencies that fail verification")
}, },
run: func(ctx context.Context, cd *simplecobra.Commandeer, r *rootCommand, args []string) error { run: func(ctx context.Context, cd *simplecobra.Commandeer, r *rootCommand, args []string) error {
@ -135,7 +143,8 @@ Note that for vendored modules, that is the version listed and not the one from
name: "clean", name: "clean",
short: "Delete the Hugo Module cache for the current project.", short: "Delete the Hugo Module cache for the current project.",
long: `Delete the Hugo Module cache for the current project.`, long: `Delete the Hugo Module cache for the current project.`,
withc: func(cmd *cobra.Command) { withc: func(cmd *cobra.Command, r *rootCommand) {
applyLocalFlagsBuildConfig(cmd, r)
cmd.Flags().StringVarP(&pattern, "pattern", "", "", `pattern matching module paths to clean (all if not set), e.g. "**hugo*"`) cmd.Flags().StringVarP(&pattern, "pattern", "", "", `pattern matching module paths to clean (all if not set), e.g. "**hugo*"`)
cmd.Flags().BoolVarP(&all, "all", "", false, "clean entire module cache") cmd.Flags().BoolVarP(&all, "all", "", false, "clean entire module cache")
}, },
@ -157,6 +166,9 @@ Note that for vendored modules, that is the version listed and not the one from
&simpleCommand{ &simpleCommand{
name: "tidy", name: "tidy",
short: "Remove unused entries in go.mod and go.sum.", short: "Remove unused entries in go.mod and go.sum.",
withc: func(cmd *cobra.Command, r *rootCommand) {
applyLocalFlagsBuildConfig(cmd, r)
},
run: func(ctx context.Context, cd *simplecobra.Commandeer, r *rootCommand, args []string) error { run: func(ctx context.Context, cd *simplecobra.Commandeer, r *rootCommand, args []string) error {
h, err := r.Hugo(flagsToCfg(cd, nil)) h, err := r.Hugo(flagsToCfg(cd, nil))
if err != nil { if err != nil {
@ -171,6 +183,9 @@ Note that for vendored modules, that is the version listed and not the one from
long: `Vendor all module dependencies into the _vendor directory. long: `Vendor all module dependencies into the _vendor directory.
If a module is vendored, that is where Hugo will look for it's dependencies. If a module is vendored, that is where Hugo will look for it's dependencies.
`, `,
withc: func(cmd *cobra.Command, r *rootCommand) {
applyLocalFlagsBuildConfig(cmd, r)
},
run: func(ctx context.Context, cd *simplecobra.Commandeer, r *rootCommand, args []string) error { run: func(ctx context.Context, cd *simplecobra.Commandeer, r *rootCommand, args []string) error {
h, err := r.Hugo(flagsToCfg(cd, nil)) h, err := r.Hugo(flagsToCfg(cd, nil))
if err != nil { if err != nil {
@ -203,7 +218,7 @@ Install the latest versions of all module dependencies:
Run "go help get" for more information. All flags available for "go get" is also relevant here. Run "go help get" for more information. All flags available for "go get" is also relevant here.
` + commonUsageMod, ` + commonUsageMod,
withc: func(cmd *cobra.Command) { withc: func(cmd *cobra.Command, r *rootCommand) {
cmd.DisableFlagParsing = true cmd.DisableFlagParsing = true
}, },
run: func(ctx context.Context, cd *simplecobra.Commandeer, r *rootCommand, args []string) error { run: func(ctx context.Context, cd *simplecobra.Commandeer, r *rootCommand, args []string) error {

View file

@ -64,11 +64,12 @@ func newNewCommand() *newCommand {
} }
return create.NewContent(h, contentType, args[0], force) return create.NewContent(h, contentType, args[0], force)
}, },
withc: func(cmd *cobra.Command) { withc: func(cmd *cobra.Command, r *rootCommand) {
cmd.Flags().StringVarP(&contentType, "kind", "k", "", "content type to create") cmd.Flags().StringVarP(&contentType, "kind", "k", "", "content type to create")
cmd.Flags().String("editor", "", "edit new content with this editor, if provided") cmd.Flags().String("editor", "", "edit new content with this editor, if provided")
cmd.Flags().BoolVarP(&force, "force", "f", false, "overwrite file if it already exists") cmd.Flags().BoolVarP(&force, "force", "f", false, "overwrite file if it already exists")
cmd.Flags().StringVar(&format, "format", "toml", "preferred file format (toml, yaml or json)") cmd.Flags().StringVar(&format, "format", "toml", "preferred file format (toml, yaml or json)")
applyLocalFlagsBuildConfig(cmd, r)
}, },
}, },
@ -147,7 +148,7 @@ Use ` + "`hugo new [contentPath]`" + ` to create new content.`,
return nil return nil
}, },
withc: func(cmd *cobra.Command) { withc: func(cmd *cobra.Command, r *rootCommand) {
cmd.Flags().BoolVarP(&force, "force", "f", false, "init inside non-empty directory") cmd.Flags().BoolVarP(&force, "force", "f", false, "init inside non-empty directory")
}, },
}, },

View file

@ -42,7 +42,7 @@ func newReleaseCommand() simplecobra.Commander {
return rel.Run() return rel.Run()
}, },
withc: func(cmd *cobra.Command) { withc: func(cmd *cobra.Command, r *rootCommand) {
cmd.Hidden = true cmd.Hidden = true
cmd.PersistentFlags().BoolVarP(&skipPush, "skip-push", "", false, "skip pushing to remote") cmd.PersistentFlags().BoolVarP(&skipPush, "skip-push", "", false, "skip pushing to remote")
cmd.PersistentFlags().BoolVarP(&try, "try", "", false, "no changes") cmd.PersistentFlags().BoolVarP(&try, "try", "", false, "no changes")

View file

@ -509,7 +509,7 @@ of a second, you will be able to save and see your changes nearly instantly.`
cmd.Flags().String("meminterval", "100ms", "interval to poll memory usage (requires --memstats), valid time units are \"ns\", \"us\" (or \"µs\"), \"ms\", \"s\", \"m\", \"h\".") cmd.Flags().String("meminterval", "100ms", "interval to poll memory usage (requires --memstats), valid time units are \"ns\", \"us\" (or \"µs\"), \"ms\", \"s\", \"m\", \"h\".")
r := cd.Root.Command.(*rootCommand) r := cd.Root.Command.(*rootCommand)
applyLocalBuildFlags(cmd, r) applyLocalFlagsBuild(cmd, r)
return nil return nil
} }

View file

@ -28,7 +28,7 @@ func newSimpleTemplateCommand() simplecobra.Commander {
return nil return nil
}, },
withc: func(cmd *cobra.Command) { withc: func(cmd *cobra.Command, r *rootCommand) {
}, },
} }

View file

@ -0,0 +1,7 @@
hugo --theme mytheme mod graph
stdout 'project mytheme'
-- hugo.toml --
title = "Hugo Module"
-- themes/mytheme/hugo.toml --
title = "My Theme"

View file

@ -25,3 +25,26 @@ stdout 'Create a new content file.'
hugo new posts/my-first-post.md hugo new posts/my-first-post.md
checkfile content/posts/my-first-post.md checkfile content/posts/my-first-post.md
cd ..
cd myexistingsite
hugo new post/foo.md -t mytheme
grep 'Dummy content' content/post/foo.md
-- myexistingsite/hugo.toml --
theme = "mytheme"
-- myexistingsite/content/p1.md --
---
title: "P1"
---
-- myexistingsite/themes/mytheme/hugo.toml --
-- myexistingsite/themes/mytheme/archetypes/post.md --
---
title: "{{ replace .Name "-" " " | title }}"
date: {{ .Date }}
draft: true
---
Dummy content.