104 lines
2.4 KiB
Go
104 lines
2.4 KiB
Go
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
|
|
scratchDir string
|
|
tmpls *template.Template
|
|
}
|
|
|
|
func New(stagingDir, scratchDir string) (*Provider, error) {
|
|
ts, err := template.ParseFS(tmpls.FS, "*.tmpl")
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return &Provider{
|
|
stagingDir: stagingDir,
|
|
scratchDir: scratchDir,
|
|
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 filepath.Join(p.stagingDir, site.Name, string(what))
|
|
}
|
|
|
|
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) PublishSite(ctx context.Context, site models.Site, target models.PublishTarget) (outDir string, clean func(), err error) {
|
|
if err := os.MkdirAll(p.scratchDir, 0755); err != nil {
|
|
return "", nil, err
|
|
}
|
|
|
|
outDir, err = os.MkdirTemp(p.scratchDir, site.Name+"-*")
|
|
if err != nil {
|
|
return "", nil, err
|
|
}
|
|
clean = func() {
|
|
os.RemoveAll(outDir)
|
|
}
|
|
|
|
outDir, err = filepath.Abs(outDir)
|
|
if err != nil {
|
|
return "", nil, err
|
|
}
|
|
|
|
cmd := exec.CommandContext(ctx, "hugo",
|
|
"--source", p.SiteStagingDir(site, BaseSiteDir),
|
|
"--destination", outDir,
|
|
"--baseURL", target.URL)
|
|
cmd.Stderr = os.Stderr
|
|
cmd.Stdout = os.Stdout
|
|
|
|
if err := cmd.Run(); err != nil {
|
|
return "", clean, err
|
|
}
|
|
return outDir, clean, 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
|
|
}
|