mirror of
https://github.com/gohugoio/hugo.git
synced 2024-12-27 18:11:14 +00:00
Handle rebuilds when resources passed to transform.Unmarshal etc. changes
Fixes #12065
This commit is contained in:
parent
5ada27bf65
commit
5dbc29dc6c
4 changed files with 57 additions and 1 deletions
|
@ -77,6 +77,27 @@ func TestRebuildEditTextFileInLeafBundle(t *testing.T) {
|
|||
b.AssertRenderCountContent(1)
|
||||
}
|
||||
|
||||
func TestRebuiEditUnmarshaledYamlFileInLeafBundle(t *testing.T) {
|
||||
files := `
|
||||
-- hugo.toml --
|
||||
baseURL = "https://example.com"
|
||||
disableLiveReload = true
|
||||
disableKinds = ["taxonomy", "term", "sitemap", "robotsTXT", "404", "rss"]
|
||||
-- content/mybundle/index.md --
|
||||
-- content/mybundle/mydata.yml --
|
||||
foo: bar
|
||||
-- layouts/_default/single.html --
|
||||
MyData: {{ .Resources.Get "mydata.yml" | transform.Unmarshal }}|
|
||||
`
|
||||
b := TestRunning(t, files)
|
||||
|
||||
b.AssertFileContent("public/mybundle/index.html", "MyData: map[foo:bar]")
|
||||
|
||||
b.EditFileReplaceAll("content/mybundle/mydata.yml", "bar", "bar edited").Build()
|
||||
|
||||
b.AssertFileContent("public/mybundle/index.html", "MyData: map[foo:bar edited]")
|
||||
}
|
||||
|
||||
func TestRebuildEditTextFileInHomeBundle(t *testing.T) {
|
||||
b := TestRunning(t, rebuildFilesSimple)
|
||||
b.AssertFileContent("public/index.html", "Home Content.")
|
||||
|
|
|
@ -44,6 +44,7 @@ type ExecHelper interface {
|
|||
GetFunc(ctx context.Context, tmpl Preparer, name string) (reflect.Value, reflect.Value, bool)
|
||||
GetMethod(ctx context.Context, tmpl Preparer, receiver reflect.Value, name string) (method reflect.Value, firstArg reflect.Value)
|
||||
GetMapValue(ctx context.Context, tmpl Preparer, receiver, key reflect.Value) (reflect.Value, bool)
|
||||
OnCalled(ctx context.Context, tmpl Preparer, name string, args []reflect.Value, result reflect.Value)
|
||||
}
|
||||
|
||||
// Executer executes a given template.
|
||||
|
@ -356,7 +357,14 @@ func (s *state) evalCall(dot, fun reflect.Value, isBuiltin bool, node parse.Node
|
|||
s.at(node)
|
||||
s.errorf("error calling %s: %w", name, err)
|
||||
}
|
||||
return unwrap(v)
|
||||
vv := unwrap(v)
|
||||
|
||||
// Added for Hugo
|
||||
if s.helper != nil {
|
||||
s.helper.OnCalled(s.ctx, s.prep, name, argv, vv)
|
||||
}
|
||||
|
||||
return vv
|
||||
}
|
||||
|
||||
func isTrue(val reflect.Value) (truth, ok bool) {
|
||||
|
|
|
@ -64,6 +64,9 @@ func (e *execHelper) GetMethod(ctx context.Context, tmpl Preparer, receiver refl
|
|||
return m, reflect.ValueOf("v2")
|
||||
}
|
||||
|
||||
func (e *execHelper) OnCalled(ctx context.Context, tmpl Preparer, name string, args []reflect.Value, returnValue reflect.Value) {
|
||||
}
|
||||
|
||||
func TestTemplateExecutor(t *testing.T) {
|
||||
c := qt.New(t)
|
||||
|
||||
|
|
|
@ -150,6 +150,30 @@ func (t *templateExecHelper) GetMethod(ctx context.Context, tmpl texttemplate.Pr
|
|||
return fn, zero
|
||||
}
|
||||
|
||||
func (t *templateExecHelper) OnCalled(ctx context.Context, tmpl texttemplate.Preparer, name string, args []reflect.Value, result reflect.Value) {
|
||||
if !t.running {
|
||||
return
|
||||
}
|
||||
|
||||
// This switch is mostly for speed.
|
||||
switch name {
|
||||
case "Unmarshal":
|
||||
default:
|
||||
return
|
||||
}
|
||||
idm := tpl.Context.GetDependencyManagerInCurrentScope(ctx)
|
||||
if idm == nil {
|
||||
return
|
||||
}
|
||||
|
||||
for _, arg := range args {
|
||||
identity.WalkIdentitiesShallow(arg.Interface(), func(level int, id identity.Identity) bool {
|
||||
idm.AddIdentity(id)
|
||||
return false
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func (t *templateExecHelper) trackDependencies(ctx context.Context, tmpl texttemplate.Preparer, name string, receiver reflect.Value) context.Context {
|
||||
if tmpl == nil {
|
||||
panic("must provide a template")
|
||||
|
|
Loading…
Reference in a new issue