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 }