From ee45760cf16b595b2d08d4ddaef64f219260f205 Mon Sep 17 00:00:00 2001 From: Leon Mika Date: Sat, 1 Feb 2025 11:54:00 +1100 Subject: [PATCH] Added logic to detect whether a full rebuild is necessary when writing posts. --- services/sitebuilder/posts.go | 21 ++++++++++++------- services/sitebuilder/publish.go | 26 ++++++++++++++---------- services/sitebuilder/service.go | 36 +++++++++++++++++++++++++++++++++ 3 files changed, 65 insertions(+), 18 deletions(-) diff --git a/services/sitebuilder/posts.go b/services/sitebuilder/posts.go index 1a7a135..6cf1f14 100644 --- a/services/sitebuilder/posts.go +++ b/services/sitebuilder/posts.go @@ -13,14 +13,21 @@ import ( ) func (s *Service) WritePost(site models.Site, post models.Post) models.Job { - return models.Jobs( - models.Job{ - Do: func(ctx context.Context) error { - return s.writePost(site, post) - }, + return models.Job{ + Do: func(ctx context.Context) error { + rbn, err := s.fullRebuildNecessary(ctx, site) + if err != nil { + return err + } else if rbn { + return s.RebuildSite(site).Do(ctx) + } + + if err := s.writePost(site, post); err != nil { + return err + } + return s.publish(ctx, site) }, - s.Publish(site), - ) + } } func (s *Service) WriteAllPosts(site models.Site) models.Job { diff --git a/services/sitebuilder/publish.go b/services/sitebuilder/publish.go index 6d62d4b..550ef3d 100644 --- a/services/sitebuilder/publish.go +++ b/services/sitebuilder/publish.go @@ -8,21 +8,25 @@ import ( func (s *Service) Publish(site models.Site) models.Job { return models.Job{ Do: func(ctx context.Context) error { - targets, err := s.db.GetPublishTargets(ctx, site.ID) - if err != nil { - return err - } - - for _, target := range targets { - if err := s.publishTarget(ctx, site, target); err != nil { - return err - } - } - return nil + return s.publish(ctx, site) }, } } +func (s *Service) publish(ctx context.Context, site models.Site) error { + targets, err := s.db.GetPublishTargets(ctx, site.ID) + if err != nil { + return err + } + + for _, target := range targets { + if err := s.publishTarget(ctx, site, target); err != nil { + return err + } + } + return nil +} + func (s *Service) publishTarget(ctx context.Context, site models.Site, target models.PublishTarget) error { outDir, cleanFn, err := s.hugo.PublishSite(ctx, site, target) //defer func() { diff --git a/services/sitebuilder/service.go b/services/sitebuilder/service.go index 72aef4a..ad909b2 100644 --- a/services/sitebuilder/service.go +++ b/services/sitebuilder/service.go @@ -11,6 +11,7 @@ import ( "lmika.dev/lmika/hugo-cms/providers/themes" "log" "os" + "path/filepath" ) type Service struct { @@ -63,6 +64,41 @@ func (s *Service) RebuildSite(site models.Site) models.Job { ) } +func (s *Service) fullRebuildNecessary(ctx context.Context, site models.Site) (bool, error) { + dirsMustExists := []string{ + s.hugo.SiteStagingDir(site, hugo.BaseSiteDir), + s.hugo.SiteStagingDir(site, hugo.ThemeSiteDir), + s.hugo.SiteStagingDir(site, hugo.ContentSiteDir), + } + + filesMustExists := []string{ + filepath.Join(s.hugo.SiteStagingDir(site, hugo.BaseSiteDir), "hugo.toml"), + } + + for _, dir := range dirsMustExists { + if stat, err := os.Stat(dir); err != nil { + if errors.Is(err, os.ErrNotExist) { + return true, nil + } else { + return false, err + } + } else if !stat.IsDir() { + return true, nil + } + } + + for _, file := range filesMustExists { + if _, err := os.Stat(file); err != nil { + if errors.Is(err, os.ErrNotExist) { + return true, nil + } else { + return false, err + } + } + } + return false, nil +} + func (s *Service) createSite(ctx context.Context, site models.Site) error { themeMeta, ok := s.themes.Lookup(site.Theme) if !ok {