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.
69 lines
1.4 KiB
69 lines
1.4 KiB
package caddyhugo
|
|
|
|
import (
|
|
"fmt"
|
|
"io/ioutil"
|
|
"os"
|
|
"os/exec"
|
|
|
|
"git.stephensearles.com/stephen/idleshut"
|
|
)
|
|
|
|
type HugoInteractor interface {
|
|
Render(srcdir, workdir string) HugoRenderer
|
|
}
|
|
|
|
type HugoRenderer interface {
|
|
WriteContent(contents string) error
|
|
Start() error
|
|
Stop() error
|
|
}
|
|
|
|
func HugoCmdProcessConfig(ch *CaddyHugo, es *editSession, touchFn func()) idleshut.Config {
|
|
cmd := exec.Command("hugo", "--watch", "-D", "-d", es.tmpdir)
|
|
cmd.Dir = es.tmpdir
|
|
|
|
return idleshut.Config{
|
|
Tick: WebsocketFileTicker,
|
|
MaxIdleTicks: uint(IdleWebsocketTimeout/WebsocketFileTicker) + 1,
|
|
Start: func() error {
|
|
|
|
err := cmd.Start()
|
|
if err != nil {
|
|
return fmt.Errorf("error starting hugo: %v", err)
|
|
}
|
|
|
|
return nil
|
|
},
|
|
Stop: func() error {
|
|
if cmd == nil {
|
|
return nil
|
|
}
|
|
|
|
err := cmd.Process.Signal(os.Interrupt)
|
|
if err != nil {
|
|
return fmt.Errorf("error signalling hugo to stop: %v", err)
|
|
}
|
|
err = cmd.Wait()
|
|
if err != nil {
|
|
return fmt.Errorf("error waiting for hugo to stop: %v", err)
|
|
return err
|
|
}
|
|
|
|
es.doc.Close()
|
|
os.RemoveAll(es.tmpdir)
|
|
delete(ch.docs, es.filename)
|
|
|
|
return nil
|
|
},
|
|
IdleProcessError: func(err error) {
|
|
fmt.Println("error processing draft:", err)
|
|
},
|
|
IdleTick: func() error {
|
|
return ioutil.WriteFile(es.filename, []byte(es.doc.Contents()), 0644)
|
|
},
|
|
ActiveTick: func() error {
|
|
return ioutil.WriteFile(es.filename, []byte(es.doc.Contents()), 0644)
|
|
},
|
|
}
|
|
}
|
|
|