From 0c3178bc8d055cd75fbd5e7004832c123c7f9b9c Mon Sep 17 00:00:00 2001 From: Mark Walters Date: Wed, 16 Apr 2014 06:58:47 +0100 Subject: [PATCH] [WIP PATCH] emacs: hello: bugfix for saved searches defcustom --- fe/7b77fa5d286fceee8b83a7935441498c89ef05 | 300 ++++++++++++++++++++++ 1 file changed, 300 insertions(+) create mode 100644 fe/7b77fa5d286fceee8b83a7935441498c89ef05 diff --git a/fe/7b77fa5d286fceee8b83a7935441498c89ef05 b/fe/7b77fa5d286fceee8b83a7935441498c89ef05 new file mode 100644 index 000000000..304c39fa9 --- /dev/null +++ b/fe/7b77fa5d286fceee8b83a7935441498c89ef05 @@ -0,0 +1,300 @@ +Return-Path: +X-Original-To: notmuch@notmuchmail.org +Delivered-To: notmuch@notmuchmail.org +Received: from localhost (localhost [127.0.0.1]) + by olra.theworths.org (Postfix) with ESMTP id 10AC4431FBF + for ; Tue, 15 Apr 2014 22:59:23 -0700 (PDT) +X-Virus-Scanned: Debian amavisd-new at olra.theworths.org +X-Spam-Flag: NO +X-Spam-Score: 0.201 +X-Spam-Level: +X-Spam-Status: No, score=0.201 tagged_above=-999 required=5 + tests=[DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, + FREEMAIL_ENVFROM_END_DIGIT=1, FREEMAIL_FROM=0.001, + RCVD_IN_DNSWL_LOW=-0.7] autolearn=disabled +Received: from olra.theworths.org ([127.0.0.1]) + by localhost (olra.theworths.org [127.0.0.1]) (amavisd-new, port 10024) + with ESMTP id va9GTo+jp7cW for ; + Tue, 15 Apr 2014 22:59:17 -0700 (PDT) +Received: from mail-ee0-f46.google.com (mail-ee0-f46.google.com + [74.125.83.46]) (using TLSv1 with cipher RC4-SHA (128/128 bits)) (No client + certificate requested) by olra.theworths.org (Postfix) with ESMTPS id + D87B1431FBD for ; Tue, 15 Apr 2014 22:59:16 -0700 + (PDT) +Received: by mail-ee0-f46.google.com with SMTP id t10so8330817eei.19 + for ; Tue, 15 Apr 2014 22:59:13 -0700 (PDT) +DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; + h=from:to:cc:subject:date:message-id; + bh=ZASDUhcj98hz7oizIrrI32xcB7po2l/jjFK+4y3kzS8=; + b=NhGVuy1dXGymLPIFZF+RbbEXiPGqF45TFAH/kdUUcHwVKkrFq0EOUd3HnMNvchV6tC + D8AuDnKyhRiohG6XkLzsPht4c0UvgNKJVnkwnJcOoPlfbgXhanofwLFwCVjedL4MKrDh + kIx+YEiGLiVig810rGPqtsIWO4JQJiwxZcQntP8gho5CGHuYeYBWoFoSZ/vq4gnENj9y + 86b/q2RSBXHUJSFzB7YGCs7D6ckqpH6+Dx+xqEAk5fowiNi2ZXWuTqTTwrviH6a+BytQ + 2tH4cYZLqZj89XHUvGnYHC+QaM4QFO2UnY6NFxZQ280FXyJyTW2mo1DJakaxSgntEask + fEPA== +X-Received: by 10.15.73.134 with SMTP id h6mr2394662eey.3.1397627952543; + Tue, 15 Apr 2014 22:59:12 -0700 (PDT) +Received: from localhost ([217.17.137.178]) + by mx.google.com with ESMTPSA id q41sm54837105eez.7.2014.04.15.22.59.11 + for + (version=TLSv1.2 cipher=RC4-SHA bits=128/128); + Tue, 15 Apr 2014 22:59:11 -0700 (PDT) +From: Mark Walters +To: notmuch@notmuchmail.org +Subject: [WIP PATCH] emacs: hello: bugfix for saved searches defcustom +Date: Wed, 16 Apr 2014 06:58:47 +0100 +Message-Id: <1397627927-9692-1-git-send-email-markwalters1009@gmail.com> +X-Mailer: git-send-email 1.7.10.4 +X-BeenThere: notmuch@notmuchmail.org +X-Mailman-Version: 2.1.13 +Precedence: list +List-Id: "Use and development of the notmuch mail system." + +List-Unsubscribe: , + +List-Archive: +List-Post: +List-Help: +List-Subscribe: , + +X-List-Received-Date: Wed, 16 Apr 2014 05:59:23 -0000 + +--- +Hi + +David found a bug in the recent notmuch hello saved searches and +reduced to a small test case. The problem occurs if the user sets +notmuch-saved-searches and then loads notmuch. The reason is that the +defcustom calls some utility functions and these need to be defined +(not just declared) when the defcustom is encountered. + +This patch moves the code around so that they are defined first. I +have marked the patch WIP as I am not sure what the best reordering +is, and we may want to rename some functions which have changed file +for namespace reasons. + +Anyway this fixes the test case. If it fixes the original bug too then +I will provide a better version. + +Best wishes + +Mark + + + + emacs/notmuch-hello.el | 128 ++++++++++++++++++++++++++++++++++-------------- + emacs/notmuch-lib.el | 52 -------------------- + 2 files changed, 90 insertions(+), 90 deletions(-) + +diff --git a/emacs/notmuch-hello.el b/emacs/notmuch-hello.el +index 4900a24..27eac72 100644 +--- a/emacs/notmuch-hello.el ++++ b/emacs/notmuch-hello.el +@@ -29,6 +29,96 @@ + (declare-function notmuch-search "notmuch" (&optional query oldest-first target-thread target-line continuation)) + (declare-function notmuch-poll "notmuch" ()) + ++(defun notmuch-saved-search-get (saved-search field) ++ "Get FIELD from SAVED-SEARCH. ++ ++If SAVED-SEARCH is a plist, this is just `plist-get', but for ++backwards compatibility, this also deals with the two other ++possible formats for SAVED-SEARCH: cons cells (NAME . QUERY) and ++lists (NAME QUERY COUNT-QUERY)." ++ (cond ++ ((keywordp (car saved-search)) ++ (plist-get saved-search field)) ++ ;; It is not a plist so it is an old-style entry. ++ ((consp (cdr saved-search)) ;; It is a list (NAME QUERY COUNT-QUERY) ++ (case field ++ (:name (first saved-search)) ++ (:query (second saved-search)) ++ (:count-query (third saved-search)) ++ (t nil))) ++ (t ;; It is a cons-cell (NAME . QUERY) ++ (case field ++ (:name (car saved-search)) ++ (:query (cdr saved-search)) ++ (t nil))))) ++ ++(defun notmuch-hello-saved-search-to-plist (saved-search) ++ "Return a copy of SAVED-SEARCH in plist form. ++ ++If saved search is a plist then just return a copy. In other ++cases, for backwards compatability, convert to plist form and ++return that." ++ (if (keywordp (car saved-search)) ++ (copy-seq saved-search) ++ (let ((fields (list :name :query :count-query)) ++ plist-search) ++ (dolist (field fields plist-search) ++ (let ((string (notmuch-saved-search-get saved-search field))) ++ (when string ++ (setq plist-search (append plist-search (list field string))))))))) ++ ++(defun notmuch--saved-searches-to-plist (symbol) ++ "Extract a saved-search variable into plist form. ++ ++The new style saved search is just a plist, but for backwards ++compatatibility we use this function to extract old style saved ++searches so they still work in customize." ++ (let ((saved-searches (default-value symbol))) ++ (mapcar #'notmuch-hello-saved-search-to-plist saved-searches))) ++ ++(define-widget 'notmuch-saved-search-plist 'list ++ "A single saved search property list." ++ :tag "Saved Search" ++ :args '((list :inline t ++ :format "%v" ++ (group :format "%v" :inline t (const :format " Name: " :name) (string :format "%v")) ++ (group :format "%v" :inline t (const :format " Query: " :query) (string :format "%v"))) ++ (checklist :inline t ++ :format "%v" ++ (group :format "%v" :inline t (const :format "Count-Query: " :count-query) (string :format "%v")) ++ (group :format "%v" :inline t (const :format "" :sort-order) ++ (choice :tag " Sort Order" ++ (const :tag "Default" nil) ++ (const :tag "Oldest-first" oldest-first) ++ (const :tag "Newest-first" newest-first)))))) ++ ++(defcustom notmuch-saved-searches '((:name "inbox" :query "tag:inbox") ++ (:name "unread" :query "tag:unread")) ++ "A list of saved searches to display. ++ ++The saved search can be given in 3 forms. The preferred way is as ++a plist. Supported properties are ++ ++ :name Name of the search (required). ++ :query Search to run (required). ++ :count-query Optional extra query to generate the count ++ shown. If not present then the :query property ++ is used. ++ :sort-order Specify the sort order to be used for the search. ++ Possible values are 'oldest-first 'newest-first or ++ nil. Nil means use the default sort order. ++ ++Other accepted forms are a cons cell of the form (NAME . QUERY) ++or a list of the form (NAME QUERY COUNT-QUERY)." ++;; The saved-search format is also used by the all-tags notmuch-hello ++;; section. This section generates its own saved-search list in one of ++;; the latter two forms. ++ ++ :get 'notmuch--saved-searches-to-plist ++ :type '(repeat notmuch-saved-search-plist) ++ :tag "List of Saved Searches" ++ :group 'notmuch-hello) ++ + (defcustom notmuch-hello-recent-searches-max 10 + "The number of recent searches to display." + :type 'integer +@@ -269,44 +359,6 @@ afterwards.") + (add-to-history 'notmuch-search-history search))) + (notmuch-search search notmuch-search-oldest-first)) + +-(defun notmuch-saved-search-get (saved-search field) +- "Get FIELD from SAVED-SEARCH. +- +-If SAVED-SEARCH is a plist, this is just `plist-get', but for +-backwards compatibility, this also deals with the two other +-possible formats for SAVED-SEARCH: cons cells (NAME . QUERY) and +-lists (NAME QUERY COUNT-QUERY)." +- (cond +- ((keywordp (car saved-search)) +- (plist-get saved-search field)) +- ;; It is not a plist so it is an old-style entry. +- ((consp (cdr saved-search)) ;; It is a list (NAME QUERY COUNT-QUERY) +- (case field +- (:name (first saved-search)) +- (:query (second saved-search)) +- (:count-query (third saved-search)) +- (t nil))) +- (t ;; It is a cons-cell (NAME . QUERY) +- (case field +- (:name (car saved-search)) +- (:query (cdr saved-search)) +- (t nil))))) +- +-(defun notmuch-hello-saved-search-to-plist (saved-search) +- "Return a copy of SAVED-SEARCH in plist form. +- +-If saved search is a plist then just return a copy. In other +-cases, for backwards compatability, convert to plist form and +-return that." +- (if (keywordp (car saved-search)) +- (copy-seq saved-search) +- (let ((fields (list :name :query :count-query)) +- plist-search) +- (dolist (field fields plist-search) +- (let ((string (notmuch-saved-search-get saved-search field))) +- (when string +- (setq plist-search (append plist-search (list field string))))))))) +- + (defun notmuch-hello-add-saved-search (widget) + (interactive) + (let ((search (widget-value +diff --git a/emacs/notmuch-lib.el b/emacs/notmuch-lib.el +index 3a3c69d..2941da3 100644 +--- a/emacs/notmuch-lib.el ++++ b/emacs/notmuch-lib.el +@@ -107,58 +107,6 @@ Note that the recommended way of achieving the same is using + (defvar notmuch-search-history nil + "Variable to store notmuch searches history.") + +-(defun notmuch--saved-searches-to-plist (symbol) +- "Extract a saved-search variable into plist form. +- +-The new style saved search is just a plist, but for backwards +-compatatibility we use this function to extract old style saved +-searches so they still work in customize." +- (let ((saved-searches (default-value symbol))) +- (mapcar #'notmuch-hello-saved-search-to-plist saved-searches))) +- +-(define-widget 'notmuch-saved-search-plist 'list +- "A single saved search property list." +- :tag "Saved Search" +- :args '((list :inline t +- :format "%v" +- (group :format "%v" :inline t (const :format " Name: " :name) (string :format "%v")) +- (group :format "%v" :inline t (const :format " Query: " :query) (string :format "%v"))) +- (checklist :inline t +- :format "%v" +- (group :format "%v" :inline t (const :format "Count-Query: " :count-query) (string :format "%v")) +- (group :format "%v" :inline t (const :format "" :sort-order) +- (choice :tag " Sort Order" +- (const :tag "Default" nil) +- (const :tag "Oldest-first" oldest-first) +- (const :tag "Newest-first" newest-first)))))) +- +-(defcustom notmuch-saved-searches '((:name "inbox" :query "tag:inbox") +- (:name "unread" :query "tag:unread")) +- "A list of saved searches to display. +- +-The saved search can be given in 3 forms. The preferred way is as +-a plist. Supported properties are +- +- :name Name of the search (required). +- :query Search to run (required). +- :count-query Optional extra query to generate the count +- shown. If not present then the :query property +- is used. +- :sort-order Specify the sort order to be used for the search. +- Possible values are 'oldest-first 'newest-first or +- nil. Nil means use the default sort order. +- +-Other accepted forms are a cons cell of the form (NAME . QUERY) +-or a list of the form (NAME QUERY COUNT-QUERY)." +-;; The saved-search format is also used by the all-tags notmuch-hello +-;; section. This section generates its own saved-search list in one of +-;; the latter two forms. +- +- :get 'notmuch--saved-searches-to-plist +- :type '(repeat notmuch-saved-search-plist) +- :tag "List of Saved Searches" +- :group 'notmuch-hello) +- + (defcustom notmuch-archive-tags '("-inbox") + "List of tag changes to apply to a message or a thread when it is archived. + +-- +1.7.10.4 + -- 2.26.2