Skip to content

Commit d3af1fd

Browse files
committed
Tests
1 parent 779e246 commit d3af1fd

7 files changed

+166
-72
lines changed

hugolib/content_map.go

+21-26
Original file line numberDiff line numberDiff line change
@@ -294,10 +294,14 @@ func (m *pageMap) AddFi(fi hugofs.FileMetaInfo, whatChanged *whatChanged) (pageC
294294
return nil
295295
}
296296

297-
_, n, replaced := s.pageMap.treePages.InsertIntoValuesDimensionWithLock(pi.Base(), ps)
298-
299-
if h.isRebuild() && replaced {
300-
pt.BuildState.ChangedIdentities = append(pt.BuildState.ChangedIdentities, n.GetIdentity())
297+
u, n, replaced := s.pageMap.treePages.InsertIntoValuesDimensionWithLock(pi.Base(), ps)
298+
299+
if h.isRebuild() {
300+
if replaced {
301+
pt.AddChange(n.GetIdentity())
302+
} else {
303+
pt.AddChange(u.GetIdentity())
304+
}
301305
}
302306

303307
return nil
@@ -313,7 +317,7 @@ func (m *pageMap) AddFi(fi hugofs.FileMetaInfo, whatChanged *whatChanged) (pageC
313317
_, n, replaced := s.pageMap.treeResources.InsertIntoValuesDimensionWithLock(rc.Path, rs)
314318

315319
if h.isRebuild() && replaced {
316-
pt.BuildState.ChangedIdentities = append(pt.BuildState.ChangedIdentities, n.GetIdentity())
320+
pt.AddChange(n.GetIdentity())
317321
}
318322
return nil
319323
},
@@ -324,14 +328,20 @@ func (m *pageMap) AddFi(fi hugofs.FileMetaInfo, whatChanged *whatChanged) (pageC
324328

325329
}
326330

327-
contentAdapter.BuildState.PrepareNextBuild()
331+
handleBuildInfo := func(s *Site, bi pagesfromdata.BuildInfo) {
332+
resourceCount += bi.NumResourcesAdded
333+
pageCount += bi.NumPagesAdded
334+
s.handleContentAdapterChanges(bi, whatChanged)
335+
}
328336

329337
// TODO1 do we need a mutex?
330-
if err := contentAdapter.Execute(context.Background()); err != nil {
338+
bi, err := contentAdapter.Execute(context.Background())
339+
if err != nil {
331340
return err
332341
}
342+
handleBuildInfo(s, bi)
333343

334-
if !rebuild && contentAdapter.BuildState.EnableAllLanguages {
344+
if !rebuild && bi.EnableAllLanguages {
335345
// Clone and insert the adapter for the other sites.
336346
for _, ss := range s.h.Sites {
337347
if s == ss {
@@ -341,33 +351,18 @@ func (m *pageMap) AddFi(fi hugofs.FileMetaInfo, whatChanged *whatChanged) (pageC
341351
clone := contentAdapter.CloneForSite(ss)
342352

343353
// Make sure it gets executed for the first time.
344-
if err := clone.Execute(context.Background()); err != nil {
354+
bi, err := clone.Execute(context.Background())
355+
if err != nil {
345356
return err
346357
}
358+
handleBuildInfo(ss, bi)
347359

348360
// Insert into the correct language tree so it get rebuilt on changes.
349361
ss.pageMap.treePagesFromTemplateOptions.Insert(pi.Base(), clone)
350362

351363
}
352364
}
353365

354-
resourceCount += contentAdapter.BuildState.NumResourcesAdded
355-
pageCount += contentAdapter.BuildState.NumPagesAdded
356-
357-
if m.s.h.isRebuild() {
358-
if len(contentAdapter.BuildState.ChangedIdentities) > 0 {
359-
whatChanged.Add(contentAdapter.BuildState.ChangedIdentities...)
360-
}
361-
362-
for _, p := range contentAdapter.BuildState.DeletedPaths {
363-
// TODO1 language, resource etc.
364-
pp := path.Join(pi.Base(), p)
365-
if v, ok := m.treePages.Delete(pp); ok {
366-
whatChanged.Add(v.GetIdentity())
367-
}
368-
369-
}
370-
}
371366
return nil
372367
}(); err != nil {
373368
addErr = err

hugolib/content_map_page.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -1151,7 +1151,7 @@ func (h *HugoSites) resolveAndClearStateForIdentities(
11511151
for _, id := range changes {
11521152
checkedCount++
11531153
if r := depsFinder.Contains(id, n.DependencyManager, 2); r > identity.FinderNotFound {
1154-
n.BuildState.Rebuild = true
1154+
n.MarkStale()
11551155
matchCount++
11561156
break
11571157
}

hugolib/doctree/treeshifttree.go

+5-2
Original file line numberDiff line numberDiff line change
@@ -55,10 +55,13 @@ func (t *TreeShiftTree[T]) Get(s string) T {
5555
return t.trees[t.v].Get(s)
5656
}
5757

58-
func (t *TreeShiftTree[T]) GetAll(s string, f func(v T)) {
58+
func (t *TreeShiftTree[T]) DeleteAllFunc(s string, f func(s string, v T) bool) {
5959
for _, tt := range t.trees {
6060
if v := tt.Get(s); v != t.zero {
61-
f(v)
61+
if f(s, v) {
62+
// Delete.
63+
tt.tree.Delete(s)
64+
}
6265
}
6366
}
6467
}

hugolib/hugo_sites_build.go

+57-16
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ func (h *HugoSites) Build(config BuildCfg, events ...fsnotify.Event) error {
116116
conf := &config
117117
if conf.whatChanged == nil {
118118
// Assume everything has changed
119-
conf.whatChanged = &whatChanged{contentChanged: true}
119+
conf.whatChanged = &whatChanged{needsPagesAssemble: true}
120120
}
121121

122122
var prepareErr error
@@ -224,7 +224,7 @@ func (h *HugoSites) initRebuild(config *BuildCfg) error {
224224
})
225225

226226
for _, s := range h.Sites {
227-
s.resetBuildState(config.whatChanged.contentChanged)
227+
s.resetBuildState(config.whatChanged.needsPagesAssemble)
228228
}
229229

230230
h.reset(config)
@@ -252,7 +252,15 @@ func (h *HugoSites) assemble(ctx context.Context, l logg.LevelLogger, bcfg *Buil
252252
l = l.WithField("step", "assemble")
253253
defer loggers.TimeTrackf(l, time.Now(), nil, "")
254254

255-
if !bcfg.whatChanged.contentChanged {
255+
if !bcfg.whatChanged.needsPagesAssemble {
256+
changes := bcfg.whatChanged.Changes()
257+
258+
if len(changes) > 0 {
259+
// TODO1 consolidate.
260+
if err := h.resolveAndClearStateForIdentities(ctx, l, nil, changes); err != nil {
261+
return err
262+
}
263+
}
256264
return nil
257265
}
258266

@@ -626,10 +634,10 @@ func (h *HugoSites) processPartial(ctx context.Context, l logg.LevelLogger, conf
626634
logger := h.Log
627635

628636
var (
629-
tmplAdded bool
630-
tmplChanged bool
631-
i18nChanged bool
632-
contentChanged bool
637+
tmplAdded bool
638+
tmplChanged bool
639+
i18nChanged bool
640+
needsPagesAssemble bool
633641
)
634642

635643
changedPaths := struct {
@@ -709,13 +717,21 @@ func (h *HugoSites) processPartial(ctx context.Context, l logg.LevelLogger, conf
709717
changes = append(changes, ids...)
710718
}
711719
} else {
712-
h.pageTrees.treePagesFromTemplateOptions.GetAll(pathInfo.Base(),
713-
func(n *pagesfromdata.PagesFromTemplate) {
720+
h.pageTrees.treePagesFromTemplateOptions.DeleteAllFunc(pathInfo.Base(),
721+
func(s string, n *pagesfromdata.PagesFromTemplate) bool {
714722
changes = append(changes, n.DependencyManager)
723+
724+
// Try to open the file to see if has been deleted.
725+
f, err := n.GoTmplFi.Meta().Open()
726+
if err == nil {
727+
f.Close()
728+
}
729+
// TODO1 also remove all pages and resources below this path.
730+
return err != nil
715731
})
716732
}
717733

718-
contentChanged = true
734+
needsPagesAssemble = true
719735

720736
if config.RecentlyVisited != nil {
721737
// Fast render mode. Adding them to the visited queue
@@ -778,13 +794,15 @@ func (h *HugoSites) processPartial(ctx context.Context, l logg.LevelLogger, conf
778794
case files.ComponentFolderAssets:
779795
logger.Println("Asset changed", pathInfo.Path())
780796
changes = append(changes, pathInfo)
797+
needsPagesAssemble = true
781798
case files.ComponentFolderData:
782799
logger.Println("Data changed", pathInfo.Path())
783800

784801
// This should cover all usage of site.Data.
785802
// Currently very coarse grained.
786803
changes = append(changes, siteidentities.Data)
787804
h.init.data.Reset()
805+
needsPagesAssemble = true
788806
case files.ComponentFolderI18n:
789807
logger.Println("i18n changed", pathInfo.Path())
790808
i18nChanged = true
@@ -868,8 +886,8 @@ func (h *HugoSites) processPartial(ctx context.Context, l logg.LevelLogger, conf
868886
resourceFiles := h.fileEventsContentPaths(addedOrChangedContent)
869887

870888
changed := &whatChanged{
871-
contentChanged: contentChanged,
872-
identitySet: make(identity.Identities),
889+
needsPagesAssemble: needsPagesAssemble,
890+
identitySet: make(identity.Identities),
873891
}
874892
changed.Add(changes...)
875893

@@ -928,7 +946,7 @@ func (h *HugoSites) processPartial(ctx context.Context, l logg.LevelLogger, conf
928946
}
929947

930948
if h.isRebuild() {
931-
if err := h.processContentAdaptersOnRebuild(ctx); err != nil {
949+
if err := h.processContentAdaptersOnRebuild(ctx, config); err != nil {
932950
return err
933951
}
934952
}
@@ -955,16 +973,39 @@ func (h *HugoSites) processFull(ctx context.Context, l logg.LevelLogger, config
955973
return err
956974
}
957975

958-
func (h *HugoSites) processContentAdaptersOnRebuild(ctx context.Context) error {
976+
func (s *Site) handleContentAdapterChanges(bi pagesfromdata.BuildInfo, whatChanged *whatChanged) {
977+
if !s.h.isRebuild() {
978+
return
979+
}
980+
981+
if len(bi.ChangedIdentities) > 0 {
982+
whatChanged.Add(bi.ChangedIdentities...)
983+
}
984+
985+
for _, p := range bi.DeletedPaths {
986+
pp := path.Join(bi.Path.Base(), p)
987+
if v, ok := s.pageMap.treePages.Delete(pp); ok {
988+
whatChanged.Add(v.GetIdentity())
989+
}
990+
}
991+
}
992+
993+
func (h *HugoSites) processContentAdaptersOnRebuild(ctx context.Context, buildConfig *BuildCfg) error {
959994
g := rungroup.Run[*pagesfromdata.PagesFromTemplate](ctx, rungroup.Config[*pagesfromdata.PagesFromTemplate]{
960995
NumWorkers: h.numWorkers,
961996
Handle: func(ctx context.Context, p *pagesfromdata.PagesFromTemplate) error {
962-
return p.Execute(ctx)
997+
bi, err := p.Execute(ctx)
998+
if err != nil {
999+
return err
1000+
}
1001+
s := p.Site.(*Site)
1002+
s.handleContentAdapterChanges(bi, buildConfig.whatChanged)
1003+
return nil
9631004
},
9641005
})
9651006

9661007
h.pageTrees.treePagesFromTemplateOptions.WalkPrefixRaw(doctree.LockTypeRead, "", func(key string, p *pagesfromdata.PagesFromTemplate) (bool, error) {
967-
if p.BuildState.Rebuild {
1008+
if p.StaleVersion() > 0 {
9681009
g.Enqueue(p)
9691010
}
9701011
return false, nil

0 commit comments

Comments
 (0)