You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
67 lines
1.0 KiB
67 lines
1.0 KiB
package caddyhugo
|
|
|
|
import (
|
|
"fmt"
|
|
"io/ioutil"
|
|
"os"
|
|
"os/exec"
|
|
"sync"
|
|
)
|
|
|
|
type HugoInteractor interface {
|
|
Render(srcdir, workdir string) HugoRenderer
|
|
}
|
|
|
|
type HugoRenderer interface {
|
|
Start() error
|
|
Stop() error
|
|
}
|
|
|
|
type HugoCmdRenderer struct {
|
|
SrcDir string
|
|
TmpDir string
|
|
Filename string
|
|
|
|
cmd *exec.Cmd
|
|
mtx sync.Mutex
|
|
}
|
|
|
|
func (hcr *HugoCmdRenderer) Render(contents string) error {
|
|
err := ioutil.WriteFile(hcr.Filename, []byte(contents), 0644)
|
|
return err
|
|
}
|
|
|
|
func (hcr *HugoCmdRenderer) Start() error {
|
|
hcr.mtx.Lock()
|
|
defer hcr.mtx.Unlock()
|
|
|
|
hcr.cmd = exec.Command("hugo", "--watch", "-D", "-d", hcr.TmpDir)
|
|
hcr.cmd.Dir = hcr.TmpDir
|
|
|
|
err := hcr.cmd.Start()
|
|
if err != nil {
|
|
return fmt.Errorf("error starting hugo: %v", err)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (hcr *HugoCmdRenderer) Stop() error {
|
|
hcr.mtx.Lock()
|
|
defer hcr.mtx.Unlock()
|
|
|
|
if hcr.cmd == nil {
|
|
return nil
|
|
}
|
|
|
|
err := hcr.cmd.Process.Signal(os.Interrupt)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
err = hcr.cmd.Wait()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|