Add hugo.WorkingDir

Fixes #10969
This commit is contained in:
Bjørn Erik Pedersen 2023-05-20 15:04:22 +02:00
parent 4f085e80da
commit 7c7baa6183
11 changed files with 86 additions and 14 deletions

View file

@ -990,7 +990,9 @@ func (c *hugoBuilder) loadConfig(cd *simplecobra.Commandeer, running bool) error
cfg := config.New()
cfg.Set("renderToDisk", (c.s == nil && !c.r.renderToMemory) || (c.s != nil && c.s.renderToDisk))
watch := c.r.buildWatch || (c.s != nil && c.s.serverWatch)
cfg.Set("environment", c.r.environment)
if c.r.environment != "" {
cfg.Set("environment", c.r.environment)
}
cfg.Set("internal", maps.Params{
"running": running,

View file

@ -60,6 +60,7 @@ type HugoInfo struct {
// version of go that the Hugo binary was built with
GoVersion string
conf ConfigProvider
deps []*Dependency
}
@ -81,15 +82,26 @@ func (i HugoInfo) IsExtended() bool {
return IsExtended
}
// WorkingDir returns the project working directory.
func (i HugoInfo) WorkingDir() string {
return i.conf.WorkingDir()
}
// Deps gets a list of dependencies for this Hugo build.
func (i HugoInfo) Deps() []*Dependency {
return i.deps
}
// ConfigProvider represents the config options that are relevant for HugoInfo.
type ConfigProvider interface {
Environment() string
WorkingDir() string
}
// NewInfo creates a new Hugo Info object.
func NewInfo(environment string, deps []*Dependency) HugoInfo {
if environment == "" {
environment = EnvironmentProduction
func NewInfo(conf ConfigProvider, deps []*Dependency) HugoInfo {
if conf.Environment() == "" {
panic("environment not set")
}
var (
commitHash string
@ -107,7 +119,8 @@ func NewInfo(environment string, deps []*Dependency) HugoInfo {
return HugoInfo{
CommitHash: commitHash,
BuildDate: buildDate,
Environment: environment,
Environment: conf.Environment(),
conf: conf,
deps: deps,
GoVersion: goVersion,
}

View file

@ -23,10 +23,12 @@ import (
func TestHugoInfo(t *testing.T) {
c := qt.New(t)
hugoInfo := NewInfo("", nil)
conf := testConfig{environment: "production", workingDir: "/mywork"}
hugoInfo := NewInfo(conf, nil)
c.Assert(hugoInfo.Version(), qt.Equals, CurrentVersion.Version())
c.Assert(fmt.Sprintf("%T", VersionString("")), qt.Equals, fmt.Sprintf("%T", hugoInfo.Version()))
c.Assert(hugoInfo.WorkingDir(), qt.Equals, "/mywork")
bi := getBuildInfo()
if bi != nil {
@ -39,6 +41,19 @@ func TestHugoInfo(t *testing.T) {
c.Assert(hugoInfo.IsProduction(), qt.Equals, true)
c.Assert(hugoInfo.IsExtended(), qt.Equals, IsExtended)
devHugoInfo := NewInfo("development", nil)
devHugoInfo := NewInfo(testConfig{environment: "development"}, nil)
c.Assert(devHugoInfo.IsProduction(), qt.Equals, false)
}
type testConfig struct {
environment string
workingDir string
}
func (c testConfig) Environment() string {
return c.environment
}
func (c testConfig) WorkingDir() string {
return c.workingDir
}

View file

@ -101,6 +101,10 @@ func (c ConfigLanguage) DirsBase() config.CommonDirs {
return c.m.Base.CommonDirs
}
func (c ConfigLanguage) WorkingDir() string {
return c.m.Base.WorkingDir
}
func (c ConfigLanguage) Quiet() bool {
return c.m.Base.Internal.Quiet
}

View file

@ -64,6 +64,7 @@ type AllProvider interface {
Timeout() time.Duration
StaticDirs() []string
IgnoredErrors() map[string]bool
WorkingDir() string
}
// Provider provides the configuration settings for Hugo.

View file

@ -898,6 +898,29 @@ mainSections: []
}
func TestConfigHugoWorkingDir(t *testing.T) {
t.Parallel()
files := `
-- hugo.toml --
-- layouts/index.html --
WorkingDir: {{ hugo.WorkingDir }}|
`
b := NewIntegrationTestBuilder(
IntegrationTestConfig{
T: t,
TxtarString: files,
WorkingDir: "myworkingdir",
},
).Build()
b.AssertFileContent("public/index.html", `
WorkingDir: myworkingdir|
`)
}
func TestConfigMergeLanguageDeepEmptyLefSide(t *testing.T) {
t.Parallel()

View file

@ -261,7 +261,7 @@ func newHugoSitesNew(cfg deps.DepsCfg, d *deps.Deps, sites []*Site) (*HugoSites,
dependencies = append(dependencies, depFromMod(m))
}
h.hugoInfo = hugo.NewInfo(h.Configs.Base.Environment, dependencies)
h.hugoInfo = hugo.NewInfo(h.Configs.GetFirstLanguageConfig(), dependencies)
var prototype *deps.Deps
for i, s := range sites {

View file

@ -480,7 +480,7 @@ func prepareDeps(afs afero.Fs, cfg config.Provider) (*deps.Deps, *TranslationPro
translationProvider := NewTranslationProvider()
d.TemplateProvider = tplimpl.DefaultTemplateProvider
d.TranslationProvider = translationProvider
d.Site = page.NewDummyHugoSite(cfg)
d.Site = page.NewDummyHugoSite(d.Conf)
if err := d.Compile(nil); err != nil {
panic(err)
}

View file

@ -25,8 +25,8 @@ import (
func TestPageMatcher(t *testing.T) {
c := qt.New(t)
developmentTestSite := testSite{h: hugo.NewInfo("development", nil)}
productionTestSite := testSite{h: hugo.NewInfo("production", nil)}
developmentTestSite := testSite{h: hugo.NewInfo(testConfig{environment: "development"}, nil)}
productionTestSite := testSite{h: hugo.NewInfo(testConfig{environment: "production"}, nil)}
p1, p2, p3 :=
&testPage{path: "/p1", kind: "section", lang: "en", site: developmentTestSite},
@ -156,3 +156,16 @@ func TestDecodeCascadeConfig(t *testing.T) {
c.Assert(got, qt.IsNotNil)
}
type testConfig struct {
environment string
workingDir string
}
func (c testConfig) Environment() string {
return c.environment
}
func (c testConfig) WorkingDir() string {
return c.workingDir
}

View file

@ -444,9 +444,9 @@ func (s testSite) Param(key any) (any, error) {
}
// NewDummyHugoSite creates a new minimal test site.
func NewDummyHugoSite(cfg config.Provider) Site {
func NewDummyHugoSite(conf config.AllProvider) Site {
return testSite{
h: hugo.NewInfo(hugo.EnvironmentProduction, nil),
h: hugo.NewInfo(conf, nil),
l: &langs.Language{
Lang: "en",
},

View file

@ -29,7 +29,8 @@ func init() {
if err := d.Init(); err != nil {
panic(err)
}
d.Site = page.NewDummyHugoSite(newTestConfig())
conf := testconfig.GetTestConfig(nil, newTestConfig())
d.Site = page.NewDummyHugoSite(conf)
var namespaces internal.TemplateFuncsNamespaces