From 0e50f29bf3e2cde36b2c345addbc51527b17e14b Mon Sep 17 00:00:00 2001 From: Koni Marti Date: Thu, 29 Sep 2022 00:24:56 +0200 Subject: [PATCH] notmuch: move logic for dynamic folders to backend Moves logic for creating dynamic folders from the dirlist widget to the backend. Since dynamic folders are notmuch-specific, the notmuch backend should be responsible for correctly setting up those folders. It does that by sending two DirectoryInfos: the first to create the message store, the second to fetch the directory content. This approach also fixes a deadlock introduced by 716ade8968715 ("worker: lock access to callback maps"). Reported-by: Bence Ferdinandy Signed-off-by: Koni Marti Tested-by: Tim Culverhouse --- widgets/dirlist.go | 13 ------------- worker/notmuch/worker.go | 14 +++++++++----- 2 files changed, 9 insertions(+), 18 deletions(-) diff --git a/widgets/dirlist.go b/widgets/dirlist.go index 83001b7..643be44 100644 --- a/widgets/dirlist.go +++ b/widgets/dirlist.go @@ -156,12 +156,6 @@ func (dirlist *DirectoryList) Select(name string) { select { case <-time.After(delay): - newStore := true - for _, s := range dirlist.store.List() { - if s == dirlist.selecting { - newStore = false - } - } dirlist.worker.PostAction(&types.OpenDirectory{Directory: name}, func(msg types.WorkerMessage) { switch msg.(type) { @@ -185,13 +179,6 @@ func (dirlist *DirectoryList) Select(name string) { sort.Strings(dirlist.dirs) } dirlist.sortDirsByFoldersSortConfig() - if newStore { - store, ok := dirlist.MsgStore(name) - if ok { - // Fetch directory contents via store.Sort - store.Sort(nil, nil) - } - } } dirlist.Invalidate() }) diff --git a/worker/notmuch/worker.go b/worker/notmuch/worker.go index 2c8cc4f..1ceaac8 100644 --- a/worker/notmuch/worker.go +++ b/worker/notmuch/worker.go @@ -249,7 +249,7 @@ func (w *worker) buildDirInfo(name string, query string, skipSort bool) ( } func (w *worker) emitDirectoryInfo(name string) error { - query := w.queryFromName(name) + query, _ := w.queryFromName(name) info, err := w.gatherDirectoryInfo(name, query) if err != nil { return err @@ -260,19 +260,20 @@ func (w *worker) emitDirectoryInfo(name string) error { // queryFromName either returns the friendly ID if aliased or the name itself // assuming it to be the query -func (w *worker) queryFromName(name string) string { +func (w *worker) queryFromName(name string) (string, bool) { // try the friendly name first, if that fails assume it's a query q, ok := w.nameQueryMap[name] if !ok { - return name + return name, true } - return q + return q, false } func (w *worker) handleOpenDirectory(msg *types.OpenDirectory) error { logging.Infof("opening %s", msg.Directory) // try the friendly name first, if that fails assume it's a query - w.query = w.queryFromName(msg.Directory) + var isQuery bool + w.query, isQuery = w.queryFromName(msg.Directory) w.currentQueryName = msg.Directory info, err := w.gatherDirectoryInfo(msg.Directory, w.query) if err != nil { @@ -280,6 +281,9 @@ func (w *worker) handleOpenDirectory(msg *types.OpenDirectory) error { } info.Message = types.RespondTo(msg) w.w.PostMessage(info, nil) + if isQuery { + w.w.PostMessage(info, nil) + } w.done(msg) return nil }