Skip to content

Commit

Permalink
Handle rebuilds when resources passed to transform.Unmarshal etc. cha…
Browse files Browse the repository at this point in the history
…nges

Fixes gohugoio#12065
  • Loading branch information
bep committed Feb 19, 2024
1 parent 5ada27b commit ce2f0e6
Show file tree
Hide file tree
Showing 3 changed files with 54 additions and 1 deletion.
21 changes: 21 additions & 0 deletions hugolib/rebuild_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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.")
Expand Down
8 changes: 7 additions & 1 deletion tpl/internal/go_templates/texttemplate/hugo_template.go
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down Expand Up @@ -356,7 +357,12 @@ 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
s.helper.OnCalled(s.ctx, s.prep, name, argv, vv)

return vv
}

func isTrue(val reflect.Value) (truth, ok bool) {
Expand Down
26 changes: 26 additions & 0 deletions tpl/tplimpl/template_funcs.go
Original file line number Diff line number Diff line change
Expand Up @@ -150,6 +150,32 @@ 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
})
}

return
}

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")
Expand Down

0 comments on commit ce2f0e6

Please sign in to comment.