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.
 
 
 
caddy-hugo2/client.go

106 lines
2.0 KiB

package caddyhugo
import (
"fmt"
"io/ioutil"
"net/http"
"path"
"sync"
"github.com/spf13/afero"
"git.stephensearles.com/stephen/acedoc"
"git.stephensearles.com/stephen/idleshut"
)
type editSession struct {
clients uint
docname string
filename string
doc *acedoc.Document
tmpfs afero.Fs
mtx sync.Mutex
}
func (es *editSession) Clients() uint {
es.mtx.Lock()
defer es.mtx.Unlock()
return es.clients
}
func (ch *CaddyHugo) newEditSession(docName string) (*editSession, error) {
filename := ch.docFilename(docName)
fmt.Println("opening", filename)
contents, err := ioutil.ReadFile(filename)
if err != nil {
return nil, err
}
es := &editSession{
docname: docName,
filename: filename,
doc: acedoc.NewString(string(contents)),
// tmpfs: afero.NewCopyOnWriteFs(afero.NewBasePathFs(afero.NewOsFs(), ch.Dir+"/"), afero.NewMemMapFs()),
tmpfs: afero.NewCopyOnWriteFs(afero.NewReadOnlyFs(afero.NewBasePathFs(afero.NewOsFs(), ch.Dir)), afero.NewMemMapFs()),
}
printTree(es.tmpfs)
err = es.doc.LogToFile(path.Join(ch.Dir, "logs", docName))
if err != nil {
fmt.Println(err)
return nil, err
}
ch.docs[filename] = es
err = ch.renderDraft(es)
if err != nil {
return nil, err
}
return es, nil
}
func (ch *CaddyHugo) renderDraft(es *editSession) error {
var proc *idleshut.Process
f := func() {
if es.clients != 0 {
proc.Touch()
}
}
cfg, err := HugoCmdProcessConfig(ch, es, f)
if err != nil {
return fmt.Errorf("rendering draft: %v", err)
}
proc = idleshut.New(cfg)
return proc.Start()
}
func (ch *CaddyHugo) hasEditSession(docName string) (*editSession, bool) {
dr, ok := ch.docs[ch.docFilename(docName)]
return dr, ok
}
func (ch *CaddyHugo) editSession(docName string) (*editSession, error) {
ch.mtx.Lock()
defer ch.mtx.Unlock()
var err error
dr, ok := ch.hasEditSession(docName)
if !ok {
dr, err = ch.newEditSession(docName)
}
return dr, err
}
func docNameFromEditRequest(r *http.Request) string {
return r.URL.Path[len("/hugo/edit/"):]
}