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)
|
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) {
|
func TestRebuildEditTextFileInHomeBundle(t *testing.T) {
|
||||||
b := TestRunning(t, rebuildFilesSimple)
|
b := TestRunning(t, rebuildFilesSimple)
|
||||||
b.AssertFileContent("public/index.html", "Home Content.")
|
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)
|
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)
|
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)
|
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.
|
// 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.at(node)
|
||||||
s.errorf("error calling %s: %w", name, err)
|
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) {
|
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")
|
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) {
|
func TestTemplateExecutor(t *testing.T) {
|
||||||
c := qt.New(t)
|
c := qt.New(t)
|
||||||
|
|
||||||
|
|
|
@ -150,6 +150,30 @@ func (t *templateExecHelper) GetMethod(ctx context.Context, tmpl texttemplate.Pr
|
||||||
return fn, zero
|
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 {
|
func (t *templateExecHelper) trackDependencies(ctx context.Context, tmpl texttemplate.Preparer, name string, receiver reflect.Value) context.Context {
|
||||||
if tmpl == nil {
|
if tmpl == nil {
|
||||||
panic("must provide a template")
|
panic("must provide a template")
|
||||||
|
|
Loading…
Add table
Reference in a new issue