Allow customizing companion commands
This commit is contained in:
+58
-15
@@ -21,11 +21,12 @@ type server struct {
|
||||
mu sync.Mutex
|
||||
cfg *config
|
||||
cfgPath string
|
||||
logPath string
|
||||
port int
|
||||
}
|
||||
|
||||
func newServer(cfg *config, cfgPath string) *server {
|
||||
return &server{cfg: cfg, cfgPath: cfgPath, port: cfg.Port}
|
||||
func newServer(cfg *config, cfgPath, logPath string) *server {
|
||||
return &server{cfg: cfg, cfgPath: cfgPath, logPath: logPath, port: cfg.Port}
|
||||
}
|
||||
|
||||
func (s *server) snapshot() config {
|
||||
@@ -131,7 +132,14 @@ func (s *server) handleOpen(w http.ResponseWriter, r *http.Request, isFolder boo
|
||||
writeJSONError(w, http.StatusBadRequest, "path is a directory")
|
||||
return
|
||||
}
|
||||
if err := openOSPath(resolved, isFolder); err != nil {
|
||||
defs := defaultCommands()
|
||||
var template string
|
||||
if isFolder {
|
||||
template = resolveOpenCommand(cfg.OpenFolderCommand, defs.OpenFolder)
|
||||
} else {
|
||||
template = resolveOpenCommand(cfg.OpenFileCommand, defs.OpenFile)
|
||||
}
|
||||
if err := runOpenCommand(template, resolved); err != nil {
|
||||
writeJSONError(w, http.StatusInternalServerError, err.Error())
|
||||
return
|
||||
}
|
||||
@@ -151,23 +159,44 @@ func (s *server) handleConfig(w http.ResponseWriter, r *http.Request) {
|
||||
}
|
||||
|
||||
type configPageData struct {
|
||||
WikiRoot string
|
||||
AllowedOrigins string
|
||||
Port int
|
||||
ConfigPath string
|
||||
Version string
|
||||
Notice string
|
||||
WikiRoot string
|
||||
AllowedOrigins string
|
||||
Port int
|
||||
ConfigPath string
|
||||
LogPath string
|
||||
LogTail string
|
||||
LogError string
|
||||
Version string
|
||||
Notice string
|
||||
OpenFileCommand string
|
||||
OpenFolderCommand string
|
||||
DefaultOpenFileCommand string
|
||||
DefaultOpenFolderCommand string
|
||||
}
|
||||
|
||||
func (s *server) renderConfig(w http.ResponseWriter, notice string) {
|
||||
cfg := s.snapshot()
|
||||
defs := defaultCommands()
|
||||
data := configPageData{
|
||||
WikiRoot: cfg.WikiRoot,
|
||||
AllowedOrigins: strings.Join(cfg.AllowedOrigins, "\n"),
|
||||
Port: cfg.Port,
|
||||
ConfigPath: s.cfgPath,
|
||||
Version: version,
|
||||
Notice: notice,
|
||||
WikiRoot: cfg.WikiRoot,
|
||||
AllowedOrigins: strings.Join(cfg.AllowedOrigins, "\n"),
|
||||
Port: cfg.Port,
|
||||
ConfigPath: s.cfgPath,
|
||||
LogPath: s.logPath,
|
||||
Version: version,
|
||||
Notice: notice,
|
||||
OpenFileCommand: cfg.OpenFileCommand,
|
||||
OpenFolderCommand: cfg.OpenFolderCommand,
|
||||
DefaultOpenFileCommand: defs.OpenFile,
|
||||
DefaultOpenFolderCommand: defs.OpenFolder,
|
||||
}
|
||||
if s.logPath != "" {
|
||||
lines, err := tailLog(s.logPath, 50)
|
||||
if err != nil {
|
||||
data.LogError = err.Error()
|
||||
} else {
|
||||
data.LogTail = strings.Join(lines, "\n")
|
||||
}
|
||||
}
|
||||
w.Header().Set("Content-Type", "text/html; charset=utf-8")
|
||||
if err := configTmpl.Execute(w, data); err != nil {
|
||||
@@ -200,10 +229,24 @@ func (s *server) saveConfig(w http.ResponseWriter, r *http.Request) {
|
||||
origins = []string{}
|
||||
}
|
||||
|
||||
openFileCmd := strings.TrimSpace(r.FormValue("openFileCommand"))
|
||||
openFolderCmd := strings.TrimSpace(r.FormValue("openFolderCommand"))
|
||||
defs := defaultCommands()
|
||||
// Persist as blank when the user submits the default verbatim, so the
|
||||
// config file stays clean and future default changes propagate.
|
||||
if openFileCmd == defs.OpenFile {
|
||||
openFileCmd = ""
|
||||
}
|
||||
if openFolderCmd == defs.OpenFolder {
|
||||
openFolderCmd = ""
|
||||
}
|
||||
|
||||
s.mu.Lock()
|
||||
newCfg := *s.cfg
|
||||
newCfg.WikiRoot = wikiRoot
|
||||
newCfg.AllowedOrigins = origins
|
||||
newCfg.OpenFileCommand = openFileCmd
|
||||
newCfg.OpenFolderCommand = openFolderCmd
|
||||
if err := writeConfigFile(s.cfgPath, &newCfg); err != nil {
|
||||
s.mu.Unlock()
|
||||
http.Error(w, "save failed: "+err.Error(), http.StatusInternalServerError)
|
||||
|
||||
Reference in New Issue
Block a user