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