aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorReto Brunner <reto@labrat.space>2019-10-28 21:31:01 +0100
committerDrew DeVault <sir@cmpwn.com>2019-11-01 11:02:01 -0400
commit6dc537fbe3516181322a93b04f3884b9a4bb243c (patch)
treea86fdf66c708cdc8fe8789ede00bc026bf39df40
parentcd39e8f90cde6adb3d127454f99184d84d74d40c (diff)
downloadaerc-6dc537fbe3516181322a93b04f3884b9a4bb243c.tar.gz
Notmuch: be resilient to config errors
Right now notmuch panics if something goes wrong in the configure event. This patch checks for that and returns an error instead, so that we can at least get the UI up and running (and all the other accounts) The experience will be completely degraded until another configure event occurs.
-rw-r--r--worker/notmuch/worker.go25
1 files changed, 22 insertions, 3 deletions
diff --git a/worker/notmuch/worker.go b/worker/notmuch/worker.go
index be213bf6..ef4d4bfb 100644
--- a/worker/notmuch/worker.go
+++ b/worker/notmuch/worker.go
@@ -32,6 +32,7 @@ type worker struct {
uidStore *uidstore.Store
nameQueryMap map[string]string
db *notmuch.DB
+ setupErr error
currentSortCriteria []*types.SortCriterion
}
@@ -69,6 +70,14 @@ func (w *worker) err(msg types.WorkerMessage, err error) {
}, nil)
}
func (w *worker) handleMessage(msg types.WorkerMessage) error {
+ if w.setupErr != nil {
+ // only configure can recover from a config error, bail for everything else
+ _, isConfigure := msg.(*types.Configure)
+ if !isConfigure {
+ return w.setupErr
+ }
+ }
+
switch msg := msg.(type) {
case *types.Unsupported:
// No-op
@@ -109,6 +118,15 @@ func (w *worker) handleMessage(msg types.WorkerMessage) error {
}
func (w *worker) handleConfigure(msg *types.Configure) error {
+ var err error
+ defer func() {
+ if err == nil {
+ w.setupErr = nil
+ return
+ }
+ w.setupErr = fmt.Errorf("notmuch: %v", err)
+ }()
+
u, err := url.Parse(msg.Config.Source)
if err != nil {
w.w.Logger.Printf("error configuring notmuch worker: %v", err)
@@ -120,8 +138,9 @@ func (w *worker) handleConfigure(msg *types.Configure) error {
}
pathToDB := filepath.Join(home, u.Path)
w.uidStore = uidstore.NewStore()
- if err = w.loadQueryMap(msg.Config); err != nil {
- return fmt.Errorf("could not load query map: %v", err)
+ err = w.loadQueryMap(msg.Config)
+ if err != nil {
+ return fmt.Errorf("could not load query map configuration: %v", err)
}
excludedTags := w.loadExcludeTags(msg.Config)
w.db = notmuch.NewDB(pathToDB, excludedTags, w.w.Logger)
@@ -393,7 +412,7 @@ func (w *worker) loadQueryMap(acctConfig *config.AccountConfig) error {
split := strings.SplitN(line, "=", 2)
if len(split) != 2 {
- return fmt.Errorf("invalid line %q, want name=query", line)
+ return fmt.Errorf("%v: invalid line %q, want name=query", file, line)
}
w.nameQueryMap[split[0]] = split[1]
}