Added logic to detect whether a full rebuild is necessary when writing posts.

This commit is contained in:
Leon Mika 2025-02-01 11:54:00 +11:00
parent f8e03463a6
commit ee45760cf1
3 changed files with 65 additions and 18 deletions

View file

@ -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 {

View file

@ -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() {

View file

@ -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 {