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 := config.New()
cfg.Set("renderToDisk", (c.s == nil && !c.r.renderToMemory) || (c.s != nil && c.s.renderToDisk)) 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) 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{ cfg.Set("internal", maps.Params{
"running": running, "running": running,

View file

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

View file

@ -23,10 +23,12 @@ import (
func TestHugoInfo(t *testing.T) { func TestHugoInfo(t *testing.T) {
c := qt.New(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(hugoInfo.Version(), qt.Equals, CurrentVersion.Version())
c.Assert(fmt.Sprintf("%T", VersionString("")), qt.Equals, fmt.Sprintf("%T", hugoInfo.Version())) c.Assert(fmt.Sprintf("%T", VersionString("")), qt.Equals, fmt.Sprintf("%T", hugoInfo.Version()))
c.Assert(hugoInfo.WorkingDir(), qt.Equals, "/mywork")
bi := getBuildInfo() bi := getBuildInfo()
if bi != nil { if bi != nil {
@ -39,6 +41,19 @@ func TestHugoInfo(t *testing.T) {
c.Assert(hugoInfo.IsProduction(), qt.Equals, true) c.Assert(hugoInfo.IsProduction(), qt.Equals, true)
c.Assert(hugoInfo.IsExtended(), qt.Equals, IsExtended) c.Assert(hugoInfo.IsExtended(), qt.Equals, IsExtended)
devHugoInfo := NewInfo("development", nil) devHugoInfo := NewInfo(testConfig{environment: "development"}, nil)
c.Assert(devHugoInfo.IsProduction(), qt.Equals, false) 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 return c.m.Base.CommonDirs
} }
func (c ConfigLanguage) WorkingDir() string {
return c.m.Base.WorkingDir
}
func (c ConfigLanguage) Quiet() bool { func (c ConfigLanguage) Quiet() bool {
return c.m.Base.Internal.Quiet return c.m.Base.Internal.Quiet
} }

View file

@ -64,6 +64,7 @@ type AllProvider interface {
Timeout() time.Duration Timeout() time.Duration
StaticDirs() []string StaticDirs() []string
IgnoredErrors() map[string]bool IgnoredErrors() map[string]bool
WorkingDir() string
} }
// Provider provides the configuration settings for Hugo. // 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) { func TestConfigMergeLanguageDeepEmptyLefSide(t *testing.T) {
t.Parallel() t.Parallel()

View file

@ -261,7 +261,7 @@ func newHugoSitesNew(cfg deps.DepsCfg, d *deps.Deps, sites []*Site) (*HugoSites,
dependencies = append(dependencies, depFromMod(m)) 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 var prototype *deps.Deps
for i, s := range sites { for i, s := range sites {

View file

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

View file

@ -25,8 +25,8 @@ import (
func TestPageMatcher(t *testing.T) { func TestPageMatcher(t *testing.T) {
c := qt.New(t) c := qt.New(t)
developmentTestSite := testSite{h: hugo.NewInfo("development", nil)} developmentTestSite := testSite{h: hugo.NewInfo(testConfig{environment: "development"}, nil)}
productionTestSite := testSite{h: hugo.NewInfo("production", nil)} productionTestSite := testSite{h: hugo.NewInfo(testConfig{environment: "production"}, nil)}
p1, p2, p3 := p1, p2, p3 :=
&testPage{path: "/p1", kind: "section", lang: "en", site: developmentTestSite}, &testPage{path: "/p1", kind: "section", lang: "en", site: developmentTestSite},
@ -156,3 +156,16 @@ func TestDecodeCascadeConfig(t *testing.T) {
c.Assert(got, qt.IsNotNil) 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. // NewDummyHugoSite creates a new minimal test site.
func NewDummyHugoSite(cfg config.Provider) Site { func NewDummyHugoSite(conf config.AllProvider) Site {
return testSite{ return testSite{
h: hugo.NewInfo(hugo.EnvironmentProduction, nil), h: hugo.NewInfo(conf, nil),
l: &langs.Language{ l: &langs.Language{
Lang: "en", Lang: "en",
}, },

View file

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