package hugo import ( "bytes" "context" "lmika.dev/lmika/hugo-crm/models" "lmika.dev/lmika/hugo-crm/providers/hugo/tmpls" "log" "os" "os/exec" "path/filepath" "text/template" ) type Provider struct { stagingDir string tmpls *template.Template } func New(stagingDir string) (*Provider, error) { ts, err := template.ParseFS(tmpls.FS, "*.tmpl") if err != nil { return nil, err } return &Provider{ stagingDir: stagingDir, tmpls: ts, }, nil } func (p *Provider) SiteStagingDir(site models.Site, what SiteDir) string { switch what { case BaseSiteDir: return filepath.Join(p.stagingDir, site.Name) case ThemeSiteDir: return filepath.Join(p.stagingDir, site.Name, "themes", site.Theme) } return "" } func (p *Provider) NewSite(ctx context.Context, site models.Site) error { log.Printf(" .. %v", p.SiteStagingDir(site, BaseSiteDir)) if err := os.MkdirAll(p.SiteStagingDir(site, BaseSiteDir), 0755); err != nil { return err } // Create the new site if err := exec.CommandContext(ctx, "hugo", "new", "site", p.SiteStagingDir(site, BaseSiteDir)).Run(); err != nil { return err } return nil } func (p *Provider) ReconfigureSite(ctx context.Context, site models.Site) error { // Reconfigure the site var hugoCfg bytes.Buffer if err := p.tmpls.ExecuteTemplate(&hugoCfg, "config.toml.tmpl", struct { Site models.Site }{ Site: site, }); err != nil { return err } if err := os.WriteFile(filepath.Join(p.SiteStagingDir(site, BaseSiteDir), "hugo.toml"), hugoCfg.Bytes(), 0644); err != nil { return err } return nil }