* [PATCH 00/11] Move notmuch-tree to mainline @ 2013-10-29 22:55 Mark Walters 2013-10-29 22:55 ` [PATCH 01/11] emacs: move notmuch-help to lib Mark Walters ` (13 more replies) 0 siblings, 14 replies; 22+ messages in thread From: Mark Walters @ 2013-10-29 22:55 UTC (permalink / raw) To: notmuch This is a more complete version of the move of pick/tree to mainline. The previous version was at id:1382257699-29860-1-git-send-email-markwalters1009@gmail.com The previous version did not get the autoloading right: it all worked on my setup as I had stale files around in my tree which were loaded. This versions builds and tests pass at each stage on a fresh clone. The diffstat at the bottom of this message is huge, so I include the rather more informative output from git diff -stat -M here. Apart from the first patch (which moves 80 lines from notmuch.el to notmuch-lib.el) the total is: emacs/Makefile.local | 1 + emacs/notmuch-lib.el | 1 + emacs/notmuch-show.el | 10 ++++ {contrib/notmuch-pick => emacs}/notmuch-tree.el | 47 ++----------------- emacs/notmuch.el | 16 +++++++ {contrib/notmuch-pick/test => test}/emacs-tree | 13 ----- test/notmuch-test | 1 + .../tree.expected-output/notmuch-tree-show-window | 0 .../notmuch-tree-single-thread | 0 .../tree.expected-output/notmuch-tree-tag-inbox | 0 .../notmuch-tree-tag-inbox-tagged | 0 .../notmuch-tree-tag-inbox-thread-tagged | 0 12 files changed, 34 insertions(+), 55 deletions(-) Obviously this clashes with the remap/help series at id:1382821479-23384-1-git-send-email-markwalters1009@gmail.com but rebasing either way would be easy. Best wishes Mark Mark Walters (11): emacs: move notmuch-help to lib emacs: tree: remove unneeded declarations emacs: move notmuch-tree from contrib to mainline emacs: add tree to the makefile test: move emacs-tree test into mainline emacs: tree: remove test for emacs from tree test emacs: minimal change to autoload notmuch-tree test: tree: remove require from tests emacs: move search based tree functions to notmuch.el emacs: add z to common keymap emacs: move the show entry to tree into show.el contrib/notmuch-pick/notmuch-tree.el | 951 -------------------- contrib/notmuch-pick/test/emacs-tree | 210 ----- .../tree.expected-output/notmuch-tree-show-window | 40 - .../notmuch-tree-single-thread | 6 - .../tree.expected-output/notmuch-tree-tag-inbox | 53 -- .../notmuch-tree-tag-inbox-tagged | 53 -- .../notmuch-tree-tag-inbox-thread-tagged | 53 -- emacs/Makefile.local | 1 + emacs/notmuch-lib.el | 88 ++ emacs/notmuch-show.el | 10 + emacs/notmuch-tree.el | 914 +++++++++++++++++++ emacs/notmuch.el | 103 +-- test/emacs-tree | 197 ++++ test/notmuch-test | 1 + test/tree.expected-output/notmuch-tree-show-window | 40 + .../notmuch-tree-single-thread | 6 + test/tree.expected-output/notmuch-tree-tag-inbox | 53 ++ .../notmuch-tree-tag-inbox-tagged | 53 ++ .../notmuch-tree-tag-inbox-thread-tagged | 53 ++ 19 files changed, 1432 insertions(+), 1453 deletions(-) delete mode 100644 contrib/notmuch-pick/notmuch-tree.el delete mode 100755 contrib/notmuch-pick/test/emacs-tree delete mode 100644 contrib/notmuch-pick/test/tree.expected-output/notmuch-tree-show-window delete mode 100644 contrib/notmuch-pick/test/tree.expected-output/notmuch-tree-single-thread delete mode 100644 contrib/notmuch-pick/test/tree.expected-output/notmuch-tree-tag-inbox delete mode 100644 contrib/notmuch-pick/test/tree.expected-output/notmuch-tree-tag-inbox-tagged delete mode 100644 contrib/notmuch-pick/test/tree.expected-output/notmuch-tree-tag-inbox-thread-tagged create mode 100644 emacs/notmuch-tree.el create mode 100755 test/emacs-tree create mode 100644 test/tree.expected-output/notmuch-tree-show-window create mode 100644 test/tree.expected-output/notmuch-tree-single-thread create mode 100644 test/tree.expected-output/notmuch-tree-tag-inbox create mode 100644 test/tree.expected-output/notmuch-tree-tag-inbox-tagged create mode 100644 test/tree.expected-output/notmuch-tree-tag-inbox-thread-tagged -- 1.7.9.1 ^ permalink raw reply [flat|nested] 22+ messages in thread
* [PATCH 01/11] emacs: move notmuch-help to lib 2013-10-29 22:55 [PATCH 00/11] Move notmuch-tree to mainline Mark Walters @ 2013-10-29 22:55 ` Mark Walters 2013-10-29 22:55 ` [PATCH 02/11] emacs: tree: remove unneeded declarations Mark Walters ` (12 subsequent siblings) 13 siblings, 0 replies; 22+ messages in thread From: Mark Walters @ 2013-10-29 22:55 UTC (permalink / raw) To: notmuch notmuch-help is in notmuch.el not notmuch-lib.el and this is incovenient for the way pick/tree uses it. I think lib makes more sense anyway so move it there. --- emacs/notmuch-lib.el | 87 ++++++++++++++++++++++++++++++++++++++++++++++++++ emacs/notmuch.el | 87 -------------------------------------------------- 2 files changed, 87 insertions(+), 87 deletions(-) diff --git a/emacs/notmuch-lib.el b/emacs/notmuch-lib.el index 6541282..e7c5c97 100644 --- a/emacs/notmuch-lib.el +++ b/emacs/notmuch-lib.el @@ -215,6 +215,93 @@ depending on the value of `notmuch-poll-script'." (interactive) (kill-buffer (current-buffer))) +(defun notmuch-documentation-first-line (symbol) + "Return the first line of the documentation string for SYMBOL." + (let ((doc (documentation symbol))) + (if doc + (with-temp-buffer + (insert (documentation symbol t)) + (goto-char (point-min)) + (let ((beg (point))) + (end-of-line) + (buffer-substring beg (point)))) + ""))) + +(defun notmuch-prefix-key-description (key) + "Given a prefix key code, return a human-readable string representation. + +This is basically just `format-kbd-macro' but we also convert ESC to M-." + (let ((desc (format-kbd-macro (vector key)))) + (if (string= desc "ESC") + "M-" + (concat desc " ")))) + +(defun notmuch-describe-keymap (keymap ua-keys &optional prefix tail) + "Return a list of strings, each describing one binding in KEYMAP. + +Each string gives a human-readable description of the key and a +one-line description of the bound function. See `notmuch-help' +for an overview of how this documentation is extracted. + +UA-KEYS should be a key sequence bound to `universal-argument'. +It will be used to describe bindings of commands that support a +prefix argument. PREFIX and TAIL are used internally." + (map-keymap + (lambda (key binding) + (cond ((mouse-event-p key) nil) + ((keymapp binding) + (setq tail + (notmuch-describe-keymap + binding ua-keys (notmuch-prefix-key-description key) tail))) + (t + (when (and ua-keys (symbolp binding) + (get binding 'notmuch-prefix-doc)) + ;; Documentation for prefixed command + (let ((ua-desc (key-description ua-keys))) + (push (concat ua-desc " " prefix (format-kbd-macro (vector key)) + "\t" (get binding 'notmuch-prefix-doc)) + tail))) + ;; Documentation for command + (push (concat prefix (format-kbd-macro (vector key)) "\t" + (or (and (symbolp binding) (get binding 'notmuch-doc)) + (notmuch-documentation-first-line binding))) + tail)))) + keymap) + tail) + +(defun notmuch-substitute-command-keys (doc) + "Like `substitute-command-keys' but with documentation, not function names." + (let ((beg 0)) + (while (string-match "\\\\{\\([^}[:space:]]*\\)}" doc beg) + (let* ((keymap-name (substring doc (match-beginning 1) (match-end 1))) + (keymap (symbol-value (intern keymap-name))) + (ua-keys (where-is-internal 'universal-argument keymap t)) + (desc-list (notmuch-describe-keymap keymap ua-keys)) + (desc (mapconcat #'identity desc-list "\n"))) + (setq doc (replace-match desc 1 1 doc))) + (setq beg (match-end 0))) + doc)) + +(defun notmuch-help () + "Display help for the current notmuch mode. + +This is similar to `describe-function' for the current major +mode, but bindings tables are shown with documentation strings +rather than command names. By default, this uses the first line +of each command's documentation string. A command can override +this by setting the 'notmuch-doc property of its command symbol. +A command that supports a prefix argument can explicitly document +its prefixed behavior by setting the 'notmuch-prefix-doc property +of its command symbol." + (interactive) + (let* ((mode major-mode) + (doc (substitute-command-keys (notmuch-substitute-command-keys (documentation mode t))))) + (with-current-buffer (generate-new-buffer "*notmuch-help*") + (insert doc) + (goto-char (point-min)) + (set-buffer-modified-p nil) + (view-buffer (current-buffer) 'kill-buffer-if-not-modified)))) + (defvar notmuch-buffer-refresh-function nil "Function to call to refresh the current buffer.") (make-variable-buffer-local 'notmuch-buffer-refresh-function) diff --git a/emacs/notmuch.el b/emacs/notmuch.el index d0cd906..19210cb 100644 --- a/emacs/notmuch.el +++ b/emacs/notmuch.el @@ -119,93 +119,6 @@ To enter a line break in customize, press \\[quoted-insert] C-j." (mm-save-part p)))) mm-handle)) -(defun notmuch-documentation-first-line (symbol) - "Return the first line of the documentation string for SYMBOL." - (let ((doc (documentation symbol))) - (if doc - (with-temp-buffer - (insert (documentation symbol t)) - (goto-char (point-min)) - (let ((beg (point))) - (end-of-line) - (buffer-substring beg (point)))) - ""))) - -(defun notmuch-prefix-key-description (key) - "Given a prefix key code, return a human-readable string representation. - -This is basically just `format-kbd-macro' but we also convert ESC to M-." - (let ((desc (format-kbd-macro (vector key)))) - (if (string= desc "ESC") - "M-" - (concat desc " ")))) - -(defun notmuch-describe-keymap (keymap ua-keys &optional prefix tail) - "Return a list of strings, each describing one binding in KEYMAP. - -Each string gives a human-readable description of the key and a -one-line description of the bound function. See `notmuch-help' -for an overview of how this documentation is extracted. - -UA-KEYS should be a key sequence bound to `universal-argument'. -It will be used to describe bindings of commands that support a -prefix argument. PREFIX and TAIL are used internally." - (map-keymap - (lambda (key binding) - (cond ((mouse-event-p key) nil) - ((keymapp binding) - (setq tail - (notmuch-describe-keymap - binding ua-keys (notmuch-prefix-key-description key) tail))) - (t - (when (and ua-keys (symbolp binding) - (get binding 'notmuch-prefix-doc)) - ;; Documentation for prefixed command - (let ((ua-desc (key-description ua-keys))) - (push (concat ua-desc " " prefix (format-kbd-macro (vector key)) - "\t" (get binding 'notmuch-prefix-doc)) - tail))) - ;; Documentation for command - (push (concat prefix (format-kbd-macro (vector key)) "\t" - (or (and (symbolp binding) (get binding 'notmuch-doc)) - (notmuch-documentation-first-line binding))) - tail)))) - keymap) - tail) - -(defun notmuch-substitute-command-keys (doc) - "Like `substitute-command-keys' but with documentation, not function names." - (let ((beg 0)) - (while (string-match "\\\\{\\([^}[:space:]]*\\)}" doc beg) - (let* ((keymap-name (substring doc (match-beginning 1) (match-end 1))) - (keymap (symbol-value (intern keymap-name))) - (ua-keys (where-is-internal 'universal-argument keymap t)) - (desc-list (notmuch-describe-keymap keymap ua-keys)) - (desc (mapconcat #'identity desc-list "\n"))) - (setq doc (replace-match desc 1 1 doc))) - (setq beg (match-end 0))) - doc)) - -(defun notmuch-help () - "Display help for the current notmuch mode. - -This is similar to `describe-function' for the current major -mode, but bindings tables are shown with documentation strings -rather than command names. By default, this uses the first line -of each command's documentation string. A command can override -this by setting the 'notmuch-doc property of its command symbol. -A command that supports a prefix argument can explicitly document -its prefixed behavior by setting the 'notmuch-prefix-doc property -of its command symbol." - (interactive) - (let* ((mode major-mode) - (doc (substitute-command-keys (notmuch-substitute-command-keys (documentation mode t))))) - (with-current-buffer (generate-new-buffer "*notmuch-help*") - (insert doc) - (goto-char (point-min)) - (set-buffer-modified-p nil) - (view-buffer (current-buffer) 'kill-buffer-if-not-modified)))) - (require 'hl-line) (defun notmuch-hl-line-mode () -- 1.7.9.1 ^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH 02/11] emacs: tree: remove unneeded declarations 2013-10-29 22:55 [PATCH 00/11] Move notmuch-tree to mainline Mark Walters 2013-10-29 22:55 ` [PATCH 01/11] emacs: move notmuch-help to lib Mark Walters @ 2013-10-29 22:55 ` Mark Walters 2013-10-29 22:55 ` [PATCH 03/11] emacs: move notmuch-tree from contrib to mainline Mark Walters ` (11 subsequent siblings) 13 siblings, 0 replies; 22+ messages in thread From: Mark Walters @ 2013-10-29 22:55 UTC (permalink / raw) To: notmuch There are some crufty declare-functions and requires in notmuch-tree: since it requires notmuch.el itself this all works but in preparation for the move to mainline tidy this up. --- contrib/notmuch-pick/notmuch-tree.el | 13 ++++--------- 1 files changed, 4 insertions(+), 9 deletions(-) diff --git a/contrib/notmuch-pick/notmuch-tree.el b/contrib/notmuch-pick/notmuch-tree.el index 512589f..d3330a0 100644 --- a/contrib/notmuch-pick/notmuch-tree.el +++ b/contrib/notmuch-pick/notmuch-tree.el @@ -27,20 +27,15 @@ (require 'notmuch-lib) (require 'notmuch-query) (require 'notmuch-show) +(require 'notmuch-tag) +(require 'notmuch-parser) (require 'notmuch) ;; XXX ATM, as notmuch-search-mode-map is defined here (eval-when-compile (require 'cl)) - +(declare-function notmuch-search "notmuch" (&optional query oldest-first target-thread target-line)) (declare-function notmuch-call-notmuch-process "notmuch" (&rest args)) -(declare-function notmuch-show "notmuch-show" (&rest args)) -(declare-function notmuch-tag "notmuch" (query &rest tags)) -(declare-function notmuch-show-strip-re "notmuch-show" (subject)) -(declare-function notmuch-show-spaces-n "notmuch-show" (n)) (declare-function notmuch-read-query "notmuch" (prompt)) -(declare-function notmuch-read-tag-changes "notmuch" (current-tags &optional prompt initial-input)) -(declare-function notmuch-update-tags "notmuch" (current-tags tag-changes)) -(declare-function notmuch-hello-trim "notmuch-hello" (search)) -(declare-function notmuch-search-find-thread-id "notmuch" ()) +(declare-function notmuch-search-find-thread-id "notmuch" (&optional bare)) (declare-function notmuch-search-find-subject "notmuch" ()) ;; the following variable is defined in notmuch.el -- 1.7.9.1 ^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH 03/11] emacs: move notmuch-tree from contrib to mainline 2013-10-29 22:55 [PATCH 00/11] Move notmuch-tree to mainline Mark Walters 2013-10-29 22:55 ` [PATCH 01/11] emacs: move notmuch-help to lib Mark Walters 2013-10-29 22:55 ` [PATCH 02/11] emacs: tree: remove unneeded declarations Mark Walters @ 2013-10-29 22:55 ` Mark Walters 2013-10-29 22:55 ` [PATCH 04/11] emacs: add tree to the makefile Mark Walters ` (10 subsequent siblings) 13 siblings, 0 replies; 22+ messages in thread From: Mark Walters @ 2013-10-29 22:55 UTC (permalink / raw) To: notmuch --- contrib/notmuch-pick/notmuch-tree.el | 946 ---------------------------------- emacs/notmuch-tree.el | 946 ++++++++++++++++++++++++++++++++++ 2 files changed, 946 insertions(+), 946 deletions(-) delete mode 100644 contrib/notmuch-pick/notmuch-tree.el create mode 100644 emacs/notmuch-tree.el diff --git a/contrib/notmuch-pick/notmuch-tree.el b/contrib/notmuch-pick/notmuch-tree.el deleted file mode 100644 index d3330a0..0000000 --- a/contrib/notmuch-pick/notmuch-tree.el +++ /dev/null @@ -1,946 +0,0 @@ -;; notmuch-tree.el --- displaying notmuch forests. -;; -;; Copyright © Carl Worth -;; Copyright © David Edmondson -;; Copyright © Mark Walters -;; -;; This file is part of Notmuch. -;; -;; Notmuch is free software: you can redistribute it and/or modify it -;; under the terms of the GNU General Public License as published by -;; the Free Software Foundation, either version 3 of the License, or -;; (at your option) any later version. -;; -;; Notmuch is distributed in the hope that it will be useful, but -;; WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -;; General Public License for more details. -;; -;; You should have received a copy of the GNU General Public License -;; along with Notmuch. If not, see <http://www.gnu.org/licenses/>. -;; -;; Authors: David Edmondson <dme@dme.org> -;; Mark Walters <markwalters1009@gmail.com> - -(require 'mail-parse) - -(require 'notmuch-lib) -(require 'notmuch-query) -(require 'notmuch-show) -(require 'notmuch-tag) -(require 'notmuch-parser) -(require 'notmuch) ;; XXX ATM, as notmuch-search-mode-map is defined here - -(eval-when-compile (require 'cl)) -(declare-function notmuch-search "notmuch" (&optional query oldest-first target-thread target-line)) -(declare-function notmuch-call-notmuch-process "notmuch" (&rest args)) -(declare-function notmuch-read-query "notmuch" (prompt)) -(declare-function notmuch-search-find-thread-id "notmuch" (&optional bare)) -(declare-function notmuch-search-find-subject "notmuch" ()) - -;; the following variable is defined in notmuch.el -(defvar notmuch-search-query-string) - -(defgroup notmuch-tree nil - "Showing message and thread structure." - :group 'notmuch) - -(defcustom notmuch-tree-show-out nil - "View selected messages in new window rather than split-pane." - :type 'boolean - :group 'notmuch-tree) - -(defcustom notmuch-tree-result-format - `(("date" . "%12s ") - ("authors" . "%-20s") - ((("tree" . "%s")("subject" . "%s")) ." %-54s ") - ("tags" . "(%s)")) - "Result formatting for Tree view. Supported fields are: date, - authors, subject, tree, tags. Tree means the thread tree - box graphics. The field may also be a list in which case - the formatting rules are applied recursively and then the - output of all the fields in the list is inserted - according to format-string. - -Note the author string should not contain - whitespace (put it in the neighbouring fields instead). - For example: - (setq notmuch-tree-result-format \(\(\"authors\" . \"%-40s\"\) - \(\"subject\" . \"%s\"\)\)\)" - :type '(alist :key-type (string) :value-type (string)) - :group 'notmuch-tree) - -;; Faces for messages that match the query. -(defface notmuch-tree-match-date-face - '((t :inherit default)) - "Face used in tree mode for the date in messages matching the query." - :group 'notmuch-tree - :group 'notmuch-faces) - -(defface notmuch-tree-match-author-face - '((((class color) - (background dark)) - (:foreground "OliveDrab1")) - (((class color) - (background light)) - (:foreground "dark blue")) - (t - (:bold t))) - "Face used in tree mode for the date in messages matching the query." - :group 'notmuch-tree - :group 'notmuch-faces) - -(defface notmuch-tree-match-subject-face - '((t :inherit default)) - "Face used in tree mode for the subject in messages matching the query." - :group 'notmuch-tree - :group 'notmuch-faces) - -(defface notmuch-tree-match-tree-face - '((t :inherit default)) - "Face used in tree mode for the thread tree block graphics in messages matching the query." - :group 'notmuch-tree - :group 'notmuch-faces) - -(defface notmuch-tree-match-tag-face - '((((class color) - (background dark)) - (:foreground "OliveDrab1")) - (((class color) - (background light)) - (:foreground "navy blue" :bold t)) - (t - (:bold t))) - "Face used in tree mode for tags in messages matching the query." - :group 'notmuch-tree - :group 'notmuch-faces) - -;; Faces for messages that do not match the query. -(defface notmuch-tree-no-match-date-face - '((t (:foreground "gray"))) - "Face used in tree mode for non-matching dates." - :group 'notmuch-tree - :group 'notmuch-faces) - -(defface notmuch-tree-no-match-subject-face - '((t (:foreground "gray"))) - "Face used in tree mode for non-matching subjects." - :group 'notmuch-tree - :group 'notmuch-faces) - -(defface notmuch-tree-no-match-tree-face - '((t (:foreground "gray"))) - "Face used in tree mode for the thread tree block graphics in messages matching the query." - :group 'notmuch-tree - :group 'notmuch-faces) - -(defface notmuch-tree-no-match-author-face - '((t (:foreground "gray"))) - "Face used in tree mode for the date in messages matching the query." - :group 'notmuch-tree - :group 'notmuch-faces) - -(defface notmuch-tree-no-match-tag-face - '((t (:foreground "gray"))) - "Face used in tree mode face for non-matching tags." - :group 'notmuch-tree - :group 'notmuch-faces) - -(defvar notmuch-tree-previous-subject - "The subject of the most recent result shown during the async display") -(make-variable-buffer-local 'notmuch-tree-previous-subject) - -(defvar notmuch-tree-basic-query nil - "A buffer local copy of argument query to the function notmuch-tree") -(make-variable-buffer-local 'notmuch-tree-basic-query) - -(defvar notmuch-tree-query-context nil - "A buffer local copy of argument query-context to the function notmuch-tree") -(make-variable-buffer-local 'notmuch-tree-query-context) - -(defvar notmuch-tree-target-msg nil - "A buffer local copy of argument target to the function notmuch-tree") -(make-variable-buffer-local 'notmuch-tree-target-msg) - -(defvar notmuch-tree-open-target nil - "A buffer local copy of argument open-target to the function notmuch-tree") -(make-variable-buffer-local 'notmuch-tree-open-target) - -(defvar notmuch-tree-message-window nil - "The window of the message pane. - -It is set in both the tree buffer and the child show buffer. It -is used to try and close the message pane when quitting tree view -or the child show buffer.") -(make-variable-buffer-local 'notmuch-tree-message-window) -(put 'notmuch-tree-message-window 'permanent-local t) - -(defvar notmuch-tree-message-buffer nil - "The buffer name of the show buffer in the message pane. - -This is used to try and make sure we don't close the message pane -if the user has loaded a different buffer in that window.") -(make-variable-buffer-local 'notmuch-tree-message-buffer) -(put 'notmuch-tree-message-buffer 'permanent-local t) - -(defun notmuch-tree-to-message-pane (func) - "Execute FUNC in message pane. - -This function returns a function (so can be used as a keybinding) -which executes function FUNC in the message pane if it is -open (if the message pane is closed it does nothing)." - `(lambda () - ,(concat "(In message pane) " (documentation func t)) - (interactive) - (when (window-live-p notmuch-tree-message-window) - (with-selected-window notmuch-tree-message-window - (call-interactively #',func))))) - -(defun notmuch-tree-button-activate (&optional button) - "Activate BUTTON or button at point - -This function does not give an error if there is no button." - (interactive) - (let ((button (or button (button-at (point))))) - (when button (button-activate button)))) - -(defun notmuch-tree-close-message-pane-and (func) - "Close message pane and execute FUNC. - -This function returns a function (so can be used as a keybinding) -which closes the message pane if open and then executes function -FUNC." - `(lambda () - ,(concat "(Close message pane and) " (documentation func t)) - (interactive) - (notmuch-tree-close-message-window) - (call-interactively #',func))) - -(defvar notmuch-tree-mode-map - (let ((map (make-sparse-keymap))) - (set-keymap-parent map notmuch-common-keymap) - ;; The following override the global keymap. - ;; Override because we want to close message pane first. - (define-key map "?" (notmuch-tree-close-message-pane-and #'notmuch-help)) - ;; Override because we first close message pane and then close tree buffer. - (define-key map "q" 'notmuch-tree-quit) - ;; Override because we close message pane after the search query is entered. - (define-key map "s" 'notmuch-tree-to-search) - ;; Override because we want to close message pane first. - (define-key map "m" (notmuch-tree-close-message-pane-and #'notmuch-mua-new-mail)) - - ;; these use notmuch-show functions directly - (define-key map "|" 'notmuch-show-pipe-message) - (define-key map "w" 'notmuch-show-save-attachments) - (define-key map "v" 'notmuch-show-view-all-mime-parts) - (define-key map "c" 'notmuch-show-stash-map) - - ;; these apply to the message pane - (define-key map (kbd "M-TAB") (notmuch-tree-to-message-pane #'notmuch-show-previous-button)) - (define-key map (kbd "<backtab>") (notmuch-tree-to-message-pane #'notmuch-show-previous-button)) - (define-key map (kbd "TAB") (notmuch-tree-to-message-pane #'notmuch-show-next-button)) - (define-key map "e" (notmuch-tree-to-message-pane #'notmuch-tree-button-activate)) - - ;; bindings from show (or elsewhere) but we close the message pane first. - (define-key map "f" (notmuch-tree-close-message-pane-and #'notmuch-show-forward-message)) - (define-key map "r" (notmuch-tree-close-message-pane-and #'notmuch-show-reply-sender)) - (define-key map "R" (notmuch-tree-close-message-pane-and #'notmuch-show-reply)) - (define-key map "V" (notmuch-tree-close-message-pane-and #'notmuch-show-view-raw-message)) - - ;; The main tree view bindings - (define-key map (kbd "RET") 'notmuch-tree-show-message) - (define-key map [mouse-1] 'notmuch-tree-show-message) - (define-key map "x" 'notmuch-tree-quit) - (define-key map "A" 'notmuch-tree-archive-thread) - (define-key map "a" 'notmuch-tree-archive-message-then-next) - (define-key map "=" 'notmuch-tree-refresh-view) - (define-key map "z" 'notmuch-tree-to-tree) - (define-key map "n" 'notmuch-tree-next-matching-message) - (define-key map "p" 'notmuch-tree-prev-matching-message) - (define-key map "N" 'notmuch-tree-next-message) - (define-key map "P" 'notmuch-tree-prev-message) - (define-key map (kbd "M-p") 'notmuch-tree-prev-thread) - (define-key map (kbd "M-n") 'notmuch-tree-next-thread) - (define-key map "-" 'notmuch-tree-remove-tag) - (define-key map "+" 'notmuch-tree-add-tag) - (define-key map "*" 'notmuch-tree-tag-thread) - (define-key map " " 'notmuch-tree-scroll-or-next) - (define-key map "b" 'notmuch-tree-scroll-message-window-back) - map)) -(fset 'notmuch-tree-mode-map notmuch-tree-mode-map) - -(defun notmuch-tree-get-message-properties () - "Return the properties of the current message as a plist. - -Some useful entries are: -:headers - Property list containing the headers :Date, :Subject, :From, etc. -:tags - Tags for this message" - (save-excursion - (beginning-of-line) - (get-text-property (point) :notmuch-message-properties))) - -;; XXX This should really be a lib function but we are trying to -;; reduce impact on the code base. -(defun notmuch-show-get-prop (prop &optional props) - "This is a tree view overridden version of notmuch-show-get-prop - -It gets property PROP from PROPS or, if PROPS is nil, the current -message in either tree or show. This means that several functions -in notmuch-show now work unchanged in tree as they just need the -correct message properties." - (let ((props (or props - (cond ((eq major-mode 'notmuch-show-mode) - (notmuch-show-get-message-properties)) - ((eq major-mode 'notmuch-tree-mode) - (notmuch-tree-get-message-properties)))))) - (plist-get props prop))) - -(defun notmuch-tree-set-message-properties (props) - (save-excursion - (beginning-of-line) - (put-text-property (point) (+ (point) 1) :notmuch-message-properties props))) - -(defun notmuch-tree-set-prop (prop val &optional props) - (let ((inhibit-read-only t) - (props (or props - (notmuch-tree-get-message-properties)))) - (plist-put props prop val) - (notmuch-tree-set-message-properties props))) - -(defun notmuch-tree-get-prop (prop &optional props) - (let ((props (or props - (notmuch-tree-get-message-properties)))) - (plist-get props prop))) - -(defun notmuch-tree-set-tags (tags) - "Set the tags of the current message." - (notmuch-tree-set-prop :tags tags)) - -(defun notmuch-tree-get-tags () - "Return the tags of the current message." - (notmuch-tree-get-prop :tags)) - -(defun notmuch-tree-get-message-id () - "Return the message id of the current message." - (let ((id (notmuch-tree-get-prop :id))) - (if id - (notmuch-id-to-query id) - nil))) - -(defun notmuch-tree-get-match () - "Return whether the current message is a match." - (interactive) - (notmuch-tree-get-prop :match)) - -(defun notmuch-tree-refresh-result () - "Redisplay the current message line. - -This redisplays the current line based on the messages -properties (as they are now). This is used when tags are -updated." - (let ((init-point (point)) - (end (line-end-position)) - (msg (notmuch-tree-get-message-properties)) - (inhibit-read-only t)) - (beginning-of-line) - ;; This is a little tricky: we override - ;; notmuch-tree-previous-subject to get the decision between - ;; ... and a subject right and it stops notmuch-tree-insert-msg - ;; from overwriting the buffer local copy of - ;; notmuch-tree-previous-subject if this is called while the - ;; buffer is displaying. - (let ((notmuch-tree-previous-subject (notmuch-tree-get-prop :previous-subject))) - (delete-region (point) (1+ (line-end-position))) - (notmuch-tree-insert-msg msg)) - (let ((new-end (line-end-position))) - (goto-char (if (= init-point end) - new-end - (min init-point (- new-end 1))))))) - -(defun notmuch-tree-tag-update-display (&optional tag-changes) - "Update display for TAG-CHANGES to current message. - -Does NOT change the database." - (let* ((current-tags (notmuch-tree-get-tags)) - (new-tags (notmuch-update-tags current-tags tag-changes))) - (unless (equal current-tags new-tags) - (notmuch-tree-set-tags new-tags) - (notmuch-tree-refresh-result)))) - -(defun notmuch-tree-tag (tag-changes) - "Change tags for the current message" - (interactive - (list (notmuch-read-tag-changes (notmuch-tree-get-tags) "Tag message"))) - (notmuch-tag (notmuch-tree-get-message-id) tag-changes) - (notmuch-tree-tag-update-display tag-changes)) - -(defun notmuch-tree-add-tag (tag-changes) - "Same as `notmuch-tree-tag' but sets initial input to '+'." - (interactive - (list (notmuch-read-tag-changes (notmuch-tree-get-tags) "Tag message" "+"))) - (notmuch-tree-tag tag-changes)) - -(defun notmuch-tree-remove-tag (tag-changes) - "Same as `notmuch-tree-tag' but sets initial input to '-'." - (interactive - (list (notmuch-read-tag-changes (notmuch-tree-get-tags) "Tag message" "-"))) - (notmuch-tree-tag tag-changes)) - -;; The next two functions close the message window before calling -;; notmuch-search or notmuch-tree but they do so after the user has -;; entered the query (in case the user was basing the query on -;; something in the message window). - -(defun notmuch-tree-to-search () - "Run \"notmuch search\" with the given `query' and display results." - (interactive) - (let ((query (notmuch-read-query "Notmuch search: "))) - (notmuch-tree-close-message-window) - (notmuch-search query))) - -(defun notmuch-tree-to-tree () - "Run a query and display results in Tree view" - (interactive) - (let ((query (notmuch-read-query "Notmuch tree view search: "))) - (notmuch-tree-close-message-window) - (notmuch-tree query))) - -;; This function should be in notmuch-show.el but be we trying to -;; minimise impact on the rest of the codebase. -(defun notmuch-tree-from-show-current-query () - "Call notmuch tree with the current query" - (interactive) - (notmuch-tree notmuch-show-thread-id - notmuch-show-query-context - (notmuch-show-get-message-id))) - -;; This function should be in notmuch.el but be we trying to minimise -;; impact on the rest of the codebase. -(defun notmuch-tree-from-search-current-query () - "Call notmuch tree with the current query" - (interactive) - (notmuch-tree notmuch-search-query-string)) - -;; This function should be in notmuch.el but be we trying to minimise -;; impact on the rest of the codebase. -(defun notmuch-tree-from-search-thread () - "Show the selected thread with notmuch-tree" - (interactive) - (notmuch-tree (notmuch-search-find-thread-id) - notmuch-search-query-string - nil - (notmuch-prettify-subject (notmuch-search-find-subject)) - t)) - -(defun notmuch-tree-message-window-kill-hook () - "Close the message pane when exiting the show buffer." - (let ((buffer (current-buffer))) - (when (and (window-live-p notmuch-tree-message-window) - (eq (window-buffer notmuch-tree-message-window) buffer)) - ;; We do not want an error if this is the sole window in the - ;; frame and I do not know how to test for that in emacs pre - ;; 24. Hence we just ignore-errors. - (ignore-errors - (delete-window notmuch-tree-message-window))))) - -(defun notmuch-tree-show-message-in () - "Show the current message (in split-pane)." - (interactive) - (let ((id (notmuch-tree-get-message-id)) - (inhibit-read-only t) - buffer) - (when id - ;; We close and reopen the window to kill off un-needed buffers - ;; this might cause flickering but seems ok. - (notmuch-tree-close-message-window) - (setq notmuch-tree-message-window - (split-window-vertically (/ (window-height) 4))) - (with-selected-window notmuch-tree-message-window - ;; Since we are only displaying one message do not indent. - (let ((notmuch-show-indent-messages-width 0) - (notmuch-show-only-matching-messages t)) - (setq buffer (notmuch-show id)))) - ;; We need the `let' as notmuch-tree-message-window is buffer local. - (let ((window notmuch-tree-message-window)) - (with-current-buffer buffer - (setq notmuch-tree-message-window window) - (add-hook 'kill-buffer-hook 'notmuch-tree-message-window-kill-hook))) - (when notmuch-show-mark-read-tags - (notmuch-tree-tag-update-display notmuch-show-mark-read-tags)) - (setq notmuch-tree-message-buffer buffer)))) - -(defun notmuch-tree-show-message-out () - "Show the current message (in whole window)." - (interactive) - (let ((id (notmuch-tree-get-message-id)) - (inhibit-read-only t) - buffer) - (when id - ;; We close the window to kill off un-needed buffers. - (notmuch-tree-close-message-window) - (notmuch-show id)))) - -(defun notmuch-tree-show-message (arg) - "Show the current message. - -Shows in split pane or whole window according to value of -`notmuch-tree-show-out'. A prefix argument reverses the choice." - (interactive "P") - (if (or (and notmuch-tree-show-out (not arg)) - (and (not notmuch-tree-show-out) arg)) - (notmuch-tree-show-message-out) - (notmuch-tree-show-message-in))) - -(defun notmuch-tree-scroll-message-window () - "Scroll the message window (if it exists)" - (interactive) - (when (window-live-p notmuch-tree-message-window) - (with-selected-window notmuch-tree-message-window - (if (pos-visible-in-window-p (point-max)) - t - (scroll-up))))) - -(defun notmuch-tree-scroll-message-window-back () - "Scroll the message window back(if it exists)" - (interactive) - (when (window-live-p notmuch-tree-message-window) - (with-selected-window notmuch-tree-message-window - (if (pos-visible-in-window-p (point-min)) - t - (scroll-down))))) - -(defun notmuch-tree-scroll-or-next () - "Scroll the message window. If it at end go to next message." - (interactive) - (when (notmuch-tree-scroll-message-window) - (notmuch-tree-next-matching-message))) - -(defun notmuch-tree-quit () - "Close the split view or exit tree." - (interactive) - (unless (notmuch-tree-close-message-window) - (kill-buffer (current-buffer)))) - -(defun notmuch-tree-close-message-window () - "Close the message-window. Return t if close succeeds." - (interactive) - (when (and (window-live-p notmuch-tree-message-window) - (eq (window-buffer notmuch-tree-message-window) notmuch-tree-message-buffer)) - (delete-window notmuch-tree-message-window) - (unless (get-buffer-window-list notmuch-tree-message-buffer) - (kill-buffer notmuch-tree-message-buffer)) - t)) - -(defun notmuch-tree-archive-message (&optional unarchive) - "Archive the current message. - -Archive the current message by applying the tag changes in -`notmuch-archive-tags' to it. If a prefix argument is given, the -message will be \"unarchived\", i.e. the tag changes in -`notmuch-archive-tags' will be reversed." - (interactive "P") - (when notmuch-archive-tags - (notmuch-tree-tag (notmuch-tag-change-list notmuch-archive-tags unarchive)))) - -(defun notmuch-tree-archive-message-then-next (&optional unarchive) - "Archive the current message and move to next matching message." - (interactive "P") - (notmuch-tree-archive-message unarchive) - (notmuch-tree-next-matching-message)) - -(defun notmuch-tree-next-message () - "Move to next message." - (interactive) - (forward-line) - (when (window-live-p notmuch-tree-message-window) - (notmuch-tree-show-message-in))) - -(defun notmuch-tree-prev-message () - "Move to previous message." - (interactive) - (forward-line -1) - (when (window-live-p notmuch-tree-message-window) - (notmuch-tree-show-message-in))) - -(defun notmuch-tree-prev-matching-message () - "Move to previous matching message." - (interactive) - (forward-line -1) - (while (and (not (bobp)) (not (notmuch-tree-get-match))) - (forward-line -1)) - (when (window-live-p notmuch-tree-message-window) - (notmuch-tree-show-message-in))) - -(defun notmuch-tree-next-matching-message () - "Move to next matching message." - (interactive) - (forward-line) - (while (and (not (eobp)) (not (notmuch-tree-get-match))) - (forward-line)) - (when (window-live-p notmuch-tree-message-window) - (notmuch-tree-show-message-in))) - -(defun notmuch-tree-refresh-view () - "Refresh view." - (interactive) - (let ((inhibit-read-only t) - (basic-query notmuch-tree-basic-query) - (query-context notmuch-tree-query-context) - (target (notmuch-tree-get-message-id))) - (erase-buffer) - (notmuch-tree-worker basic-query - query-context - target))) - -(defun notmuch-tree-thread-top () - (when (notmuch-tree-get-message-properties) - (while (not (or (notmuch-tree-get-prop :first) (eobp))) - (forward-line -1)))) - -(defun notmuch-tree-prev-thread () - (interactive) - (forward-line -1) - (notmuch-tree-thread-top)) - -(defun notmuch-tree-next-thread () - (interactive) - (forward-line 1) - (while (not (or (notmuch-tree-get-prop :first) (eobp))) - (forward-line 1))) - -(defun notmuch-tree-thread-mapcar (function) - "Iterate through all messages in the current thread - and call FUNCTION for side effects." - (save-excursion - (notmuch-tree-thread-top) - (loop collect (funcall function) - do (forward-line) - while (and (notmuch-tree-get-message-properties) - (not (notmuch-tree-get-prop :first)))))) - -(defun notmuch-tree-get-messages-ids-thread-search () - "Return a search string for all message ids of messages in the current thread." - (mapconcat 'identity - (notmuch-tree-thread-mapcar 'notmuch-tree-get-message-id) - " or ")) - -(defun notmuch-tree-tag-thread (tag-changes) - "Tag all messages in the current thread" - (interactive - (let ((tags (apply #'append (notmuch-tree-thread-mapcar - (lambda () (notmuch-tree-get-tags)))))) - (list (notmuch-read-tag-changes tags "Tag thread")))) - (when (notmuch-tree-get-message-properties) - (notmuch-tag (notmuch-tree-get-messages-ids-thread-search) tag-changes) - (notmuch-tree-thread-mapcar - (lambda () (notmuch-tree-tag-update-display tag-changes))))) - -(defun notmuch-tree-archive-thread (&optional unarchive) - "Archive each message in thread. - -Archive each message currently shown by applying the tag changes -in `notmuch-archive-tags' to each. If a prefix argument is given, -the messages will be \"unarchived\", i.e. the tag changes in -`notmuch-archive-tags' will be reversed. - -Note: This command is safe from any race condition of new messages -being delivered to the same thread. It does not archive the -entire thread, but only the messages shown in the current -buffer." - (interactive "P") - (when notmuch-archive-tags - (notmuch-tree-tag-thread - (notmuch-tag-change-list notmuch-archive-tags unarchive)))) - -;; Functions below here display the tree buffer itself. - -(defun notmuch-tree-clean-address (address) - "Try to clean a single email ADDRESS for display. Return -AUTHOR_NAME if present, otherwise return AUTHOR_EMAIL. Return -unchanged ADDRESS if parsing fails." - (let* ((clean-address (notmuch-clean-address address)) - (p-address (car clean-address)) - (p-name (cdr clean-address))) - - ;; If we have a name return that otherwise return the address. - (or p-name p-address))) - -(defun notmuch-tree-format-field (field format-string msg) - "Format a FIELD of MSG according to FORMAT-STRING and return string" - (let* ((headers (plist-get msg :headers)) - (match (plist-get msg :match))) - (cond - ((listp field) - (format format-string (notmuch-tree-format-field-list field msg))) - - ((string-equal field "date") - (let ((face (if match - 'notmuch-tree-match-date-face - 'notmuch-tree-no-match-date-face))) - (propertize (format format-string (plist-get msg :date_relative)) 'face face))) - - ((string-equal field "tree") - (let ((tree-status (plist-get msg :tree-status)) - (face (if match - 'notmuch-tree-match-tree-face - 'notmuch-tree-no-match-tree-face))) - - (propertize (format format-string - (mapconcat #'identity (reverse tree-status) "")) - 'face face))) - - ((string-equal field "subject") - (let ((bare-subject (notmuch-show-strip-re (plist-get headers :Subject))) - (previous-subject notmuch-tree-previous-subject) - (face (if match - 'notmuch-tree-match-subject-face - 'notmuch-tree-no-match-subject-face))) - - (setq notmuch-tree-previous-subject bare-subject) - (propertize (format format-string - (if (string= previous-subject bare-subject) - " ..." - bare-subject)) - 'face face))) - - ((string-equal field "authors") - (let ((author (notmuch-tree-clean-address (plist-get headers :From))) - (len (length (format format-string ""))) - (face (if match - 'notmuch-tree-match-author-face - 'notmuch-tree-no-match-author-face))) - (when (> (length author) len) - (setq author (substring author 0 len))) - (propertize (format format-string author) 'face face))) - - ((string-equal field "tags") - (let ((tags (plist-get msg :tags)) - (face (if match - 'notmuch-tree-match-tag-face - 'notmuch-tree-no-match-tag-face))) - (propertize (format format-string - (mapconcat #'identity tags ", ")) - 'face face)))))) - - -(defun notmuch-tree-format-field-list (field-list msg) - "Format fields of MSG according to FIELD-LIST and return string" - (let (result-string) - (dolist (spec field-list result-string) - (let ((field-string (notmuch-tree-format-field (car spec) (cdr spec) msg))) - (setq result-string (concat result-string field-string)))))) - -(defun notmuch-tree-insert-msg (msg) - "Insert the message MSG according to notmuch-tree-result-format" - ;; We need to save the previous subject as it will get overwritten - ;; by the insert-field calls. - (let ((previous-subject notmuch-tree-previous-subject)) - (insert (notmuch-tree-format-field-list notmuch-tree-result-format msg)) - (notmuch-tree-set-message-properties msg) - (notmuch-tree-set-prop :previous-subject previous-subject) - (insert "\n"))) - -(defun notmuch-tree-goto-and-insert-msg (msg) - "Insert msg at the end of the buffer. Move point to msg if it is the target" - (save-excursion - (goto-char (point-max)) - (notmuch-tree-insert-msg msg)) - (let ((msg-id (notmuch-id-to-query (plist-get msg :id))) - (target notmuch-tree-target-msg)) - (when (or (and (not target) (plist-get msg :match)) - (string= msg-id target)) - (setq notmuch-tree-target-msg "found") - (goto-char (point-max)) - (forward-line -1) - (when notmuch-tree-open-target - (notmuch-tree-show-message-in))))) - -(defun notmuch-tree-insert-tree (tree depth tree-status first last) - "Insert the message tree TREE at depth DEPTH in the current thread. - -A message tree is another name for a single sub-thread: i.e., a -message together with all its descendents." - (let ((msg (car tree)) - (replies (cadr tree))) - - (cond - ((and (< 0 depth) (not last)) - (push "├" tree-status)) - ((and (< 0 depth) last) - (push "╰" tree-status)) - ((and (eq 0 depth) first last) -;; (push "─" tree-status)) choice between this and next line is matter of taste. - (push " " tree-status)) - ((and (eq 0 depth) first (not last)) - (push "┬" tree-status)) - ((and (eq 0 depth) (not first) last) - (push "╰" tree-status)) - ((and (eq 0 depth) (not first) (not last)) - (push "├" tree-status))) - - (push (concat (if replies "┬" "─") "►") tree-status) - (plist-put msg :first (and first (eq 0 depth))) - (notmuch-tree-goto-and-insert-msg (plist-put msg :tree-status tree-status)) - (pop tree-status) - (pop tree-status) - - (if last - (push " " tree-status) - (push "│" tree-status)) - - (notmuch-tree-insert-thread replies (1+ depth) tree-status))) - -(defun notmuch-tree-insert-thread (thread depth tree-status) - "Insert the collection of sibling sub-threads THREAD at depth DEPTH in the current forest." - (let ((n (length thread))) - (loop for tree in thread - for count from 1 to n - - do (notmuch-tree-insert-tree tree depth tree-status (eq count 1) (eq count n))))) - -(defun notmuch-tree-insert-forest-thread (forest-thread) - "Insert a single complete thread." - (let (tree-status) - ;; Reset at the start of each main thread. - (setq notmuch-tree-previous-subject nil) - (notmuch-tree-insert-thread forest-thread 0 tree-status))) - -(defun notmuch-tree-insert-forest (forest) - "Insert a forest of threads. - -This function inserts a collection of several complete threads as -passed to it by notmuch-tree-process-filter." - (mapc 'notmuch-tree-insert-forest-thread forest)) - -(defun notmuch-tree-mode () - "Major mode displaying messages (as opposed to threads) of of a notmuch search. - -This buffer contains the results of a \"notmuch tree\" of your -email archives. Each line in the buffer represents a single -message giving the relative date, the author, subject, and any -tags. - -Pressing \\[notmuch-tree-show-message] on any line displays that message. - -Complete list of currently available key bindings: - -\\{notmuch-tree-mode-map}" - - (interactive) - (kill-all-local-variables) - (setq notmuch-buffer-refresh-function #'notmuch-tree-refresh-view) - (use-local-map notmuch-tree-mode-map) - (setq major-mode 'notmuch-tree-mode - mode-name "notmuch-tree") - (hl-line-mode 1) - (setq buffer-read-only t - truncate-lines t)) - -(defun notmuch-tree-process-sentinel (proc msg) - "Add a message to let user know when \"notmuch tree\" exits" - (let ((buffer (process-buffer proc)) - (status (process-status proc)) - (exit-status (process-exit-status proc)) - (never-found-target-thread nil)) - (when (memq status '(exit signal)) - (kill-buffer (process-get proc 'parse-buf)) - (if (buffer-live-p buffer) - (with-current-buffer buffer - (save-excursion - (let ((inhibit-read-only t) - (atbob (bobp))) - (goto-char (point-max)) - (if (eq status 'signal) - (insert "Incomplete search results (tree view process was killed).\n")) - (when (eq status 'exit) - (insert "End of search results.") - (unless (= exit-status 0) - (insert (format " (process returned %d)" exit-status))) - (insert "\n"))))))))) - -(defun notmuch-tree-process-filter (proc string) - "Process and filter the output of \"notmuch show\" for tree view" - (let ((results-buf (process-buffer proc)) - (parse-buf (process-get proc 'parse-buf)) - (inhibit-read-only t) - done) - (if (not (buffer-live-p results-buf)) - (delete-process proc) - (with-current-buffer parse-buf - ;; Insert new data - (save-excursion - (goto-char (point-max)) - (insert string)) - (notmuch-sexp-parse-partial-list 'notmuch-tree-insert-forest-thread - results-buf))))) - -(defun notmuch-tree-worker (basic-query &optional query-context target open-target) - "Insert the tree view of the search in the current buffer. - -This is is a helper function for notmuch-tree. The arguments are -the same as for the function notmuch-tree." - (interactive) - (notmuch-tree-mode) - (setq notmuch-tree-basic-query basic-query) - (setq notmuch-tree-query-context query-context) - (setq notmuch-tree-target-msg target) - (setq notmuch-tree-open-target open-target) - - (erase-buffer) - (goto-char (point-min)) - (let* ((search-args (concat basic-query - (if query-context (concat " and (" query-context ")")) - )) - (message-arg "--entire-thread")) - (if (equal (car (process-lines notmuch-command "count" search-args)) "0") - (setq search-args basic-query)) - (let ((proc (notmuch-start-notmuch - "notmuch-tree" (current-buffer) #'notmuch-tree-process-sentinel - "show" "--body=false" "--format=sexp" - message-arg search-args)) - ;; Use a scratch buffer to accumulate partial output. - ;; This buffer will be killed by the sentinel, which - ;; should be called no matter how the process dies. - (parse-buf (generate-new-buffer " *notmuch tree parse*"))) - (process-put proc 'parse-buf parse-buf) - (set-process-filter proc 'notmuch-tree-process-filter) - (set-process-query-on-exit-flag proc nil)))) - -(defun notmuch-tree (&optional query query-context target buffer-name open-target) - "Display threads matching QUERY in Tree View. - -The arguments are: - QUERY: the main query. This can be any query but in many cases will be - a single thread. If nil this is read interactively from the minibuffer. - QUERY-CONTEXT: is an additional term for the query. The query used - is QUERY and QUERY-CONTEXT unless that does not match any messages - in which case we fall back to just QUERY. - TARGET: A message ID (with the id: prefix) that will be made - current if it appears in the tree view results. - BUFFER-NAME: the name of the buffer to display the tree view. If - it is nil \"*notmuch-tree\" followed by QUERY is used. - OPEN-TARGET: If TRUE open the target message in the message pane." - (interactive) - (if (null query) - (setq query (notmuch-read-query "Notmuch tree view search: "))) - (let ((buffer (get-buffer-create (generate-new-buffer-name - (or buffer-name - (concat "*notmuch-tree-" query "*"))))) - (inhibit-read-only t)) - - (switch-to-buffer buffer)) - ;; Don't track undo information for this buffer - (set 'buffer-undo-list t) - - (notmuch-tree-worker query query-context target open-target) - - (setq truncate-lines t)) - - -;; Set up key bindings from the rest of notmuch. -(define-key notmuch-common-keymap "z" 'notmuch-tree) -(define-key notmuch-search-mode-map "Z" 'notmuch-tree-from-search-current-query) -(define-key notmuch-show-mode-map "Z" 'notmuch-tree-from-show-current-query) -(message "Initialised notmuch-tree") - -(provide 'notmuch-tree) diff --git a/emacs/notmuch-tree.el b/emacs/notmuch-tree.el new file mode 100644 index 0000000..d3330a0 --- /dev/null +++ b/emacs/notmuch-tree.el @@ -0,0 +1,946 @@ +;; notmuch-tree.el --- displaying notmuch forests. +;; +;; Copyright © Carl Worth +;; Copyright © David Edmondson +;; Copyright © Mark Walters +;; +;; This file is part of Notmuch. +;; +;; Notmuch is free software: you can redistribute it and/or modify it +;; under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. +;; +;; Notmuch is distributed in the hope that it will be useful, but +;; WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +;; General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with Notmuch. If not, see <http://www.gnu.org/licenses/>. +;; +;; Authors: David Edmondson <dme@dme.org> +;; Mark Walters <markwalters1009@gmail.com> + +(require 'mail-parse) + +(require 'notmuch-lib) +(require 'notmuch-query) +(require 'notmuch-show) +(require 'notmuch-tag) +(require 'notmuch-parser) +(require 'notmuch) ;; XXX ATM, as notmuch-search-mode-map is defined here + +(eval-when-compile (require 'cl)) +(declare-function notmuch-search "notmuch" (&optional query oldest-first target-thread target-line)) +(declare-function notmuch-call-notmuch-process "notmuch" (&rest args)) +(declare-function notmuch-read-query "notmuch" (prompt)) +(declare-function notmuch-search-find-thread-id "notmuch" (&optional bare)) +(declare-function notmuch-search-find-subject "notmuch" ()) + +;; the following variable is defined in notmuch.el +(defvar notmuch-search-query-string) + +(defgroup notmuch-tree nil + "Showing message and thread structure." + :group 'notmuch) + +(defcustom notmuch-tree-show-out nil + "View selected messages in new window rather than split-pane." + :type 'boolean + :group 'notmuch-tree) + +(defcustom notmuch-tree-result-format + `(("date" . "%12s ") + ("authors" . "%-20s") + ((("tree" . "%s")("subject" . "%s")) ." %-54s ") + ("tags" . "(%s)")) + "Result formatting for Tree view. Supported fields are: date, + authors, subject, tree, tags. Tree means the thread tree + box graphics. The field may also be a list in which case + the formatting rules are applied recursively and then the + output of all the fields in the list is inserted + according to format-string. + +Note the author string should not contain + whitespace (put it in the neighbouring fields instead). + For example: + (setq notmuch-tree-result-format \(\(\"authors\" . \"%-40s\"\) + \(\"subject\" . \"%s\"\)\)\)" + :type '(alist :key-type (string) :value-type (string)) + :group 'notmuch-tree) + +;; Faces for messages that match the query. +(defface notmuch-tree-match-date-face + '((t :inherit default)) + "Face used in tree mode for the date in messages matching the query." + :group 'notmuch-tree + :group 'notmuch-faces) + +(defface notmuch-tree-match-author-face + '((((class color) + (background dark)) + (:foreground "OliveDrab1")) + (((class color) + (background light)) + (:foreground "dark blue")) + (t + (:bold t))) + "Face used in tree mode for the date in messages matching the query." + :group 'notmuch-tree + :group 'notmuch-faces) + +(defface notmuch-tree-match-subject-face + '((t :inherit default)) + "Face used in tree mode for the subject in messages matching the query." + :group 'notmuch-tree + :group 'notmuch-faces) + +(defface notmuch-tree-match-tree-face + '((t :inherit default)) + "Face used in tree mode for the thread tree block graphics in messages matching the query." + :group 'notmuch-tree + :group 'notmuch-faces) + +(defface notmuch-tree-match-tag-face + '((((class color) + (background dark)) + (:foreground "OliveDrab1")) + (((class color) + (background light)) + (:foreground "navy blue" :bold t)) + (t + (:bold t))) + "Face used in tree mode for tags in messages matching the query." + :group 'notmuch-tree + :group 'notmuch-faces) + +;; Faces for messages that do not match the query. +(defface notmuch-tree-no-match-date-face + '((t (:foreground "gray"))) + "Face used in tree mode for non-matching dates." + :group 'notmuch-tree + :group 'notmuch-faces) + +(defface notmuch-tree-no-match-subject-face + '((t (:foreground "gray"))) + "Face used in tree mode for non-matching subjects." + :group 'notmuch-tree + :group 'notmuch-faces) + +(defface notmuch-tree-no-match-tree-face + '((t (:foreground "gray"))) + "Face used in tree mode for the thread tree block graphics in messages matching the query." + :group 'notmuch-tree + :group 'notmuch-faces) + +(defface notmuch-tree-no-match-author-face + '((t (:foreground "gray"))) + "Face used in tree mode for the date in messages matching the query." + :group 'notmuch-tree + :group 'notmuch-faces) + +(defface notmuch-tree-no-match-tag-face + '((t (:foreground "gray"))) + "Face used in tree mode face for non-matching tags." + :group 'notmuch-tree + :group 'notmuch-faces) + +(defvar notmuch-tree-previous-subject + "The subject of the most recent result shown during the async display") +(make-variable-buffer-local 'notmuch-tree-previous-subject) + +(defvar notmuch-tree-basic-query nil + "A buffer local copy of argument query to the function notmuch-tree") +(make-variable-buffer-local 'notmuch-tree-basic-query) + +(defvar notmuch-tree-query-context nil + "A buffer local copy of argument query-context to the function notmuch-tree") +(make-variable-buffer-local 'notmuch-tree-query-context) + +(defvar notmuch-tree-target-msg nil + "A buffer local copy of argument target to the function notmuch-tree") +(make-variable-buffer-local 'notmuch-tree-target-msg) + +(defvar notmuch-tree-open-target nil + "A buffer local copy of argument open-target to the function notmuch-tree") +(make-variable-buffer-local 'notmuch-tree-open-target) + +(defvar notmuch-tree-message-window nil + "The window of the message pane. + +It is set in both the tree buffer and the child show buffer. It +is used to try and close the message pane when quitting tree view +or the child show buffer.") +(make-variable-buffer-local 'notmuch-tree-message-window) +(put 'notmuch-tree-message-window 'permanent-local t) + +(defvar notmuch-tree-message-buffer nil + "The buffer name of the show buffer in the message pane. + +This is used to try and make sure we don't close the message pane +if the user has loaded a different buffer in that window.") +(make-variable-buffer-local 'notmuch-tree-message-buffer) +(put 'notmuch-tree-message-buffer 'permanent-local t) + +(defun notmuch-tree-to-message-pane (func) + "Execute FUNC in message pane. + +This function returns a function (so can be used as a keybinding) +which executes function FUNC in the message pane if it is +open (if the message pane is closed it does nothing)." + `(lambda () + ,(concat "(In message pane) " (documentation func t)) + (interactive) + (when (window-live-p notmuch-tree-message-window) + (with-selected-window notmuch-tree-message-window + (call-interactively #',func))))) + +(defun notmuch-tree-button-activate (&optional button) + "Activate BUTTON or button at point + +This function does not give an error if there is no button." + (interactive) + (let ((button (or button (button-at (point))))) + (when button (button-activate button)))) + +(defun notmuch-tree-close-message-pane-and (func) + "Close message pane and execute FUNC. + +This function returns a function (so can be used as a keybinding) +which closes the message pane if open and then executes function +FUNC." + `(lambda () + ,(concat "(Close message pane and) " (documentation func t)) + (interactive) + (notmuch-tree-close-message-window) + (call-interactively #',func))) + +(defvar notmuch-tree-mode-map + (let ((map (make-sparse-keymap))) + (set-keymap-parent map notmuch-common-keymap) + ;; The following override the global keymap. + ;; Override because we want to close message pane first. + (define-key map "?" (notmuch-tree-close-message-pane-and #'notmuch-help)) + ;; Override because we first close message pane and then close tree buffer. + (define-key map "q" 'notmuch-tree-quit) + ;; Override because we close message pane after the search query is entered. + (define-key map "s" 'notmuch-tree-to-search) + ;; Override because we want to close message pane first. + (define-key map "m" (notmuch-tree-close-message-pane-and #'notmuch-mua-new-mail)) + + ;; these use notmuch-show functions directly + (define-key map "|" 'notmuch-show-pipe-message) + (define-key map "w" 'notmuch-show-save-attachments) + (define-key map "v" 'notmuch-show-view-all-mime-parts) + (define-key map "c" 'notmuch-show-stash-map) + + ;; these apply to the message pane + (define-key map (kbd "M-TAB") (notmuch-tree-to-message-pane #'notmuch-show-previous-button)) + (define-key map (kbd "<backtab>") (notmuch-tree-to-message-pane #'notmuch-show-previous-button)) + (define-key map (kbd "TAB") (notmuch-tree-to-message-pane #'notmuch-show-next-button)) + (define-key map "e" (notmuch-tree-to-message-pane #'notmuch-tree-button-activate)) + + ;; bindings from show (or elsewhere) but we close the message pane first. + (define-key map "f" (notmuch-tree-close-message-pane-and #'notmuch-show-forward-message)) + (define-key map "r" (notmuch-tree-close-message-pane-and #'notmuch-show-reply-sender)) + (define-key map "R" (notmuch-tree-close-message-pane-and #'notmuch-show-reply)) + (define-key map "V" (notmuch-tree-close-message-pane-and #'notmuch-show-view-raw-message)) + + ;; The main tree view bindings + (define-key map (kbd "RET") 'notmuch-tree-show-message) + (define-key map [mouse-1] 'notmuch-tree-show-message) + (define-key map "x" 'notmuch-tree-quit) + (define-key map "A" 'notmuch-tree-archive-thread) + (define-key map "a" 'notmuch-tree-archive-message-then-next) + (define-key map "=" 'notmuch-tree-refresh-view) + (define-key map "z" 'notmuch-tree-to-tree) + (define-key map "n" 'notmuch-tree-next-matching-message) + (define-key map "p" 'notmuch-tree-prev-matching-message) + (define-key map "N" 'notmuch-tree-next-message) + (define-key map "P" 'notmuch-tree-prev-message) + (define-key map (kbd "M-p") 'notmuch-tree-prev-thread) + (define-key map (kbd "M-n") 'notmuch-tree-next-thread) + (define-key map "-" 'notmuch-tree-remove-tag) + (define-key map "+" 'notmuch-tree-add-tag) + (define-key map "*" 'notmuch-tree-tag-thread) + (define-key map " " 'notmuch-tree-scroll-or-next) + (define-key map "b" 'notmuch-tree-scroll-message-window-back) + map)) +(fset 'notmuch-tree-mode-map notmuch-tree-mode-map) + +(defun notmuch-tree-get-message-properties () + "Return the properties of the current message as a plist. + +Some useful entries are: +:headers - Property list containing the headers :Date, :Subject, :From, etc. +:tags - Tags for this message" + (save-excursion + (beginning-of-line) + (get-text-property (point) :notmuch-message-properties))) + +;; XXX This should really be a lib function but we are trying to +;; reduce impact on the code base. +(defun notmuch-show-get-prop (prop &optional props) + "This is a tree view overridden version of notmuch-show-get-prop + +It gets property PROP from PROPS or, if PROPS is nil, the current +message in either tree or show. This means that several functions +in notmuch-show now work unchanged in tree as they just need the +correct message properties." + (let ((props (or props + (cond ((eq major-mode 'notmuch-show-mode) + (notmuch-show-get-message-properties)) + ((eq major-mode 'notmuch-tree-mode) + (notmuch-tree-get-message-properties)))))) + (plist-get props prop))) + +(defun notmuch-tree-set-message-properties (props) + (save-excursion + (beginning-of-line) + (put-text-property (point) (+ (point) 1) :notmuch-message-properties props))) + +(defun notmuch-tree-set-prop (prop val &optional props) + (let ((inhibit-read-only t) + (props (or props + (notmuch-tree-get-message-properties)))) + (plist-put props prop val) + (notmuch-tree-set-message-properties props))) + +(defun notmuch-tree-get-prop (prop &optional props) + (let ((props (or props + (notmuch-tree-get-message-properties)))) + (plist-get props prop))) + +(defun notmuch-tree-set-tags (tags) + "Set the tags of the current message." + (notmuch-tree-set-prop :tags tags)) + +(defun notmuch-tree-get-tags () + "Return the tags of the current message." + (notmuch-tree-get-prop :tags)) + +(defun notmuch-tree-get-message-id () + "Return the message id of the current message." + (let ((id (notmuch-tree-get-prop :id))) + (if id + (notmuch-id-to-query id) + nil))) + +(defun notmuch-tree-get-match () + "Return whether the current message is a match." + (interactive) + (notmuch-tree-get-prop :match)) + +(defun notmuch-tree-refresh-result () + "Redisplay the current message line. + +This redisplays the current line based on the messages +properties (as they are now). This is used when tags are +updated." + (let ((init-point (point)) + (end (line-end-position)) + (msg (notmuch-tree-get-message-properties)) + (inhibit-read-only t)) + (beginning-of-line) + ;; This is a little tricky: we override + ;; notmuch-tree-previous-subject to get the decision between + ;; ... and a subject right and it stops notmuch-tree-insert-msg + ;; from overwriting the buffer local copy of + ;; notmuch-tree-previous-subject if this is called while the + ;; buffer is displaying. + (let ((notmuch-tree-previous-subject (notmuch-tree-get-prop :previous-subject))) + (delete-region (point) (1+ (line-end-position))) + (notmuch-tree-insert-msg msg)) + (let ((new-end (line-end-position))) + (goto-char (if (= init-point end) + new-end + (min init-point (- new-end 1))))))) + +(defun notmuch-tree-tag-update-display (&optional tag-changes) + "Update display for TAG-CHANGES to current message. + +Does NOT change the database." + (let* ((current-tags (notmuch-tree-get-tags)) + (new-tags (notmuch-update-tags current-tags tag-changes))) + (unless (equal current-tags new-tags) + (notmuch-tree-set-tags new-tags) + (notmuch-tree-refresh-result)))) + +(defun notmuch-tree-tag (tag-changes) + "Change tags for the current message" + (interactive + (list (notmuch-read-tag-changes (notmuch-tree-get-tags) "Tag message"))) + (notmuch-tag (notmuch-tree-get-message-id) tag-changes) + (notmuch-tree-tag-update-display tag-changes)) + +(defun notmuch-tree-add-tag (tag-changes) + "Same as `notmuch-tree-tag' but sets initial input to '+'." + (interactive + (list (notmuch-read-tag-changes (notmuch-tree-get-tags) "Tag message" "+"))) + (notmuch-tree-tag tag-changes)) + +(defun notmuch-tree-remove-tag (tag-changes) + "Same as `notmuch-tree-tag' but sets initial input to '-'." + (interactive + (list (notmuch-read-tag-changes (notmuch-tree-get-tags) "Tag message" "-"))) + (notmuch-tree-tag tag-changes)) + +;; The next two functions close the message window before calling +;; notmuch-search or notmuch-tree but they do so after the user has +;; entered the query (in case the user was basing the query on +;; something in the message window). + +(defun notmuch-tree-to-search () + "Run \"notmuch search\" with the given `query' and display results." + (interactive) + (let ((query (notmuch-read-query "Notmuch search: "))) + (notmuch-tree-close-message-window) + (notmuch-search query))) + +(defun notmuch-tree-to-tree () + "Run a query and display results in Tree view" + (interactive) + (let ((query (notmuch-read-query "Notmuch tree view search: "))) + (notmuch-tree-close-message-window) + (notmuch-tree query))) + +;; This function should be in notmuch-show.el but be we trying to +;; minimise impact on the rest of the codebase. +(defun notmuch-tree-from-show-current-query () + "Call notmuch tree with the current query" + (interactive) + (notmuch-tree notmuch-show-thread-id + notmuch-show-query-context + (notmuch-show-get-message-id))) + +;; This function should be in notmuch.el but be we trying to minimise +;; impact on the rest of the codebase. +(defun notmuch-tree-from-search-current-query () + "Call notmuch tree with the current query" + (interactive) + (notmuch-tree notmuch-search-query-string)) + +;; This function should be in notmuch.el but be we trying to minimise +;; impact on the rest of the codebase. +(defun notmuch-tree-from-search-thread () + "Show the selected thread with notmuch-tree" + (interactive) + (notmuch-tree (notmuch-search-find-thread-id) + notmuch-search-query-string + nil + (notmuch-prettify-subject (notmuch-search-find-subject)) + t)) + +(defun notmuch-tree-message-window-kill-hook () + "Close the message pane when exiting the show buffer." + (let ((buffer (current-buffer))) + (when (and (window-live-p notmuch-tree-message-window) + (eq (window-buffer notmuch-tree-message-window) buffer)) + ;; We do not want an error if this is the sole window in the + ;; frame and I do not know how to test for that in emacs pre + ;; 24. Hence we just ignore-errors. + (ignore-errors + (delete-window notmuch-tree-message-window))))) + +(defun notmuch-tree-show-message-in () + "Show the current message (in split-pane)." + (interactive) + (let ((id (notmuch-tree-get-message-id)) + (inhibit-read-only t) + buffer) + (when id + ;; We close and reopen the window to kill off un-needed buffers + ;; this might cause flickering but seems ok. + (notmuch-tree-close-message-window) + (setq notmuch-tree-message-window + (split-window-vertically (/ (window-height) 4))) + (with-selected-window notmuch-tree-message-window + ;; Since we are only displaying one message do not indent. + (let ((notmuch-show-indent-messages-width 0) + (notmuch-show-only-matching-messages t)) + (setq buffer (notmuch-show id)))) + ;; We need the `let' as notmuch-tree-message-window is buffer local. + (let ((window notmuch-tree-message-window)) + (with-current-buffer buffer + (setq notmuch-tree-message-window window) + (add-hook 'kill-buffer-hook 'notmuch-tree-message-window-kill-hook))) + (when notmuch-show-mark-read-tags + (notmuch-tree-tag-update-display notmuch-show-mark-read-tags)) + (setq notmuch-tree-message-buffer buffer)))) + +(defun notmuch-tree-show-message-out () + "Show the current message (in whole window)." + (interactive) + (let ((id (notmuch-tree-get-message-id)) + (inhibit-read-only t) + buffer) + (when id + ;; We close the window to kill off un-needed buffers. + (notmuch-tree-close-message-window) + (notmuch-show id)))) + +(defun notmuch-tree-show-message (arg) + "Show the current message. + +Shows in split pane or whole window according to value of +`notmuch-tree-show-out'. A prefix argument reverses the choice." + (interactive "P") + (if (or (and notmuch-tree-show-out (not arg)) + (and (not notmuch-tree-show-out) arg)) + (notmuch-tree-show-message-out) + (notmuch-tree-show-message-in))) + +(defun notmuch-tree-scroll-message-window () + "Scroll the message window (if it exists)" + (interactive) + (when (window-live-p notmuch-tree-message-window) + (with-selected-window notmuch-tree-message-window + (if (pos-visible-in-window-p (point-max)) + t + (scroll-up))))) + +(defun notmuch-tree-scroll-message-window-back () + "Scroll the message window back(if it exists)" + (interactive) + (when (window-live-p notmuch-tree-message-window) + (with-selected-window notmuch-tree-message-window + (if (pos-visible-in-window-p (point-min)) + t + (scroll-down))))) + +(defun notmuch-tree-scroll-or-next () + "Scroll the message window. If it at end go to next message." + (interactive) + (when (notmuch-tree-scroll-message-window) + (notmuch-tree-next-matching-message))) + +(defun notmuch-tree-quit () + "Close the split view or exit tree." + (interactive) + (unless (notmuch-tree-close-message-window) + (kill-buffer (current-buffer)))) + +(defun notmuch-tree-close-message-window () + "Close the message-window. Return t if close succeeds." + (interactive) + (when (and (window-live-p notmuch-tree-message-window) + (eq (window-buffer notmuch-tree-message-window) notmuch-tree-message-buffer)) + (delete-window notmuch-tree-message-window) + (unless (get-buffer-window-list notmuch-tree-message-buffer) + (kill-buffer notmuch-tree-message-buffer)) + t)) + +(defun notmuch-tree-archive-message (&optional unarchive) + "Archive the current message. + +Archive the current message by applying the tag changes in +`notmuch-archive-tags' to it. If a prefix argument is given, the +message will be \"unarchived\", i.e. the tag changes in +`notmuch-archive-tags' will be reversed." + (interactive "P") + (when notmuch-archive-tags + (notmuch-tree-tag (notmuch-tag-change-list notmuch-archive-tags unarchive)))) + +(defun notmuch-tree-archive-message-then-next (&optional unarchive) + "Archive the current message and move to next matching message." + (interactive "P") + (notmuch-tree-archive-message unarchive) + (notmuch-tree-next-matching-message)) + +(defun notmuch-tree-next-message () + "Move to next message." + (interactive) + (forward-line) + (when (window-live-p notmuch-tree-message-window) + (notmuch-tree-show-message-in))) + +(defun notmuch-tree-prev-message () + "Move to previous message." + (interactive) + (forward-line -1) + (when (window-live-p notmuch-tree-message-window) + (notmuch-tree-show-message-in))) + +(defun notmuch-tree-prev-matching-message () + "Move to previous matching message." + (interactive) + (forward-line -1) + (while (and (not (bobp)) (not (notmuch-tree-get-match))) + (forward-line -1)) + (when (window-live-p notmuch-tree-message-window) + (notmuch-tree-show-message-in))) + +(defun notmuch-tree-next-matching-message () + "Move to next matching message." + (interactive) + (forward-line) + (while (and (not (eobp)) (not (notmuch-tree-get-match))) + (forward-line)) + (when (window-live-p notmuch-tree-message-window) + (notmuch-tree-show-message-in))) + +(defun notmuch-tree-refresh-view () + "Refresh view." + (interactive) + (let ((inhibit-read-only t) + (basic-query notmuch-tree-basic-query) + (query-context notmuch-tree-query-context) + (target (notmuch-tree-get-message-id))) + (erase-buffer) + (notmuch-tree-worker basic-query + query-context + target))) + +(defun notmuch-tree-thread-top () + (when (notmuch-tree-get-message-properties) + (while (not (or (notmuch-tree-get-prop :first) (eobp))) + (forward-line -1)))) + +(defun notmuch-tree-prev-thread () + (interactive) + (forward-line -1) + (notmuch-tree-thread-top)) + +(defun notmuch-tree-next-thread () + (interactive) + (forward-line 1) + (while (not (or (notmuch-tree-get-prop :first) (eobp))) + (forward-line 1))) + +(defun notmuch-tree-thread-mapcar (function) + "Iterate through all messages in the current thread + and call FUNCTION for side effects." + (save-excursion + (notmuch-tree-thread-top) + (loop collect (funcall function) + do (forward-line) + while (and (notmuch-tree-get-message-properties) + (not (notmuch-tree-get-prop :first)))))) + +(defun notmuch-tree-get-messages-ids-thread-search () + "Return a search string for all message ids of messages in the current thread." + (mapconcat 'identity + (notmuch-tree-thread-mapcar 'notmuch-tree-get-message-id) + " or ")) + +(defun notmuch-tree-tag-thread (tag-changes) + "Tag all messages in the current thread" + (interactive + (let ((tags (apply #'append (notmuch-tree-thread-mapcar + (lambda () (notmuch-tree-get-tags)))))) + (list (notmuch-read-tag-changes tags "Tag thread")))) + (when (notmuch-tree-get-message-properties) + (notmuch-tag (notmuch-tree-get-messages-ids-thread-search) tag-changes) + (notmuch-tree-thread-mapcar + (lambda () (notmuch-tree-tag-update-display tag-changes))))) + +(defun notmuch-tree-archive-thread (&optional unarchive) + "Archive each message in thread. + +Archive each message currently shown by applying the tag changes +in `notmuch-archive-tags' to each. If a prefix argument is given, +the messages will be \"unarchived\", i.e. the tag changes in +`notmuch-archive-tags' will be reversed. + +Note: This command is safe from any race condition of new messages +being delivered to the same thread. It does not archive the +entire thread, but only the messages shown in the current +buffer." + (interactive "P") + (when notmuch-archive-tags + (notmuch-tree-tag-thread + (notmuch-tag-change-list notmuch-archive-tags unarchive)))) + +;; Functions below here display the tree buffer itself. + +(defun notmuch-tree-clean-address (address) + "Try to clean a single email ADDRESS for display. Return +AUTHOR_NAME if present, otherwise return AUTHOR_EMAIL. Return +unchanged ADDRESS if parsing fails." + (let* ((clean-address (notmuch-clean-address address)) + (p-address (car clean-address)) + (p-name (cdr clean-address))) + + ;; If we have a name return that otherwise return the address. + (or p-name p-address))) + +(defun notmuch-tree-format-field (field format-string msg) + "Format a FIELD of MSG according to FORMAT-STRING and return string" + (let* ((headers (plist-get msg :headers)) + (match (plist-get msg :match))) + (cond + ((listp field) + (format format-string (notmuch-tree-format-field-list field msg))) + + ((string-equal field "date") + (let ((face (if match + 'notmuch-tree-match-date-face + 'notmuch-tree-no-match-date-face))) + (propertize (format format-string (plist-get msg :date_relative)) 'face face))) + + ((string-equal field "tree") + (let ((tree-status (plist-get msg :tree-status)) + (face (if match + 'notmuch-tree-match-tree-face + 'notmuch-tree-no-match-tree-face))) + + (propertize (format format-string + (mapconcat #'identity (reverse tree-status) "")) + 'face face))) + + ((string-equal field "subject") + (let ((bare-subject (notmuch-show-strip-re (plist-get headers :Subject))) + (previous-subject notmuch-tree-previous-subject) + (face (if match + 'notmuch-tree-match-subject-face + 'notmuch-tree-no-match-subject-face))) + + (setq notmuch-tree-previous-subject bare-subject) + (propertize (format format-string + (if (string= previous-subject bare-subject) + " ..." + bare-subject)) + 'face face))) + + ((string-equal field "authors") + (let ((author (notmuch-tree-clean-address (plist-get headers :From))) + (len (length (format format-string ""))) + (face (if match + 'notmuch-tree-match-author-face + 'notmuch-tree-no-match-author-face))) + (when (> (length author) len) + (setq author (substring author 0 len))) + (propertize (format format-string author) 'face face))) + + ((string-equal field "tags") + (let ((tags (plist-get msg :tags)) + (face (if match + 'notmuch-tree-match-tag-face + 'notmuch-tree-no-match-tag-face))) + (propertize (format format-string + (mapconcat #'identity tags ", ")) + 'face face)))))) + + +(defun notmuch-tree-format-field-list (field-list msg) + "Format fields of MSG according to FIELD-LIST and return string" + (let (result-string) + (dolist (spec field-list result-string) + (let ((field-string (notmuch-tree-format-field (car spec) (cdr spec) msg))) + (setq result-string (concat result-string field-string)))))) + +(defun notmuch-tree-insert-msg (msg) + "Insert the message MSG according to notmuch-tree-result-format" + ;; We need to save the previous subject as it will get overwritten + ;; by the insert-field calls. + (let ((previous-subject notmuch-tree-previous-subject)) + (insert (notmuch-tree-format-field-list notmuch-tree-result-format msg)) + (notmuch-tree-set-message-properties msg) + (notmuch-tree-set-prop :previous-subject previous-subject) + (insert "\n"))) + +(defun notmuch-tree-goto-and-insert-msg (msg) + "Insert msg at the end of the buffer. Move point to msg if it is the target" + (save-excursion + (goto-char (point-max)) + (notmuch-tree-insert-msg msg)) + (let ((msg-id (notmuch-id-to-query (plist-get msg :id))) + (target notmuch-tree-target-msg)) + (when (or (and (not target) (plist-get msg :match)) + (string= msg-id target)) + (setq notmuch-tree-target-msg "found") + (goto-char (point-max)) + (forward-line -1) + (when notmuch-tree-open-target + (notmuch-tree-show-message-in))))) + +(defun notmuch-tree-insert-tree (tree depth tree-status first last) + "Insert the message tree TREE at depth DEPTH in the current thread. + +A message tree is another name for a single sub-thread: i.e., a +message together with all its descendents." + (let ((msg (car tree)) + (replies (cadr tree))) + + (cond + ((and (< 0 depth) (not last)) + (push "├" tree-status)) + ((and (< 0 depth) last) + (push "╰" tree-status)) + ((and (eq 0 depth) first last) +;; (push "─" tree-status)) choice between this and next line is matter of taste. + (push " " tree-status)) + ((and (eq 0 depth) first (not last)) + (push "┬" tree-status)) + ((and (eq 0 depth) (not first) last) + (push "╰" tree-status)) + ((and (eq 0 depth) (not first) (not last)) + (push "├" tree-status))) + + (push (concat (if replies "┬" "─") "►") tree-status) + (plist-put msg :first (and first (eq 0 depth))) + (notmuch-tree-goto-and-insert-msg (plist-put msg :tree-status tree-status)) + (pop tree-status) + (pop tree-status) + + (if last + (push " " tree-status) + (push "│" tree-status)) + + (notmuch-tree-insert-thread replies (1+ depth) tree-status))) + +(defun notmuch-tree-insert-thread (thread depth tree-status) + "Insert the collection of sibling sub-threads THREAD at depth DEPTH in the current forest." + (let ((n (length thread))) + (loop for tree in thread + for count from 1 to n + + do (notmuch-tree-insert-tree tree depth tree-status (eq count 1) (eq count n))))) + +(defun notmuch-tree-insert-forest-thread (forest-thread) + "Insert a single complete thread." + (let (tree-status) + ;; Reset at the start of each main thread. + (setq notmuch-tree-previous-subject nil) + (notmuch-tree-insert-thread forest-thread 0 tree-status))) + +(defun notmuch-tree-insert-forest (forest) + "Insert a forest of threads. + +This function inserts a collection of several complete threads as +passed to it by notmuch-tree-process-filter." + (mapc 'notmuch-tree-insert-forest-thread forest)) + +(defun notmuch-tree-mode () + "Major mode displaying messages (as opposed to threads) of of a notmuch search. + +This buffer contains the results of a \"notmuch tree\" of your +email archives. Each line in the buffer represents a single +message giving the relative date, the author, subject, and any +tags. + +Pressing \\[notmuch-tree-show-message] on any line displays that message. + +Complete list of currently available key bindings: + +\\{notmuch-tree-mode-map}" + + (interactive) + (kill-all-local-variables) + (setq notmuch-buffer-refresh-function #'notmuch-tree-refresh-view) + (use-local-map notmuch-tree-mode-map) + (setq major-mode 'notmuch-tree-mode + mode-name "notmuch-tree") + (hl-line-mode 1) + (setq buffer-read-only t + truncate-lines t)) + +(defun notmuch-tree-process-sentinel (proc msg) + "Add a message to let user know when \"notmuch tree\" exits" + (let ((buffer (process-buffer proc)) + (status (process-status proc)) + (exit-status (process-exit-status proc)) + (never-found-target-thread nil)) + (when (memq status '(exit signal)) + (kill-buffer (process-get proc 'parse-buf)) + (if (buffer-live-p buffer) + (with-current-buffer buffer + (save-excursion + (let ((inhibit-read-only t) + (atbob (bobp))) + (goto-char (point-max)) + (if (eq status 'signal) + (insert "Incomplete search results (tree view process was killed).\n")) + (when (eq status 'exit) + (insert "End of search results.") + (unless (= exit-status 0) + (insert (format " (process returned %d)" exit-status))) + (insert "\n"))))))))) + +(defun notmuch-tree-process-filter (proc string) + "Process and filter the output of \"notmuch show\" for tree view" + (let ((results-buf (process-buffer proc)) + (parse-buf (process-get proc 'parse-buf)) + (inhibit-read-only t) + done) + (if (not (buffer-live-p results-buf)) + (delete-process proc) + (with-current-buffer parse-buf + ;; Insert new data + (save-excursion + (goto-char (point-max)) + (insert string)) + (notmuch-sexp-parse-partial-list 'notmuch-tree-insert-forest-thread + results-buf))))) + +(defun notmuch-tree-worker (basic-query &optional query-context target open-target) + "Insert the tree view of the search in the current buffer. + +This is is a helper function for notmuch-tree. The arguments are +the same as for the function notmuch-tree." + (interactive) + (notmuch-tree-mode) + (setq notmuch-tree-basic-query basic-query) + (setq notmuch-tree-query-context query-context) + (setq notmuch-tree-target-msg target) + (setq notmuch-tree-open-target open-target) + + (erase-buffer) + (goto-char (point-min)) + (let* ((search-args (concat basic-query + (if query-context (concat " and (" query-context ")")) + )) + (message-arg "--entire-thread")) + (if (equal (car (process-lines notmuch-command "count" search-args)) "0") + (setq search-args basic-query)) + (let ((proc (notmuch-start-notmuch + "notmuch-tree" (current-buffer) #'notmuch-tree-process-sentinel + "show" "--body=false" "--format=sexp" + message-arg search-args)) + ;; Use a scratch buffer to accumulate partial output. + ;; This buffer will be killed by the sentinel, which + ;; should be called no matter how the process dies. + (parse-buf (generate-new-buffer " *notmuch tree parse*"))) + (process-put proc 'parse-buf parse-buf) + (set-process-filter proc 'notmuch-tree-process-filter) + (set-process-query-on-exit-flag proc nil)))) + +(defun notmuch-tree (&optional query query-context target buffer-name open-target) + "Display threads matching QUERY in Tree View. + +The arguments are: + QUERY: the main query. This can be any query but in many cases will be + a single thread. If nil this is read interactively from the minibuffer. + QUERY-CONTEXT: is an additional term for the query. The query used + is QUERY and QUERY-CONTEXT unless that does not match any messages + in which case we fall back to just QUERY. + TARGET: A message ID (with the id: prefix) that will be made + current if it appears in the tree view results. + BUFFER-NAME: the name of the buffer to display the tree view. If + it is nil \"*notmuch-tree\" followed by QUERY is used. + OPEN-TARGET: If TRUE open the target message in the message pane." + (interactive) + (if (null query) + (setq query (notmuch-read-query "Notmuch tree view search: "))) + (let ((buffer (get-buffer-create (generate-new-buffer-name + (or buffer-name + (concat "*notmuch-tree-" query "*"))))) + (inhibit-read-only t)) + + (switch-to-buffer buffer)) + ;; Don't track undo information for this buffer + (set 'buffer-undo-list t) + + (notmuch-tree-worker query query-context target open-target) + + (setq truncate-lines t)) + + +;; Set up key bindings from the rest of notmuch. +(define-key notmuch-common-keymap "z" 'notmuch-tree) +(define-key notmuch-search-mode-map "Z" 'notmuch-tree-from-search-current-query) +(define-key notmuch-show-mode-map "Z" 'notmuch-tree-from-show-current-query) +(message "Initialised notmuch-tree") + +(provide 'notmuch-tree) -- 1.7.9.1 ^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH 04/11] emacs: add tree to the makefile 2013-10-29 22:55 [PATCH 00/11] Move notmuch-tree to mainline Mark Walters ` (2 preceding siblings ...) 2013-10-29 22:55 ` [PATCH 03/11] emacs: move notmuch-tree from contrib to mainline Mark Walters @ 2013-10-29 22:55 ` Mark Walters 2013-10-29 22:55 ` [PATCH 05/11] test: move emacs-tree test into mainline Mark Walters ` (9 subsequent siblings) 13 siblings, 0 replies; 22+ messages in thread From: Mark Walters @ 2013-10-29 22:55 UTC (permalink / raw) To: notmuch --- emacs/Makefile.local | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) diff --git a/emacs/Makefile.local b/emacs/Makefile.local index a910aff..92467a3 100644 --- a/emacs/Makefile.local +++ b/emacs/Makefile.local @@ -7,6 +7,7 @@ emacs_sources := \ $(dir)/notmuch.el \ $(dir)/notmuch-query.el \ $(dir)/notmuch-show.el \ + $(dir)/notmuch-tree.el \ $(dir)/notmuch-wash.el \ $(dir)/notmuch-hello.el \ $(dir)/notmuch-mua.el \ -- 1.7.9.1 ^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH 05/11] test: move emacs-tree test into mainline 2013-10-29 22:55 [PATCH 00/11] Move notmuch-tree to mainline Mark Walters ` (3 preceding siblings ...) 2013-10-29 22:55 ` [PATCH 04/11] emacs: add tree to the makefile Mark Walters @ 2013-10-29 22:55 ` Mark Walters 2013-10-29 22:55 ` [PATCH 06/11] emacs: tree: remove test for emacs from tree test Mark Walters ` (8 subsequent siblings) 13 siblings, 0 replies; 22+ messages in thread From: Mark Walters @ 2013-10-29 22:55 UTC (permalink / raw) To: notmuch We move the emacs-tree test and associated files into the main test directory and add the test to the list in notmuch-test. --- contrib/notmuch-pick/test/emacs-tree | 210 -------------------- .../tree.expected-output/notmuch-tree-show-window | 40 ---- .../notmuch-tree-single-thread | 6 - .../tree.expected-output/notmuch-tree-tag-inbox | 53 ----- .../notmuch-tree-tag-inbox-tagged | 53 ----- .../notmuch-tree-tag-inbox-thread-tagged | 53 ----- test/emacs-tree | 210 ++++++++++++++++++++ test/notmuch-test | 1 + test/tree.expected-output/notmuch-tree-show-window | 40 ++++ .../notmuch-tree-single-thread | 6 + test/tree.expected-output/notmuch-tree-tag-inbox | 53 +++++ .../notmuch-tree-tag-inbox-tagged | 53 +++++ .../notmuch-tree-tag-inbox-thread-tagged | 53 +++++ 13 files changed, 416 insertions(+), 415 deletions(-) delete mode 100755 contrib/notmuch-pick/test/emacs-tree delete mode 100644 contrib/notmuch-pick/test/tree.expected-output/notmuch-tree-show-window delete mode 100644 contrib/notmuch-pick/test/tree.expected-output/notmuch-tree-single-thread delete mode 100644 contrib/notmuch-pick/test/tree.expected-output/notmuch-tree-tag-inbox delete mode 100644 contrib/notmuch-pick/test/tree.expected-output/notmuch-tree-tag-inbox-tagged delete mode 100644 contrib/notmuch-pick/test/tree.expected-output/notmuch-tree-tag-inbox-thread-tagged create mode 100755 test/emacs-tree create mode 100644 test/tree.expected-output/notmuch-tree-show-window create mode 100644 test/tree.expected-output/notmuch-tree-single-thread create mode 100644 test/tree.expected-output/notmuch-tree-tag-inbox create mode 100644 test/tree.expected-output/notmuch-tree-tag-inbox-tagged create mode 100644 test/tree.expected-output/notmuch-tree-tag-inbox-thread-tagged diff --git a/contrib/notmuch-pick/test/emacs-tree b/contrib/notmuch-pick/test/emacs-tree deleted file mode 100755 index 05ce85d..0000000 --- a/contrib/notmuch-pick/test/emacs-tree +++ /dev/null @@ -1,210 +0,0 @@ -#!/usr/bin/env bash - -test_description="emacs tree view interface" -. test-lib.sh - -EXPECTED=$TEST_DIRECTORY/tree.expected-output - -add_email_corpus -test_begin_subtest "Do we have emacs" -test_emacs '(insert "hello\n") - (test-output)' -cat <<EOF >EXPECTED -hello -EOF -test_expect_equal_file OUTPUT EXPECTED - -test_begin_subtest "Basic notmuch-tree view in emacs" -test_emacs '(add-to-list (quote load-path) "'$PICK_DIR'") - (require (quote notmuch-tree)) - (notmuch-tree "tag:inbox") - (notmuch-test-wait) - (test-output) - (delete-other-windows)' -test_expect_equal_file OUTPUT $EXPECTED/notmuch-tree-tag-inbox - -test_begin_subtest "Refreshed notmuch-tree view in emacs" -test_emacs '(add-to-list (quote load-path) "'$PICK_DIR'") - (require (quote notmuch-tree)) - (notmuch-tree "tag:inbox") - (notmuch-test-wait) - (notmuch-tree-refresh-view) - (notmuch-test-wait) - (test-output) - (delete-other-windows)' -test_expect_equal_file OUTPUT $EXPECTED/notmuch-tree-tag-inbox - -# In the following tag tests we make sure the display is updated -# correctly and, in a separate test, that the database is updated -# correctly. - -test_begin_subtest "Tag message in notmuch tree view (display)" -test_emacs '(add-to-list (quote load-path) "'$PICK_DIR'") - (require (quote notmuch-tree)) - (notmuch-tree "tag:inbox") - (notmuch-test-wait) - (forward-line) - (notmuch-tree-tag (list "+test_tag")) - (test-output) - (delete-other-windows)' -test_expect_equal_file OUTPUT $EXPECTED/notmuch-tree-tag-inbox-tagged - -test_begin_subtest "Tag message in notmuch tree view (database)" -output=$(notmuch search --output=messages 'tag:test_tag') -test_expect_equal "$output" "id:877h1wv7mg.fsf@inf-8657.int-evry.fr" - -test_begin_subtest "Untag message in notmuch tree view" -test_emacs '(add-to-list (quote load-path) "'$PICK_DIR'") - (require (quote notmuch-tree)) - (notmuch-tree "tag:inbox") - (notmuch-test-wait) - (forward-line) - (notmuch-tree-tag (list "-test_tag")) - (test-output) - (delete-other-windows)' -test_expect_equal_file OUTPUT $EXPECTED/notmuch-tree-tag-inbox - -test_begin_subtest "Untag message in notmuch tree view (database)" -output=$(notmuch search --output=messages 'tag:test_tag') -test_expect_equal "$output" "" - -test_begin_subtest "Tag thread in notmuch tree view" -test_emacs '(add-to-list (quote load-path) "'$PICK_DIR'") - (require (quote notmuch-tree)) - (notmuch-tree "tag:inbox") - (notmuch-test-wait) - ;; move to a sizable thread - (forward-line 26) - (notmuch-tree-tag-thread (list "+test_thread_tag")) - (test-output) - (delete-other-windows)' -test_expect_equal_file OUTPUT $EXPECTED/notmuch-tree-tag-inbox-thread-tagged - -test_begin_subtest "Tag message in notmuch tree view (database)" -output=$(notmuch search --output=messages 'tag:test_thread_tag') -test_expect_equal "$output" \ -"id:87ocn0qh6d.fsf@yoom.home.cworth.org -id:20091118005040.GA25380@dottiness.seas.harvard.edu -id:yunaayketfm.fsf@aiko.keithp.com -id:87fx8can9z.fsf@vertex.dottedmag -id:20091117203301.GV3165@dottiness.seas.harvard.edu -id:87iqd9rn3l.fsf@vertex.dottedmag -id:20091117190054.GU3165@dottiness.seas.harvard.edu" - -test_begin_subtest "Untag thread in notmuch tree view" -test_emacs '(add-to-list (quote load-path) "'$PICK_DIR'") - (require (quote notmuch-tree)) - (notmuch-tree "tag:inbox") - (notmuch-test-wait) - ;; move to the same sizable thread as above - (forward-line 26) - (notmuch-tree-tag-thread (list "-test_thread_tag")) - (test-output) - (delete-other-windows)' -test_expect_equal_file OUTPUT $EXPECTED/notmuch-tree-tag-inbox - -test_begin_subtest "Untag message in notmuch tree view (database)" -output=$(notmuch search --output=messages 'tag:test_thread_tag') -test_expect_equal "$output" "" - -test_begin_subtest "Navigation of notmuch-hello to search results" -test_emacs '(notmuch-hello) - (goto-char (point-min)) - (re-search-forward "inbox") - (widget-button-press (1- (point))) - (notmuch-test-wait) - (notmuch-tree-from-search-current-query) - (notmuch-test-wait) - (test-output) - (delete-other-windows)' -test_expect_equal_file OUTPUT $EXPECTED/notmuch-tree-tag-inbox - -test_begin_subtest "Tree view of a single thread (from search)" -test_emacs '(notmuch-hello) - (goto-char (point-min)) - (re-search-forward "inbox") - (widget-button-press (1- (point))) - (notmuch-test-wait) - (notmuch-tree-from-search-thread) - (notmuch-test-wait) - (test-output) - (delete-other-windows)' -test_expect_equal_file OUTPUT $EXPECTED/notmuch-tree-single-thread - -test_begin_subtest "Tree view of a single thread (from show)" -test_emacs '(notmuch-hello) - (goto-char (point-min)) - (re-search-forward "inbox") - (widget-button-press (1- (point))) - (notmuch-test-wait) - (notmuch-search-show-thread) - (notmuch-tree-from-show-current-query) - (notmuch-test-wait) - (test-output) - (delete-other-windows)' -test_expect_equal_file OUTPUT $EXPECTED/notmuch-tree-single-thread - -test_begin_subtest "Message window of tree view" -test_emacs '(notmuch-hello) - (goto-char (point-min)) - (re-search-forward "inbox") - (widget-button-press (1- (point))) - (notmuch-test-wait) - (notmuch-search-next-thread) - (notmuch-tree-from-search-thread) - (notmuch-test-wait) - (select-window notmuch-tree-message-window) - (test-output) - (delete-other-windows)' -cp OUTPUT /tmp/mjwout -test_expect_equal_file OUTPUT $EXPECTED/notmuch-tree-show-window - -test_begin_subtest "Stash id" -output=$(test_emacs '(add-to-list (quote load-path) "'$PICK_DIR'") - (require (quote notmuch-tree)) - (notmuch-tree "id:1258498485-sup-142@elly") - (notmuch-test-wait) - (notmuch-show-stash-message-id)') -test_expect_equal "$output" "\"Stashed: id:1258498485-sup-142@elly\"" - -test_begin_subtest "Move to next matching message" -output=$(test_emacs '(add-to-list (quote load-path) "'$PICK_DIR'") - (require (quote notmuch-tree)) - (notmuch-tree "from:cworth") - (notmuch-test-wait) - (notmuch-tree-next-matching-message) - (notmuch-show-stash-message-id)') -test_expect_equal "$output" "\"Stashed: id:878we4qdqf.fsf@yoom.home.cworth.org\"" - -test_begin_subtest "Move to next thread" -output=$(test_emacs '(add-to-list (quote load-path) "'$PICK_DIR'") - (require (quote notmuch-tree)) - (notmuch-tree "tag:inbox") - (notmuch-test-wait) - (forward-line 26) - (notmuch-tree-next-thread) - (notmuch-show-stash-message-id)') -test_expect_equal "$output" "\"Stashed: id:1258471718-6781-1-git-send-email-dottedmag@dottedmag.net\"" - -test_begin_subtest "Move to previous thread" -output=$(test_emacs '(add-to-list (quote load-path) "'$PICK_DIR'") - (require (quote notmuch-tree)) - (notmuch-tree "tag:inbox") - (notmuch-test-wait) - (forward-line 26) - (notmuch-tree-prev-thread) - (notmuch-show-stash-message-id)') -test_expect_equal "$output" "\"Stashed: id:20091117190054.GU3165@dottiness.seas.harvard.edu\"" - -test_begin_subtest "Move to previous previous thread" -output=$(test_emacs '(add-to-list (quote load-path) "'$PICK_DIR'") - (require (quote notmuch-tree)) - (notmuch-tree "tag:inbox") - (notmuch-test-wait) - (forward-line 26) - (notmuch-tree-prev-thread) - (notmuch-tree-prev-thread) - (notmuch-show-stash-message-id)') -test_expect_equal "$output" "\"Stashed: id:1258493565-13508-1-git-send-email-keithp@keithp.com\"" - -test_done diff --git a/contrib/notmuch-pick/test/tree.expected-output/notmuch-tree-show-window b/contrib/notmuch-pick/test/tree.expected-output/notmuch-tree-show-window deleted file mode 100644 index e16792b..0000000 --- a/contrib/notmuch-pick/test/tree.expected-output/notmuch-tree-show-window +++ /dev/null @@ -1,40 +0,0 @@ -Lars Kellogg-Stedman <lars@seas.harvard.edu> (2009-11-17) (inbox signed) -Subject: [notmuch] Working with Maildir storage? -To: notmuch@notmuchmail.org -Date: Tue, 17 Nov 2009 14:00:54 -0500 - -[ multipart/mixed ] -[ multipart/signed ] -[ text/plain ] -I saw the LWN article and decided to take a look at notmuch. I'm -currently using mutt and mairix to index and read a collection of -Maildir mail folders (around 40,000 messages total). - -notmuch indexed the messages without complaint, but my attempt at -searching bombed out. Running, for example: - - notmuch search storage - -Resulted in 4604 lines of errors along the lines of: - - Error opening - /home/lars/Mail/read-messages.2008/cur/1246413773.24928_27334.hostname,U=3026:2,S: - Too many open files - -I'm curious if this is expected behavior (i.e., notmuch does not work -with Maildir) or if something else is going on. - -Cheers, - -[ 4-line signature. Click/Enter to show. ] --- -Lars Kellogg-Stedman <lars@seas.harvard.edu> -Senior Technologist, Computing and Information Technology -Harvard University School of Engineering and Applied Sciences -[ application/pgp-signature ] -[ text/plain ] -[ 4-line signature. Click/Enter to show. ] -_______________________________________________ -notmuch mailing list -notmuch@notmuchmail.org -http://notmuchmail.org/mailman/listinfo/notmuch diff --git a/contrib/notmuch-pick/test/tree.expected-output/notmuch-tree-single-thread b/contrib/notmuch-pick/test/tree.expected-output/notmuch-tree-single-thread deleted file mode 100644 index c9e5ef8..0000000 --- a/contrib/notmuch-pick/test/tree.expected-output/notmuch-tree-single-thread +++ /dev/null @@ -1,6 +0,0 @@ - 2009-11-17 Mikhail Gusarov ┬►[notmuch] [PATCH 1/2] Close message file after parsing message headers (inbox) - 2009-11-17 Mikhail Gusarov ├─►[notmuch] [PATCH 2/2] Include <stdint.h> to get uint32_t in C++ file with gcc 4.4 (inbox, unread) - 2009-11-17 Carl Worth ╰┬►[notmuch] [PATCH 1/2] Close message file after parsing message headers (inbox, unread) - 2009-11-17 Keith Packard ╰┬► ... (inbox, unread) - 2009-11-18 Carl Worth ╰─► ... (inbox, unread) -End of search results. diff --git a/contrib/notmuch-pick/test/tree.expected-output/notmuch-tree-tag-inbox b/contrib/notmuch-pick/test/tree.expected-output/notmuch-tree-tag-inbox deleted file mode 100644 index 484141e..0000000 --- a/contrib/notmuch-pick/test/tree.expected-output/notmuch-tree-tag-inbox +++ /dev/null @@ -1,53 +0,0 @@ - 2010-12-29 François Boulogne ─►[aur-general] Guidelines: cp, mkdir vs install (inbox, unread) - 2010-12-16 Olivier Berger ─►Essai accentué (inbox, unread) - 2009-11-18 Chris Wilson ─►[notmuch] [PATCH 1/2] Makefile: evaluate pkg-config once (inbox, unread) - 2009-11-18 Alex Botero-Lowry ┬►[notmuch] [PATCH] Error out if no query is supplied to search instead of going into an infinite loop (attachment, inbox, unread) - 2009-11-18 Carl Worth ╰─►[notmuch] [PATCH] Error out if no query is supplied to search instead of going into an infinite loop (inbox, unread) - 2009-11-17 Ingmar Vanhassel ┬►[notmuch] [PATCH] Typsos (inbox, unread) - 2009-11-18 Carl Worth ╰─► ... (inbox, unread) - 2009-11-17 Adrian Perez de Cast ┬►[notmuch] Introducing myself (inbox, signed, unread) - 2009-11-18 Keith Packard ├─► ... (inbox, unread) - 2009-11-18 Carl Worth ╰─► ... (inbox, unread) - 2009-11-17 Israel Herraiz ┬►[notmuch] New to the list (inbox, unread) - 2009-11-18 Keith Packard ├─► ... (inbox, unread) - 2009-11-18 Carl Worth ╰─► ... (inbox, unread) - 2009-11-17 Jan Janak ┬►[notmuch] What a great idea! (inbox, unread) - 2009-11-17 Jan Janak ├─► ... (inbox, unread) - 2009-11-18 Carl Worth ╰─► ... (inbox, unread) - 2009-11-17 Jan Janak ┬►[notmuch] [PATCH] Older versions of install do not support -C. (inbox, unread) - 2009-11-18 Carl Worth ╰─► ... (inbox, unread) - 2009-11-17 Aron Griffis ┬►[notmuch] archive (inbox, unread) - 2009-11-18 Keith Packard ╰┬► ... (inbox, unread) - 2009-11-18 Carl Worth ╰─► ... (inbox, unread) - 2009-11-17 Keith Packard ┬►[notmuch] [PATCH] Make notmuch-show 'X' (and 'x') commands remove inbox (and unread) tags (inbox, unread) - 2009-11-18 Carl Worth ╰─►[notmuch] [PATCH] Make notmuch-show 'X' (and 'x') commands remove inbox (and unread) tags (inbox, unread) - 2009-11-17 Lars Kellogg-Stedman ┬►[notmuch] Working with Maildir storage? (inbox, signed, unread) - 2009-11-17 Mikhail Gusarov ├┬► ... (inbox, signed, unread) - 2009-11-17 Lars Kellogg-Stedman │╰┬► ... (inbox, signed, unread) - 2009-11-17 Mikhail Gusarov │ ├─► ... (inbox, unread) - 2009-11-17 Keith Packard │ ╰┬► ... (inbox, unread) - 2009-11-18 Lars Kellogg-Stedman │ ╰─► ... (inbox, signed, unread) - 2009-11-18 Carl Worth ╰─► ... (inbox, unread) - 2009-11-17 Mikhail Gusarov ┬►[notmuch] [PATCH 1/2] Close message file after parsing message headers (inbox, unread) - 2009-11-17 Mikhail Gusarov ├─►[notmuch] [PATCH 2/2] Include <stdint.h> to get uint32_t in C++ file with gcc 4.4 (inbox, unread) - 2009-11-17 Carl Worth ╰┬►[notmuch] [PATCH 1/2] Close message file after parsing message headers (inbox, unread) - 2009-11-17 Keith Packard ╰┬► ... (inbox, unread) - 2009-11-18 Carl Worth ╰─► ... (inbox, unread) - 2009-11-18 Keith Packard ┬►[notmuch] [PATCH] Create a default notmuch-show-hook that highlights URLs and uses word-wrap (inbox, unread) - 2009-11-18 Alexander Botero-Low ╰─►[notmuch] [PATCH] Create a default notmuch-show-hook that highlights URLs and uses word-wrap (inbox, unread) - 2009-11-18 Alexander Botero-Low ─►[notmuch] request for pull (inbox, unread) - 2009-11-18 Jjgod Jiang ┬►[notmuch] Mac OS X/Darwin compatibility issues (inbox, unread) - 2009-11-18 Alexander Botero-Low ╰┬► ... (inbox, unread) - 2009-11-18 Jjgod Jiang ╰┬► ... (inbox, unread) - 2009-11-18 Alexander Botero-Low ╰─► ... (inbox, unread) - 2009-11-18 Rolland Santimano ─►[notmuch] Link to mailing list archives ? (inbox, unread) - 2009-11-18 Jan Janak ─►[notmuch] [PATCH] notmuch new: Support for conversion of spool subdirectories into tags (inbox, unread) - 2009-11-18 Stewart Smith ─►[notmuch] [PATCH] count_files: sort directory in inode order before statting (inbox, unread) - 2009-11-18 Stewart Smith ─►[notmuch] [PATCH 2/2] Read mail directory in inode number order (inbox, unread) - 2009-11-18 Stewart Smith ─►[notmuch] [PATCH] Fix linking with gcc to use g++ to link in C++ libs. (inbox, unread) - 2009-11-18 Lars Kellogg-Stedman ┬►[notmuch] "notmuch help" outputs to stderr? (attachment, inbox, signed, unread) - 2009-11-18 Lars Kellogg-Stedman ╰─► ... (attachment, inbox, signed, unread) - 2009-11-17 Mikhail Gusarov ─►[notmuch] [PATCH] Handle rename of message file (inbox, unread) - 2009-11-17 Alex Botero-Lowry ┬►[notmuch] preliminary FreeBSD support (attachment, inbox, unread) - 2009-11-17 Carl Worth ╰─► ... (inbox, unread) -End of search results. diff --git a/contrib/notmuch-pick/test/tree.expected-output/notmuch-tree-tag-inbox-tagged b/contrib/notmuch-pick/test/tree.expected-output/notmuch-tree-tag-inbox-tagged deleted file mode 100644 index 1f75a34..0000000 --- a/contrib/notmuch-pick/test/tree.expected-output/notmuch-tree-tag-inbox-tagged +++ /dev/null @@ -1,53 +0,0 @@ - 2010-12-29 François Boulogne ─►[aur-general] Guidelines: cp, mkdir vs install (inbox, unread) - 2010-12-16 Olivier Berger ─►Essai accentué (inbox, test_tag, unread) - 2009-11-18 Chris Wilson ─►[notmuch] [PATCH 1/2] Makefile: evaluate pkg-config once (inbox, unread) - 2009-11-18 Alex Botero-Lowry ┬►[notmuch] [PATCH] Error out if no query is supplied to search instead of going into an infinite loop (attachment, inbox, unread) - 2009-11-18 Carl Worth ╰─►[notmuch] [PATCH] Error out if no query is supplied to search instead of going into an infinite loop (inbox, unread) - 2009-11-17 Ingmar Vanhassel ┬►[notmuch] [PATCH] Typsos (inbox, unread) - 2009-11-18 Carl Worth ╰─► ... (inbox, unread) - 2009-11-17 Adrian Perez de Cast ┬►[notmuch] Introducing myself (inbox, signed, unread) - 2009-11-18 Keith Packard ├─► ... (inbox, unread) - 2009-11-18 Carl Worth ╰─► ... (inbox, unread) - 2009-11-17 Israel Herraiz ┬►[notmuch] New to the list (inbox, unread) - 2009-11-18 Keith Packard ├─► ... (inbox, unread) - 2009-11-18 Carl Worth ╰─► ... (inbox, unread) - 2009-11-17 Jan Janak ┬►[notmuch] What a great idea! (inbox, unread) - 2009-11-17 Jan Janak ├─► ... (inbox, unread) - 2009-11-18 Carl Worth ╰─► ... (inbox, unread) - 2009-11-17 Jan Janak ┬►[notmuch] [PATCH] Older versions of install do not support -C. (inbox, unread) - 2009-11-18 Carl Worth ╰─► ... (inbox, unread) - 2009-11-17 Aron Griffis ┬►[notmuch] archive (inbox, unread) - 2009-11-18 Keith Packard ╰┬► ... (inbox, unread) - 2009-11-18 Carl Worth ╰─► ... (inbox, unread) - 2009-11-17 Keith Packard ┬►[notmuch] [PATCH] Make notmuch-show 'X' (and 'x') commands remove inbox (and unread) tags (inbox, unread) - 2009-11-18 Carl Worth ╰─►[notmuch] [PATCH] Make notmuch-show 'X' (and 'x') commands remove inbox (and unread) tags (inbox, unread) - 2009-11-17 Lars Kellogg-Stedman ┬►[notmuch] Working with Maildir storage? (inbox, signed, unread) - 2009-11-17 Mikhail Gusarov ├┬► ... (inbox, signed, unread) - 2009-11-17 Lars Kellogg-Stedman │╰┬► ... (inbox, signed, unread) - 2009-11-17 Mikhail Gusarov │ ├─► ... (inbox, unread) - 2009-11-17 Keith Packard │ ╰┬► ... (inbox, unread) - 2009-11-18 Lars Kellogg-Stedman │ ╰─► ... (inbox, signed, unread) - 2009-11-18 Carl Worth ╰─► ... (inbox, unread) - 2009-11-17 Mikhail Gusarov ┬►[notmuch] [PATCH 1/2] Close message file after parsing message headers (inbox, unread) - 2009-11-17 Mikhail Gusarov ├─►[notmuch] [PATCH 2/2] Include <stdint.h> to get uint32_t in C++ file with gcc 4.4 (inbox, unread) - 2009-11-17 Carl Worth ╰┬►[notmuch] [PATCH 1/2] Close message file after parsing message headers (inbox, unread) - 2009-11-17 Keith Packard ╰┬► ... (inbox, unread) - 2009-11-18 Carl Worth ╰─► ... (inbox, unread) - 2009-11-18 Keith Packard ┬►[notmuch] [PATCH] Create a default notmuch-show-hook that highlights URLs and uses word-wrap (inbox, unread) - 2009-11-18 Alexander Botero-Low ╰─►[notmuch] [PATCH] Create a default notmuch-show-hook that highlights URLs and uses word-wrap (inbox, unread) - 2009-11-18 Alexander Botero-Low ─►[notmuch] request for pull (inbox, unread) - 2009-11-18 Jjgod Jiang ┬►[notmuch] Mac OS X/Darwin compatibility issues (inbox, unread) - 2009-11-18 Alexander Botero-Low ╰┬► ... (inbox, unread) - 2009-11-18 Jjgod Jiang ╰┬► ... (inbox, unread) - 2009-11-18 Alexander Botero-Low ╰─► ... (inbox, unread) - 2009-11-18 Rolland Santimano ─►[notmuch] Link to mailing list archives ? (inbox, unread) - 2009-11-18 Jan Janak ─►[notmuch] [PATCH] notmuch new: Support for conversion of spool subdirectories into tags (inbox, unread) - 2009-11-18 Stewart Smith ─►[notmuch] [PATCH] count_files: sort directory in inode order before statting (inbox, unread) - 2009-11-18 Stewart Smith ─►[notmuch] [PATCH 2/2] Read mail directory in inode number order (inbox, unread) - 2009-11-18 Stewart Smith ─►[notmuch] [PATCH] Fix linking with gcc to use g++ to link in C++ libs. (inbox, unread) - 2009-11-18 Lars Kellogg-Stedman ┬►[notmuch] "notmuch help" outputs to stderr? (attachment, inbox, signed, unread) - 2009-11-18 Lars Kellogg-Stedman ╰─► ... (attachment, inbox, signed, unread) - 2009-11-17 Mikhail Gusarov ─►[notmuch] [PATCH] Handle rename of message file (inbox, unread) - 2009-11-17 Alex Botero-Lowry ┬►[notmuch] preliminary FreeBSD support (attachment, inbox, unread) - 2009-11-17 Carl Worth ╰─► ... (inbox, unread) -End of search results. diff --git a/contrib/notmuch-pick/test/tree.expected-output/notmuch-tree-tag-inbox-thread-tagged b/contrib/notmuch-pick/test/tree.expected-output/notmuch-tree-tag-inbox-thread-tagged deleted file mode 100644 index a7aba6e..0000000 --- a/contrib/notmuch-pick/test/tree.expected-output/notmuch-tree-tag-inbox-thread-tagged +++ /dev/null @@ -1,53 +0,0 @@ - 2010-12-29 François Boulogne ─►[aur-general] Guidelines: cp, mkdir vs install (inbox, unread) - 2010-12-16 Olivier Berger ─►Essai accentué (inbox, unread) - 2009-11-18 Chris Wilson ─►[notmuch] [PATCH 1/2] Makefile: evaluate pkg-config once (inbox, unread) - 2009-11-18 Alex Botero-Lowry ┬►[notmuch] [PATCH] Error out if no query is supplied to search instead of going into an infinite loop (attachment, inbox, unread) - 2009-11-18 Carl Worth ╰─►[notmuch] [PATCH] Error out if no query is supplied to search instead of going into an infinite loop (inbox, unread) - 2009-11-17 Ingmar Vanhassel ┬►[notmuch] [PATCH] Typsos (inbox, unread) - 2009-11-18 Carl Worth ╰─► ... (inbox, unread) - 2009-11-17 Adrian Perez de Cast ┬►[notmuch] Introducing myself (inbox, signed, unread) - 2009-11-18 Keith Packard ├─► ... (inbox, unread) - 2009-11-18 Carl Worth ╰─► ... (inbox, unread) - 2009-11-17 Israel Herraiz ┬►[notmuch] New to the list (inbox, unread) - 2009-11-18 Keith Packard ├─► ... (inbox, unread) - 2009-11-18 Carl Worth ╰─► ... (inbox, unread) - 2009-11-17 Jan Janak ┬►[notmuch] What a great idea! (inbox, unread) - 2009-11-17 Jan Janak ├─► ... (inbox, unread) - 2009-11-18 Carl Worth ╰─► ... (inbox, unread) - 2009-11-17 Jan Janak ┬►[notmuch] [PATCH] Older versions of install do not support -C. (inbox, unread) - 2009-11-18 Carl Worth ╰─► ... (inbox, unread) - 2009-11-17 Aron Griffis ┬►[notmuch] archive (inbox, unread) - 2009-11-18 Keith Packard ╰┬► ... (inbox, unread) - 2009-11-18 Carl Worth ╰─► ... (inbox, unread) - 2009-11-17 Keith Packard ┬►[notmuch] [PATCH] Make notmuch-show 'X' (and 'x') commands remove inbox (and unread) tags (inbox, unread) - 2009-11-18 Carl Worth ╰─►[notmuch] [PATCH] Make notmuch-show 'X' (and 'x') commands remove inbox (and unread) tags (inbox, unread) - 2009-11-17 Lars Kellogg-Stedman ┬►[notmuch] Working with Maildir storage? (inbox, signed, test_thread_tag, unread) - 2009-11-17 Mikhail Gusarov ├┬► ... (inbox, signed, test_thread_tag, unread) - 2009-11-17 Lars Kellogg-Stedman │╰┬► ... (inbox, signed, test_thread_tag, unread) - 2009-11-17 Mikhail Gusarov │ ├─► ... (inbox, test_thread_tag, unread) - 2009-11-17 Keith Packard │ ╰┬► ... (inbox, test_thread_tag, unread) - 2009-11-18 Lars Kellogg-Stedman │ ╰─► ... (inbox, signed, test_thread_tag, unread) - 2009-11-18 Carl Worth ╰─► ... (inbox, test_thread_tag, unread) - 2009-11-17 Mikhail Gusarov ┬►[notmuch] [PATCH 1/2] Close message file after parsing message headers (inbox, unread) - 2009-11-17 Mikhail Gusarov ├─►[notmuch] [PATCH 2/2] Include <stdint.h> to get uint32_t in C++ file with gcc 4.4 (inbox, unread) - 2009-11-17 Carl Worth ╰┬►[notmuch] [PATCH 1/2] Close message file after parsing message headers (inbox, unread) - 2009-11-17 Keith Packard ╰┬► ... (inbox, unread) - 2009-11-18 Carl Worth ╰─► ... (inbox, unread) - 2009-11-18 Keith Packard ┬►[notmuch] [PATCH] Create a default notmuch-show-hook that highlights URLs and uses word-wrap (inbox, unread) - 2009-11-18 Alexander Botero-Low ╰─►[notmuch] [PATCH] Create a default notmuch-show-hook that highlights URLs and uses word-wrap (inbox, unread) - 2009-11-18 Alexander Botero-Low ─►[notmuch] request for pull (inbox, unread) - 2009-11-18 Jjgod Jiang ┬►[notmuch] Mac OS X/Darwin compatibility issues (inbox, unread) - 2009-11-18 Alexander Botero-Low ╰┬► ... (inbox, unread) - 2009-11-18 Jjgod Jiang ╰┬► ... (inbox, unread) - 2009-11-18 Alexander Botero-Low ╰─► ... (inbox, unread) - 2009-11-18 Rolland Santimano ─►[notmuch] Link to mailing list archives ? (inbox, unread) - 2009-11-18 Jan Janak ─►[notmuch] [PATCH] notmuch new: Support for conversion of spool subdirectories into tags (inbox, unread) - 2009-11-18 Stewart Smith ─►[notmuch] [PATCH] count_files: sort directory in inode order before statting (inbox, unread) - 2009-11-18 Stewart Smith ─►[notmuch] [PATCH 2/2] Read mail directory in inode number order (inbox, unread) - 2009-11-18 Stewart Smith ─►[notmuch] [PATCH] Fix linking with gcc to use g++ to link in C++ libs. (inbox, unread) - 2009-11-18 Lars Kellogg-Stedman ┬►[notmuch] "notmuch help" outputs to stderr? (attachment, inbox, signed, unread) - 2009-11-18 Lars Kellogg-Stedman ╰─► ... (attachment, inbox, signed, unread) - 2009-11-17 Mikhail Gusarov ─►[notmuch] [PATCH] Handle rename of message file (inbox, unread) - 2009-11-17 Alex Botero-Lowry ┬►[notmuch] preliminary FreeBSD support (attachment, inbox, unread) - 2009-11-17 Carl Worth ╰─► ... (inbox, unread) -End of search results. diff --git a/test/emacs-tree b/test/emacs-tree new file mode 100755 index 0000000..05ce85d --- /dev/null +++ b/test/emacs-tree @@ -0,0 +1,210 @@ +#!/usr/bin/env bash + +test_description="emacs tree view interface" +. test-lib.sh + +EXPECTED=$TEST_DIRECTORY/tree.expected-output + +add_email_corpus +test_begin_subtest "Do we have emacs" +test_emacs '(insert "hello\n") + (test-output)' +cat <<EOF >EXPECTED +hello +EOF +test_expect_equal_file OUTPUT EXPECTED + +test_begin_subtest "Basic notmuch-tree view in emacs" +test_emacs '(add-to-list (quote load-path) "'$PICK_DIR'") + (require (quote notmuch-tree)) + (notmuch-tree "tag:inbox") + (notmuch-test-wait) + (test-output) + (delete-other-windows)' +test_expect_equal_file OUTPUT $EXPECTED/notmuch-tree-tag-inbox + +test_begin_subtest "Refreshed notmuch-tree view in emacs" +test_emacs '(add-to-list (quote load-path) "'$PICK_DIR'") + (require (quote notmuch-tree)) + (notmuch-tree "tag:inbox") + (notmuch-test-wait) + (notmuch-tree-refresh-view) + (notmuch-test-wait) + (test-output) + (delete-other-windows)' +test_expect_equal_file OUTPUT $EXPECTED/notmuch-tree-tag-inbox + +# In the following tag tests we make sure the display is updated +# correctly and, in a separate test, that the database is updated +# correctly. + +test_begin_subtest "Tag message in notmuch tree view (display)" +test_emacs '(add-to-list (quote load-path) "'$PICK_DIR'") + (require (quote notmuch-tree)) + (notmuch-tree "tag:inbox") + (notmuch-test-wait) + (forward-line) + (notmuch-tree-tag (list "+test_tag")) + (test-output) + (delete-other-windows)' +test_expect_equal_file OUTPUT $EXPECTED/notmuch-tree-tag-inbox-tagged + +test_begin_subtest "Tag message in notmuch tree view (database)" +output=$(notmuch search --output=messages 'tag:test_tag') +test_expect_equal "$output" "id:877h1wv7mg.fsf@inf-8657.int-evry.fr" + +test_begin_subtest "Untag message in notmuch tree view" +test_emacs '(add-to-list (quote load-path) "'$PICK_DIR'") + (require (quote notmuch-tree)) + (notmuch-tree "tag:inbox") + (notmuch-test-wait) + (forward-line) + (notmuch-tree-tag (list "-test_tag")) + (test-output) + (delete-other-windows)' +test_expect_equal_file OUTPUT $EXPECTED/notmuch-tree-tag-inbox + +test_begin_subtest "Untag message in notmuch tree view (database)" +output=$(notmuch search --output=messages 'tag:test_tag') +test_expect_equal "$output" "" + +test_begin_subtest "Tag thread in notmuch tree view" +test_emacs '(add-to-list (quote load-path) "'$PICK_DIR'") + (require (quote notmuch-tree)) + (notmuch-tree "tag:inbox") + (notmuch-test-wait) + ;; move to a sizable thread + (forward-line 26) + (notmuch-tree-tag-thread (list "+test_thread_tag")) + (test-output) + (delete-other-windows)' +test_expect_equal_file OUTPUT $EXPECTED/notmuch-tree-tag-inbox-thread-tagged + +test_begin_subtest "Tag message in notmuch tree view (database)" +output=$(notmuch search --output=messages 'tag:test_thread_tag') +test_expect_equal "$output" \ +"id:87ocn0qh6d.fsf@yoom.home.cworth.org +id:20091118005040.GA25380@dottiness.seas.harvard.edu +id:yunaayketfm.fsf@aiko.keithp.com +id:87fx8can9z.fsf@vertex.dottedmag +id:20091117203301.GV3165@dottiness.seas.harvard.edu +id:87iqd9rn3l.fsf@vertex.dottedmag +id:20091117190054.GU3165@dottiness.seas.harvard.edu" + +test_begin_subtest "Untag thread in notmuch tree view" +test_emacs '(add-to-list (quote load-path) "'$PICK_DIR'") + (require (quote notmuch-tree)) + (notmuch-tree "tag:inbox") + (notmuch-test-wait) + ;; move to the same sizable thread as above + (forward-line 26) + (notmuch-tree-tag-thread (list "-test_thread_tag")) + (test-output) + (delete-other-windows)' +test_expect_equal_file OUTPUT $EXPECTED/notmuch-tree-tag-inbox + +test_begin_subtest "Untag message in notmuch tree view (database)" +output=$(notmuch search --output=messages 'tag:test_thread_tag') +test_expect_equal "$output" "" + +test_begin_subtest "Navigation of notmuch-hello to search results" +test_emacs '(notmuch-hello) + (goto-char (point-min)) + (re-search-forward "inbox") + (widget-button-press (1- (point))) + (notmuch-test-wait) + (notmuch-tree-from-search-current-query) + (notmuch-test-wait) + (test-output) + (delete-other-windows)' +test_expect_equal_file OUTPUT $EXPECTED/notmuch-tree-tag-inbox + +test_begin_subtest "Tree view of a single thread (from search)" +test_emacs '(notmuch-hello) + (goto-char (point-min)) + (re-search-forward "inbox") + (widget-button-press (1- (point))) + (notmuch-test-wait) + (notmuch-tree-from-search-thread) + (notmuch-test-wait) + (test-output) + (delete-other-windows)' +test_expect_equal_file OUTPUT $EXPECTED/notmuch-tree-single-thread + +test_begin_subtest "Tree view of a single thread (from show)" +test_emacs '(notmuch-hello) + (goto-char (point-min)) + (re-search-forward "inbox") + (widget-button-press (1- (point))) + (notmuch-test-wait) + (notmuch-search-show-thread) + (notmuch-tree-from-show-current-query) + (notmuch-test-wait) + (test-output) + (delete-other-windows)' +test_expect_equal_file OUTPUT $EXPECTED/notmuch-tree-single-thread + +test_begin_subtest "Message window of tree view" +test_emacs '(notmuch-hello) + (goto-char (point-min)) + (re-search-forward "inbox") + (widget-button-press (1- (point))) + (notmuch-test-wait) + (notmuch-search-next-thread) + (notmuch-tree-from-search-thread) + (notmuch-test-wait) + (select-window notmuch-tree-message-window) + (test-output) + (delete-other-windows)' +cp OUTPUT /tmp/mjwout +test_expect_equal_file OUTPUT $EXPECTED/notmuch-tree-show-window + +test_begin_subtest "Stash id" +output=$(test_emacs '(add-to-list (quote load-path) "'$PICK_DIR'") + (require (quote notmuch-tree)) + (notmuch-tree "id:1258498485-sup-142@elly") + (notmuch-test-wait) + (notmuch-show-stash-message-id)') +test_expect_equal "$output" "\"Stashed: id:1258498485-sup-142@elly\"" + +test_begin_subtest "Move to next matching message" +output=$(test_emacs '(add-to-list (quote load-path) "'$PICK_DIR'") + (require (quote notmuch-tree)) + (notmuch-tree "from:cworth") + (notmuch-test-wait) + (notmuch-tree-next-matching-message) + (notmuch-show-stash-message-id)') +test_expect_equal "$output" "\"Stashed: id:878we4qdqf.fsf@yoom.home.cworth.org\"" + +test_begin_subtest "Move to next thread" +output=$(test_emacs '(add-to-list (quote load-path) "'$PICK_DIR'") + (require (quote notmuch-tree)) + (notmuch-tree "tag:inbox") + (notmuch-test-wait) + (forward-line 26) + (notmuch-tree-next-thread) + (notmuch-show-stash-message-id)') +test_expect_equal "$output" "\"Stashed: id:1258471718-6781-1-git-send-email-dottedmag@dottedmag.net\"" + +test_begin_subtest "Move to previous thread" +output=$(test_emacs '(add-to-list (quote load-path) "'$PICK_DIR'") + (require (quote notmuch-tree)) + (notmuch-tree "tag:inbox") + (notmuch-test-wait) + (forward-line 26) + (notmuch-tree-prev-thread) + (notmuch-show-stash-message-id)') +test_expect_equal "$output" "\"Stashed: id:20091117190054.GU3165@dottiness.seas.harvard.edu\"" + +test_begin_subtest "Move to previous previous thread" +output=$(test_emacs '(add-to-list (quote load-path) "'$PICK_DIR'") + (require (quote notmuch-tree)) + (notmuch-tree "tag:inbox") + (notmuch-test-wait) + (forward-line 26) + (notmuch-tree-prev-thread) + (notmuch-tree-prev-thread) + (notmuch-show-stash-message-id)') +test_expect_equal "$output" "\"Stashed: id:1258493565-13508-1-git-send-email-keithp@keithp.com\"" + +test_done diff --git a/test/notmuch-test b/test/notmuch-test index aa28bb0..1db6e90 100755 --- a/test/notmuch-test +++ b/test/notmuch-test @@ -62,6 +62,7 @@ TESTS=" emacs-address-cleaning emacs-hello emacs-show + emacs-tree missing-headers hex-escaping parse-time-string diff --git a/test/tree.expected-output/notmuch-tree-show-window b/test/tree.expected-output/notmuch-tree-show-window new file mode 100644 index 0000000..e16792b --- /dev/null +++ b/test/tree.expected-output/notmuch-tree-show-window @@ -0,0 +1,40 @@ +Lars Kellogg-Stedman <lars@seas.harvard.edu> (2009-11-17) (inbox signed) +Subject: [notmuch] Working with Maildir storage? +To: notmuch@notmuchmail.org +Date: Tue, 17 Nov 2009 14:00:54 -0500 + +[ multipart/mixed ] +[ multipart/signed ] +[ text/plain ] +I saw the LWN article and decided to take a look at notmuch. I'm +currently using mutt and mairix to index and read a collection of +Maildir mail folders (around 40,000 messages total). + +notmuch indexed the messages without complaint, but my attempt at +searching bombed out. Running, for example: + + notmuch search storage + +Resulted in 4604 lines of errors along the lines of: + + Error opening + /home/lars/Mail/read-messages.2008/cur/1246413773.24928_27334.hostname,U=3026:2,S: + Too many open files + +I'm curious if this is expected behavior (i.e., notmuch does not work +with Maildir) or if something else is going on. + +Cheers, + +[ 4-line signature. Click/Enter to show. ] +-- +Lars Kellogg-Stedman <lars@seas.harvard.edu> +Senior Technologist, Computing and Information Technology +Harvard University School of Engineering and Applied Sciences +[ application/pgp-signature ] +[ text/plain ] +[ 4-line signature. Click/Enter to show. ] +_______________________________________________ +notmuch mailing list +notmuch@notmuchmail.org +http://notmuchmail.org/mailman/listinfo/notmuch diff --git a/test/tree.expected-output/notmuch-tree-single-thread b/test/tree.expected-output/notmuch-tree-single-thread new file mode 100644 index 0000000..c9e5ef8 --- /dev/null +++ b/test/tree.expected-output/notmuch-tree-single-thread @@ -0,0 +1,6 @@ + 2009-11-17 Mikhail Gusarov ┬►[notmuch] [PATCH 1/2] Close message file after parsing message headers (inbox) + 2009-11-17 Mikhail Gusarov ├─►[notmuch] [PATCH 2/2] Include <stdint.h> to get uint32_t in C++ file with gcc 4.4 (inbox, unread) + 2009-11-17 Carl Worth ╰┬►[notmuch] [PATCH 1/2] Close message file after parsing message headers (inbox, unread) + 2009-11-17 Keith Packard ╰┬► ... (inbox, unread) + 2009-11-18 Carl Worth ╰─► ... (inbox, unread) +End of search results. diff --git a/test/tree.expected-output/notmuch-tree-tag-inbox b/test/tree.expected-output/notmuch-tree-tag-inbox new file mode 100644 index 0000000..484141e --- /dev/null +++ b/test/tree.expected-output/notmuch-tree-tag-inbox @@ -0,0 +1,53 @@ + 2010-12-29 François Boulogne ─►[aur-general] Guidelines: cp, mkdir vs install (inbox, unread) + 2010-12-16 Olivier Berger ─►Essai accentué (inbox, unread) + 2009-11-18 Chris Wilson ─►[notmuch] [PATCH 1/2] Makefile: evaluate pkg-config once (inbox, unread) + 2009-11-18 Alex Botero-Lowry ┬►[notmuch] [PATCH] Error out if no query is supplied to search instead of going into an infinite loop (attachment, inbox, unread) + 2009-11-18 Carl Worth ╰─►[notmuch] [PATCH] Error out if no query is supplied to search instead of going into an infinite loop (inbox, unread) + 2009-11-17 Ingmar Vanhassel ┬►[notmuch] [PATCH] Typsos (inbox, unread) + 2009-11-18 Carl Worth ╰─► ... (inbox, unread) + 2009-11-17 Adrian Perez de Cast ┬►[notmuch] Introducing myself (inbox, signed, unread) + 2009-11-18 Keith Packard ├─► ... (inbox, unread) + 2009-11-18 Carl Worth ╰─► ... (inbox, unread) + 2009-11-17 Israel Herraiz ┬►[notmuch] New to the list (inbox, unread) + 2009-11-18 Keith Packard ├─► ... (inbox, unread) + 2009-11-18 Carl Worth ╰─► ... (inbox, unread) + 2009-11-17 Jan Janak ┬►[notmuch] What a great idea! (inbox, unread) + 2009-11-17 Jan Janak ├─► ... (inbox, unread) + 2009-11-18 Carl Worth ╰─► ... (inbox, unread) + 2009-11-17 Jan Janak ┬►[notmuch] [PATCH] Older versions of install do not support -C. (inbox, unread) + 2009-11-18 Carl Worth ╰─► ... (inbox, unread) + 2009-11-17 Aron Griffis ┬►[notmuch] archive (inbox, unread) + 2009-11-18 Keith Packard ╰┬► ... (inbox, unread) + 2009-11-18 Carl Worth ╰─► ... (inbox, unread) + 2009-11-17 Keith Packard ┬►[notmuch] [PATCH] Make notmuch-show 'X' (and 'x') commands remove inbox (and unread) tags (inbox, unread) + 2009-11-18 Carl Worth ╰─►[notmuch] [PATCH] Make notmuch-show 'X' (and 'x') commands remove inbox (and unread) tags (inbox, unread) + 2009-11-17 Lars Kellogg-Stedman ┬►[notmuch] Working with Maildir storage? (inbox, signed, unread) + 2009-11-17 Mikhail Gusarov ├┬► ... (inbox, signed, unread) + 2009-11-17 Lars Kellogg-Stedman │╰┬► ... (inbox, signed, unread) + 2009-11-17 Mikhail Gusarov │ ├─► ... (inbox, unread) + 2009-11-17 Keith Packard │ ╰┬► ... (inbox, unread) + 2009-11-18 Lars Kellogg-Stedman │ ╰─► ... (inbox, signed, unread) + 2009-11-18 Carl Worth ╰─► ... (inbox, unread) + 2009-11-17 Mikhail Gusarov ┬►[notmuch] [PATCH 1/2] Close message file after parsing message headers (inbox, unread) + 2009-11-17 Mikhail Gusarov ├─►[notmuch] [PATCH 2/2] Include <stdint.h> to get uint32_t in C++ file with gcc 4.4 (inbox, unread) + 2009-11-17 Carl Worth ╰┬►[notmuch] [PATCH 1/2] Close message file after parsing message headers (inbox, unread) + 2009-11-17 Keith Packard ╰┬► ... (inbox, unread) + 2009-11-18 Carl Worth ╰─► ... (inbox, unread) + 2009-11-18 Keith Packard ┬►[notmuch] [PATCH] Create a default notmuch-show-hook that highlights URLs and uses word-wrap (inbox, unread) + 2009-11-18 Alexander Botero-Low ╰─►[notmuch] [PATCH] Create a default notmuch-show-hook that highlights URLs and uses word-wrap (inbox, unread) + 2009-11-18 Alexander Botero-Low ─►[notmuch] request for pull (inbox, unread) + 2009-11-18 Jjgod Jiang ┬►[notmuch] Mac OS X/Darwin compatibility issues (inbox, unread) + 2009-11-18 Alexander Botero-Low ╰┬► ... (inbox, unread) + 2009-11-18 Jjgod Jiang ╰┬► ... (inbox, unread) + 2009-11-18 Alexander Botero-Low ╰─► ... (inbox, unread) + 2009-11-18 Rolland Santimano ─►[notmuch] Link to mailing list archives ? (inbox, unread) + 2009-11-18 Jan Janak ─►[notmuch] [PATCH] notmuch new: Support for conversion of spool subdirectories into tags (inbox, unread) + 2009-11-18 Stewart Smith ─►[notmuch] [PATCH] count_files: sort directory in inode order before statting (inbox, unread) + 2009-11-18 Stewart Smith ─►[notmuch] [PATCH 2/2] Read mail directory in inode number order (inbox, unread) + 2009-11-18 Stewart Smith ─►[notmuch] [PATCH] Fix linking with gcc to use g++ to link in C++ libs. (inbox, unread) + 2009-11-18 Lars Kellogg-Stedman ┬►[notmuch] "notmuch help" outputs to stderr? (attachment, inbox, signed, unread) + 2009-11-18 Lars Kellogg-Stedman ╰─► ... (attachment, inbox, signed, unread) + 2009-11-17 Mikhail Gusarov ─►[notmuch] [PATCH] Handle rename of message file (inbox, unread) + 2009-11-17 Alex Botero-Lowry ┬►[notmuch] preliminary FreeBSD support (attachment, inbox, unread) + 2009-11-17 Carl Worth ╰─► ... (inbox, unread) +End of search results. diff --git a/test/tree.expected-output/notmuch-tree-tag-inbox-tagged b/test/tree.expected-output/notmuch-tree-tag-inbox-tagged new file mode 100644 index 0000000..1f75a34 --- /dev/null +++ b/test/tree.expected-output/notmuch-tree-tag-inbox-tagged @@ -0,0 +1,53 @@ + 2010-12-29 François Boulogne ─►[aur-general] Guidelines: cp, mkdir vs install (inbox, unread) + 2010-12-16 Olivier Berger ─►Essai accentué (inbox, test_tag, unread) + 2009-11-18 Chris Wilson ─►[notmuch] [PATCH 1/2] Makefile: evaluate pkg-config once (inbox, unread) + 2009-11-18 Alex Botero-Lowry ┬►[notmuch] [PATCH] Error out if no query is supplied to search instead of going into an infinite loop (attachment, inbox, unread) + 2009-11-18 Carl Worth ╰─►[notmuch] [PATCH] Error out if no query is supplied to search instead of going into an infinite loop (inbox, unread) + 2009-11-17 Ingmar Vanhassel ┬►[notmuch] [PATCH] Typsos (inbox, unread) + 2009-11-18 Carl Worth ╰─► ... (inbox, unread) + 2009-11-17 Adrian Perez de Cast ┬►[notmuch] Introducing myself (inbox, signed, unread) + 2009-11-18 Keith Packard ├─► ... (inbox, unread) + 2009-11-18 Carl Worth ╰─► ... (inbox, unread) + 2009-11-17 Israel Herraiz ┬►[notmuch] New to the list (inbox, unread) + 2009-11-18 Keith Packard ├─► ... (inbox, unread) + 2009-11-18 Carl Worth ╰─► ... (inbox, unread) + 2009-11-17 Jan Janak ┬►[notmuch] What a great idea! (inbox, unread) + 2009-11-17 Jan Janak ├─► ... (inbox, unread) + 2009-11-18 Carl Worth ╰─► ... (inbox, unread) + 2009-11-17 Jan Janak ┬►[notmuch] [PATCH] Older versions of install do not support -C. (inbox, unread) + 2009-11-18 Carl Worth ╰─► ... (inbox, unread) + 2009-11-17 Aron Griffis ┬►[notmuch] archive (inbox, unread) + 2009-11-18 Keith Packard ╰┬► ... (inbox, unread) + 2009-11-18 Carl Worth ╰─► ... (inbox, unread) + 2009-11-17 Keith Packard ┬►[notmuch] [PATCH] Make notmuch-show 'X' (and 'x') commands remove inbox (and unread) tags (inbox, unread) + 2009-11-18 Carl Worth ╰─►[notmuch] [PATCH] Make notmuch-show 'X' (and 'x') commands remove inbox (and unread) tags (inbox, unread) + 2009-11-17 Lars Kellogg-Stedman ┬►[notmuch] Working with Maildir storage? (inbox, signed, unread) + 2009-11-17 Mikhail Gusarov ├┬► ... (inbox, signed, unread) + 2009-11-17 Lars Kellogg-Stedman │╰┬► ... (inbox, signed, unread) + 2009-11-17 Mikhail Gusarov │ ├─► ... (inbox, unread) + 2009-11-17 Keith Packard │ ╰┬► ... (inbox, unread) + 2009-11-18 Lars Kellogg-Stedman │ ╰─► ... (inbox, signed, unread) + 2009-11-18 Carl Worth ╰─► ... (inbox, unread) + 2009-11-17 Mikhail Gusarov ┬►[notmuch] [PATCH 1/2] Close message file after parsing message headers (inbox, unread) + 2009-11-17 Mikhail Gusarov ├─►[notmuch] [PATCH 2/2] Include <stdint.h> to get uint32_t in C++ file with gcc 4.4 (inbox, unread) + 2009-11-17 Carl Worth ╰┬►[notmuch] [PATCH 1/2] Close message file after parsing message headers (inbox, unread) + 2009-11-17 Keith Packard ╰┬► ... (inbox, unread) + 2009-11-18 Carl Worth ╰─► ... (inbox, unread) + 2009-11-18 Keith Packard ┬►[notmuch] [PATCH] Create a default notmuch-show-hook that highlights URLs and uses word-wrap (inbox, unread) + 2009-11-18 Alexander Botero-Low ╰─►[notmuch] [PATCH] Create a default notmuch-show-hook that highlights URLs and uses word-wrap (inbox, unread) + 2009-11-18 Alexander Botero-Low ─►[notmuch] request for pull (inbox, unread) + 2009-11-18 Jjgod Jiang ┬►[notmuch] Mac OS X/Darwin compatibility issues (inbox, unread) + 2009-11-18 Alexander Botero-Low ╰┬► ... (inbox, unread) + 2009-11-18 Jjgod Jiang ╰┬► ... (inbox, unread) + 2009-11-18 Alexander Botero-Low ╰─► ... (inbox, unread) + 2009-11-18 Rolland Santimano ─►[notmuch] Link to mailing list archives ? (inbox, unread) + 2009-11-18 Jan Janak ─►[notmuch] [PATCH] notmuch new: Support for conversion of spool subdirectories into tags (inbox, unread) + 2009-11-18 Stewart Smith ─►[notmuch] [PATCH] count_files: sort directory in inode order before statting (inbox, unread) + 2009-11-18 Stewart Smith ─►[notmuch] [PATCH 2/2] Read mail directory in inode number order (inbox, unread) + 2009-11-18 Stewart Smith ─►[notmuch] [PATCH] Fix linking with gcc to use g++ to link in C++ libs. (inbox, unread) + 2009-11-18 Lars Kellogg-Stedman ┬►[notmuch] "notmuch help" outputs to stderr? (attachment, inbox, signed, unread) + 2009-11-18 Lars Kellogg-Stedman ╰─► ... (attachment, inbox, signed, unread) + 2009-11-17 Mikhail Gusarov ─►[notmuch] [PATCH] Handle rename of message file (inbox, unread) + 2009-11-17 Alex Botero-Lowry ┬►[notmuch] preliminary FreeBSD support (attachment, inbox, unread) + 2009-11-17 Carl Worth ╰─► ... (inbox, unread) +End of search results. diff --git a/test/tree.expected-output/notmuch-tree-tag-inbox-thread-tagged b/test/tree.expected-output/notmuch-tree-tag-inbox-thread-tagged new file mode 100644 index 0000000..a7aba6e --- /dev/null +++ b/test/tree.expected-output/notmuch-tree-tag-inbox-thread-tagged @@ -0,0 +1,53 @@ + 2010-12-29 François Boulogne ─►[aur-general] Guidelines: cp, mkdir vs install (inbox, unread) + 2010-12-16 Olivier Berger ─►Essai accentué (inbox, unread) + 2009-11-18 Chris Wilson ─►[notmuch] [PATCH 1/2] Makefile: evaluate pkg-config once (inbox, unread) + 2009-11-18 Alex Botero-Lowry ┬►[notmuch] [PATCH] Error out if no query is supplied to search instead of going into an infinite loop (attachment, inbox, unread) + 2009-11-18 Carl Worth ╰─►[notmuch] [PATCH] Error out if no query is supplied to search instead of going into an infinite loop (inbox, unread) + 2009-11-17 Ingmar Vanhassel ┬►[notmuch] [PATCH] Typsos (inbox, unread) + 2009-11-18 Carl Worth ╰─► ... (inbox, unread) + 2009-11-17 Adrian Perez de Cast ┬►[notmuch] Introducing myself (inbox, signed, unread) + 2009-11-18 Keith Packard ├─► ... (inbox, unread) + 2009-11-18 Carl Worth ╰─► ... (inbox, unread) + 2009-11-17 Israel Herraiz ┬►[notmuch] New to the list (inbox, unread) + 2009-11-18 Keith Packard ├─► ... (inbox, unread) + 2009-11-18 Carl Worth ╰─► ... (inbox, unread) + 2009-11-17 Jan Janak ┬►[notmuch] What a great idea! (inbox, unread) + 2009-11-17 Jan Janak ├─► ... (inbox, unread) + 2009-11-18 Carl Worth ╰─► ... (inbox, unread) + 2009-11-17 Jan Janak ┬►[notmuch] [PATCH] Older versions of install do not support -C. (inbox, unread) + 2009-11-18 Carl Worth ╰─► ... (inbox, unread) + 2009-11-17 Aron Griffis ┬►[notmuch] archive (inbox, unread) + 2009-11-18 Keith Packard ╰┬► ... (inbox, unread) + 2009-11-18 Carl Worth ╰─► ... (inbox, unread) + 2009-11-17 Keith Packard ┬►[notmuch] [PATCH] Make notmuch-show 'X' (and 'x') commands remove inbox (and unread) tags (inbox, unread) + 2009-11-18 Carl Worth ╰─►[notmuch] [PATCH] Make notmuch-show 'X' (and 'x') commands remove inbox (and unread) tags (inbox, unread) + 2009-11-17 Lars Kellogg-Stedman ┬►[notmuch] Working with Maildir storage? (inbox, signed, test_thread_tag, unread) + 2009-11-17 Mikhail Gusarov ├┬► ... (inbox, signed, test_thread_tag, unread) + 2009-11-17 Lars Kellogg-Stedman │╰┬► ... (inbox, signed, test_thread_tag, unread) + 2009-11-17 Mikhail Gusarov │ ├─► ... (inbox, test_thread_tag, unread) + 2009-11-17 Keith Packard │ ╰┬► ... (inbox, test_thread_tag, unread) + 2009-11-18 Lars Kellogg-Stedman │ ╰─► ... (inbox, signed, test_thread_tag, unread) + 2009-11-18 Carl Worth ╰─► ... (inbox, test_thread_tag, unread) + 2009-11-17 Mikhail Gusarov ┬►[notmuch] [PATCH 1/2] Close message file after parsing message headers (inbox, unread) + 2009-11-17 Mikhail Gusarov ├─►[notmuch] [PATCH 2/2] Include <stdint.h> to get uint32_t in C++ file with gcc 4.4 (inbox, unread) + 2009-11-17 Carl Worth ╰┬►[notmuch] [PATCH 1/2] Close message file after parsing message headers (inbox, unread) + 2009-11-17 Keith Packard ╰┬► ... (inbox, unread) + 2009-11-18 Carl Worth ╰─► ... (inbox, unread) + 2009-11-18 Keith Packard ┬►[notmuch] [PATCH] Create a default notmuch-show-hook that highlights URLs and uses word-wrap (inbox, unread) + 2009-11-18 Alexander Botero-Low ╰─►[notmuch] [PATCH] Create a default notmuch-show-hook that highlights URLs and uses word-wrap (inbox, unread) + 2009-11-18 Alexander Botero-Low ─►[notmuch] request for pull (inbox, unread) + 2009-11-18 Jjgod Jiang ┬►[notmuch] Mac OS X/Darwin compatibility issues (inbox, unread) + 2009-11-18 Alexander Botero-Low ╰┬► ... (inbox, unread) + 2009-11-18 Jjgod Jiang ╰┬► ... (inbox, unread) + 2009-11-18 Alexander Botero-Low ╰─► ... (inbox, unread) + 2009-11-18 Rolland Santimano ─►[notmuch] Link to mailing list archives ? (inbox, unread) + 2009-11-18 Jan Janak ─►[notmuch] [PATCH] notmuch new: Support for conversion of spool subdirectories into tags (inbox, unread) + 2009-11-18 Stewart Smith ─►[notmuch] [PATCH] count_files: sort directory in inode order before statting (inbox, unread) + 2009-11-18 Stewart Smith ─►[notmuch] [PATCH 2/2] Read mail directory in inode number order (inbox, unread) + 2009-11-18 Stewart Smith ─►[notmuch] [PATCH] Fix linking with gcc to use g++ to link in C++ libs. (inbox, unread) + 2009-11-18 Lars Kellogg-Stedman ┬►[notmuch] "notmuch help" outputs to stderr? (attachment, inbox, signed, unread) + 2009-11-18 Lars Kellogg-Stedman ╰─► ... (attachment, inbox, signed, unread) + 2009-11-17 Mikhail Gusarov ─►[notmuch] [PATCH] Handle rename of message file (inbox, unread) + 2009-11-17 Alex Botero-Lowry ┬►[notmuch] preliminary FreeBSD support (attachment, inbox, unread) + 2009-11-17 Carl Worth ╰─► ... (inbox, unread) +End of search results. -- 1.7.9.1 ^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH 06/11] emacs: tree: remove test for emacs from tree test 2013-10-29 22:55 [PATCH 00/11] Move notmuch-tree to mainline Mark Walters ` (4 preceding siblings ...) 2013-10-29 22:55 ` [PATCH 05/11] test: move emacs-tree test into mainline Mark Walters @ 2013-10-29 22:55 ` Mark Walters 2013-10-29 22:55 ` [PATCH 07/11] emacs: minimal change to autoload notmuch-tree Mark Walters ` (7 subsequent siblings) 13 siblings, 0 replies; 22+ messages in thread From: Mark Walters @ 2013-10-29 22:55 UTC (permalink / raw) To: notmuch Now the test is in mainline we can remove the check that emacs exists. --- test/emacs-tree | 7 ------- 1 files changed, 0 insertions(+), 7 deletions(-) diff --git a/test/emacs-tree b/test/emacs-tree index 05ce85d..4e3b624 100755 --- a/test/emacs-tree +++ b/test/emacs-tree @@ -6,13 +6,6 @@ test_description="emacs tree view interface" EXPECTED=$TEST_DIRECTORY/tree.expected-output add_email_corpus -test_begin_subtest "Do we have emacs" -test_emacs '(insert "hello\n") - (test-output)' -cat <<EOF >EXPECTED -hello -EOF -test_expect_equal_file OUTPUT EXPECTED test_begin_subtest "Basic notmuch-tree view in emacs" test_emacs '(add-to-list (quote load-path) "'$PICK_DIR'") -- 1.7.9.1 ^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH 07/11] emacs: minimal change to autoload notmuch-tree 2013-10-29 22:55 [PATCH 00/11] Move notmuch-tree to mainline Mark Walters ` (5 preceding siblings ...) 2013-10-29 22:55 ` [PATCH 06/11] emacs: tree: remove test for emacs from tree test Mark Walters @ 2013-10-29 22:55 ` Mark Walters 2013-10-29 22:55 ` [PATCH 08/11] test: tree: remove require from tests Mark Walters ` (6 subsequent siblings) 13 siblings, 0 replies; 22+ messages in thread From: Mark Walters @ 2013-10-29 22:55 UTC (permalink / raw) To: notmuch We want to autoload notmuch-tree.el so include it as a require in notmuch.el. To avoid circular dependency we need to move one keybinding from notmuch-tree.el to notmuch.el: it makes sense for it to be defined there anyway. Since tree is now autoloaded there is no need to print a message when it is loaded. --- emacs/notmuch-tree.el | 3 --- emacs/notmuch.el | 2 ++ 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/emacs/notmuch-tree.el b/emacs/notmuch-tree.el index d3330a0..ebfb5e7 100644 --- a/emacs/notmuch-tree.el +++ b/emacs/notmuch-tree.el @@ -29,7 +29,6 @@ (require 'notmuch-show) (require 'notmuch-tag) (require 'notmuch-parser) -(require 'notmuch) ;; XXX ATM, as notmuch-search-mode-map is defined here (eval-when-compile (require 'cl)) (declare-function notmuch-search "notmuch" (&optional query oldest-first target-thread target-line)) @@ -939,8 +938,6 @@ The arguments are: ;; Set up key bindings from the rest of notmuch. (define-key notmuch-common-keymap "z" 'notmuch-tree) -(define-key notmuch-search-mode-map "Z" 'notmuch-tree-from-search-current-query) (define-key notmuch-show-mode-map "Z" 'notmuch-tree-from-show-current-query) -(message "Initialised notmuch-tree") (provide 'notmuch-tree) diff --git a/emacs/notmuch.el b/emacs/notmuch.el index 19210cb..418c781 100644 --- a/emacs/notmuch.el +++ b/emacs/notmuch.el @@ -54,6 +54,7 @@ (require 'notmuch-lib) (require 'notmuch-tag) (require 'notmuch-show) +(require 'notmuch-tree) (require 'notmuch-mua) (require 'notmuch-hello) (require 'notmuch-maildir-fcc) @@ -156,6 +157,7 @@ To enter a line break in customize, press \\[quoted-insert] C-j." (define-key map "-" 'notmuch-search-remove-tag) (define-key map "+" 'notmuch-search-add-tag) (define-key map (kbd "RET") 'notmuch-search-show-thread) + (define-key map "Z" 'notmuch-tree-from-search-current-query) map) "Keymap for \"notmuch search\" buffers.") (fset 'notmuch-search-mode-map notmuch-search-mode-map) -- 1.7.9.1 ^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH 08/11] test: tree: remove require from tests 2013-10-29 22:55 [PATCH 00/11] Move notmuch-tree to mainline Mark Walters ` (6 preceding siblings ...) 2013-10-29 22:55 ` [PATCH 07/11] emacs: minimal change to autoload notmuch-tree Mark Walters @ 2013-10-29 22:55 ` Mark Walters 2013-10-29 22:55 ` [PATCH 09/11] emacs: move search based tree functions to notmuch.el Mark Walters ` (5 subsequent siblings) 13 siblings, 0 replies; 22+ messages in thread From: Mark Walters @ 2013-10-29 22:55 UTC (permalink / raw) To: notmuch Now tree is autoloaded we don't need to "require it" in the test. --- test/emacs-tree | 6 ------ 1 files changed, 0 insertions(+), 6 deletions(-) diff --git a/test/emacs-tree b/test/emacs-tree index 4e3b624..4bdfddd 100755 --- a/test/emacs-tree +++ b/test/emacs-tree @@ -9,7 +9,6 @@ add_email_corpus test_begin_subtest "Basic notmuch-tree view in emacs" test_emacs '(add-to-list (quote load-path) "'$PICK_DIR'") - (require (quote notmuch-tree)) (notmuch-tree "tag:inbox") (notmuch-test-wait) (test-output) @@ -18,7 +17,6 @@ test_expect_equal_file OUTPUT $EXPECTED/notmuch-tree-tag-inbox test_begin_subtest "Refreshed notmuch-tree view in emacs" test_emacs '(add-to-list (quote load-path) "'$PICK_DIR'") - (require (quote notmuch-tree)) (notmuch-tree "tag:inbox") (notmuch-test-wait) (notmuch-tree-refresh-view) @@ -33,7 +31,6 @@ test_expect_equal_file OUTPUT $EXPECTED/notmuch-tree-tag-inbox test_begin_subtest "Tag message in notmuch tree view (display)" test_emacs '(add-to-list (quote load-path) "'$PICK_DIR'") - (require (quote notmuch-tree)) (notmuch-tree "tag:inbox") (notmuch-test-wait) (forward-line) @@ -48,7 +45,6 @@ test_expect_equal "$output" "id:877h1wv7mg.fsf@inf-8657.int-evry.fr" test_begin_subtest "Untag message in notmuch tree view" test_emacs '(add-to-list (quote load-path) "'$PICK_DIR'") - (require (quote notmuch-tree)) (notmuch-tree "tag:inbox") (notmuch-test-wait) (forward-line) @@ -63,7 +59,6 @@ test_expect_equal "$output" "" test_begin_subtest "Tag thread in notmuch tree view" test_emacs '(add-to-list (quote load-path) "'$PICK_DIR'") - (require (quote notmuch-tree)) (notmuch-tree "tag:inbox") (notmuch-test-wait) ;; move to a sizable thread @@ -86,7 +81,6 @@ id:20091117190054.GU3165@dottiness.seas.harvard.edu" test_begin_subtest "Untag thread in notmuch tree view" test_emacs '(add-to-list (quote load-path) "'$PICK_DIR'") - (require (quote notmuch-tree)) (notmuch-tree "tag:inbox") (notmuch-test-wait) ;; move to the same sizable thread as above -- 1.7.9.1 ^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH 09/11] emacs: move search based tree functions to notmuch.el 2013-10-29 22:55 [PATCH 00/11] Move notmuch-tree to mainline Mark Walters ` (7 preceding siblings ...) 2013-10-29 22:55 ` [PATCH 08/11] test: tree: remove require from tests Mark Walters @ 2013-10-29 22:55 ` Mark Walters 2013-10-29 22:55 ` [PATCH 10/11] emacs: add z to common keymap Mark Walters ` (4 subsequent siblings) 13 siblings, 0 replies; 22+ messages in thread From: Mark Walters @ 2013-10-29 22:55 UTC (permalink / raw) To: notmuch Move a couple of the search mode specifc caller helpers for tree from tree into notmuch.el. --- emacs/notmuch-tree.el | 18 ------------------ emacs/notmuch.el | 14 ++++++++++++++ 2 files changed, 14 insertions(+), 18 deletions(-) diff --git a/emacs/notmuch-tree.el b/emacs/notmuch-tree.el index ebfb5e7..78b4a57 100644 --- a/emacs/notmuch-tree.el +++ b/emacs/notmuch-tree.el @@ -413,24 +413,6 @@ Does NOT change the database." notmuch-show-query-context (notmuch-show-get-message-id))) -;; This function should be in notmuch.el but be we trying to minimise -;; impact on the rest of the codebase. -(defun notmuch-tree-from-search-current-query () - "Call notmuch tree with the current query" - (interactive) - (notmuch-tree notmuch-search-query-string)) - -;; This function should be in notmuch.el but be we trying to minimise -;; impact on the rest of the codebase. -(defun notmuch-tree-from-search-thread () - "Show the selected thread with notmuch-tree" - (interactive) - (notmuch-tree (notmuch-search-find-thread-id) - notmuch-search-query-string - nil - (notmuch-prettify-subject (notmuch-search-find-subject)) - t)) - (defun notmuch-tree-message-window-kill-hook () "Close the message pane when exiting the show buffer." (let ((buffer (current-buffer))) diff --git a/emacs/notmuch.el b/emacs/notmuch.el index 418c781..2c9a07c 100644 --- a/emacs/notmuch.el +++ b/emacs/notmuch.el @@ -439,6 +439,20 @@ If BARE is set then do not prefix with \"thread:\"" (concat "*" (truncate-string-to-width subject 30 nil nil t) "*")) (message "End of search results.")))) +(defun notmuch-tree-from-search-current-query () + "Call notmuch tree with the current query" + (interactive) + (notmuch-tree notmuch-search-query-string)) + +(defun notmuch-tree-from-search-thread () + "Show the selected thread with notmuch-tree" + (interactive) + (notmuch-tree (notmuch-search-find-thread-id) + notmuch-search-query-string + nil + (notmuch-prettify-subject (notmuch-search-find-subject)) + t)) + (defun notmuch-search-reply-to-thread (&optional prompt-for-sender) "Begin composing a reply-all to the entire current thread in a new buffer." (interactive "P") -- 1.7.9.1 ^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH 10/11] emacs: add z to common keymap 2013-10-29 22:55 [PATCH 00/11] Move notmuch-tree to mainline Mark Walters ` (8 preceding siblings ...) 2013-10-29 22:55 ` [PATCH 09/11] emacs: move search based tree functions to notmuch.el Mark Walters @ 2013-10-29 22:55 ` Mark Walters 2013-10-29 22:55 ` [PATCH 11/11] emacs: move the show entry to tree into show.el Mark Walters ` (3 subsequent siblings) 13 siblings, 0 replies; 22+ messages in thread From: Mark Walters @ 2013-10-29 22:55 UTC (permalink / raw) To: notmuch Add the main entry "z" to notmuch-tree to the common keymap. --- emacs/notmuch-lib.el | 1 + emacs/notmuch-tree.el | 1 - 2 files changed, 1 insertions(+), 1 deletions(-) diff --git a/emacs/notmuch-lib.el b/emacs/notmuch-lib.el index e7c5c97..921ed20 100644 --- a/emacs/notmuch-lib.el +++ b/emacs/notmuch-lib.el @@ -133,6 +133,7 @@ For example, if you wanted to remove an \"inbox\" tag and add an (define-key map "?" 'notmuch-help) (define-key map "q" 'notmuch-kill-this-buffer) (define-key map "s" 'notmuch-search) + (define-key map "z" 'notmuch-tree) (define-key map "m" 'notmuch-mua-new-mail) (define-key map "=" 'notmuch-refresh-this-buffer) (define-key map "G" 'notmuch-poll-and-refresh-this-buffer) diff --git a/emacs/notmuch-tree.el b/emacs/notmuch-tree.el index 78b4a57..c66dd35 100644 --- a/emacs/notmuch-tree.el +++ b/emacs/notmuch-tree.el @@ -919,7 +919,6 @@ The arguments are: ;; Set up key bindings from the rest of notmuch. -(define-key notmuch-common-keymap "z" 'notmuch-tree) (define-key notmuch-show-mode-map "Z" 'notmuch-tree-from-show-current-query) (provide 'notmuch-tree) -- 1.7.9.1 ^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH 11/11] emacs: move the show entry to tree into show.el 2013-10-29 22:55 [PATCH 00/11] Move notmuch-tree to mainline Mark Walters ` (9 preceding siblings ...) 2013-10-29 22:55 ` [PATCH 10/11] emacs: add z to common keymap Mark Walters @ 2013-10-29 22:55 ` Mark Walters 2013-10-30 18:01 ` [PATCH 00/11] Move notmuch-tree to mainline Tomi Ollila ` (2 subsequent siblings) 13 siblings, 0 replies; 22+ messages in thread From: Mark Walters @ 2013-10-29 22:55 UTC (permalink / raw) To: notmuch Move the keybinding and show specific helper from tree.el to show.el --- emacs/notmuch-show.el | 10 ++++++++++ emacs/notmuch-tree.el | 12 +----------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/emacs/notmuch-show.el b/emacs/notmuch-show.el index 9e8b9c0..f00273a 100644 --- a/emacs/notmuch-show.el +++ b/emacs/notmuch-show.el @@ -44,6 +44,8 @@ (declare-function notmuch-foreach-mime-part "notmuch" (function mm-handle)) (declare-function notmuch-count-attachments "notmuch" (mm-handle)) (declare-function notmuch-save-attachments "notmuch" (mm-handle &optional queryp)) +(declare-function notmuch-tree "notmuch-tree" + (&optional query query-context target buffer-name open-target)) (defcustom notmuch-message-headers '("Subject" "To" "Cc" "Date") "Headers that should be shown in a message, in this order. @@ -1247,6 +1249,7 @@ reset based on the original query." (defvar notmuch-show-mode-map (let ((map (make-sparse-keymap))) (set-keymap-parent map notmuch-common-keymap) + (define-key map "Z" 'notmuch-tree-from-show-current-query) (define-key map (kbd "<C-tab>") 'widget-backward) (define-key map (kbd "M-TAB") 'notmuch-show-previous-button) (define-key map (kbd "<backtab>") 'notmuch-show-previous-button) @@ -1323,6 +1326,13 @@ All currently available key bindings: (setq buffer-read-only t truncate-lines t)) +(defun notmuch-tree-from-show-current-query () + "Call notmuch tree with the current query" + (interactive) + (notmuch-tree notmuch-show-thread-id + notmuch-show-query-context + (notmuch-show-get-message-id))) + (defun notmuch-show-move-to-message-top () (goto-char (notmuch-show-message-top))) diff --git a/emacs/notmuch-tree.el b/emacs/notmuch-tree.el index c66dd35..f13b41f 100644 --- a/emacs/notmuch-tree.el +++ b/emacs/notmuch-tree.el @@ -404,15 +404,6 @@ Does NOT change the database." (notmuch-tree-close-message-window) (notmuch-tree query))) -;; This function should be in notmuch-show.el but be we trying to -;; minimise impact on the rest of the codebase. -(defun notmuch-tree-from-show-current-query () - "Call notmuch tree with the current query" - (interactive) - (notmuch-tree notmuch-show-thread-id - notmuch-show-query-context - (notmuch-show-get-message-id))) - (defun notmuch-tree-message-window-kill-hook () "Close the message pane when exiting the show buffer." (let ((buffer (current-buffer))) @@ -918,7 +909,6 @@ The arguments are: (setq truncate-lines t)) -;; Set up key bindings from the rest of notmuch. -(define-key notmuch-show-mode-map "Z" 'notmuch-tree-from-show-current-query) +;; (provide 'notmuch-tree) -- 1.7.9.1 ^ permalink raw reply related [flat|nested] 22+ messages in thread
* Re: [PATCH 00/11] Move notmuch-tree to mainline 2013-10-29 22:55 [PATCH 00/11] Move notmuch-tree to mainline Mark Walters ` (10 preceding siblings ...) 2013-10-29 22:55 ` [PATCH 11/11] emacs: move the show entry to tree into show.el Mark Walters @ 2013-10-30 18:01 ` Tomi Ollila 2013-10-30 18:48 ` Mark Walters 2013-11-01 9:23 ` [PATCH v2 7-11] Fix commit messages Mark Walters 2013-11-07 12:20 ` [PATCH 00/11] Move notmuch-tree to mainline David Bremner 13 siblings, 1 reply; 22+ messages in thread From: Tomi Ollila @ 2013-10-30 18:01 UTC (permalink / raw) To: Mark Walters, notmuch On Wed, Oct 30 2013, Mark Walters <markwalters1009@gmail.com> wrote: > This is a more complete version of the move of pick/tree to > mainline. The previous version was at > id:1382257699-29860-1-git-send-email-markwalters1009@gmail.com This series looks pretty good to me. IMO patches 1-6 are ready... > The previous version did not get the autoloading right: it all worked > on my setup as I had stale files around in my tree which were loaded. > This versions builds and tests pass at each stage on a fresh clone. You and Me seem to have different understanding what "autoload"ing means. To me autoloading means using (autoload ...) function. In patch 7 ( id:1383087338-10220-8-git-send-email-markwalters1009@gmail.com ) (require 'notmuch-tree) is used. To me it is fine if this approach is taken, but then calling it autoloading in commit message (in patches 7 and 8) is confusing. However, if (autoload ...) syntax were actually used, it could be done the somewhat the following way: * Don't add (require 'notmuch-tree) in notmuch.el (Patch 7) * Add (autoload 'notmuch-tree-from-search-current-query "notmuch-tree" "docstring" t) to notmuch.el (maybe we can live without declare-function ?) * Add (autoload 'notmuch-tree "notmuch-tree" "docstring" t) to notmuch-lib.el. * Now Patch 9 is good as it is now. * Don't move the functions mentioned in Patch 9 from notmuch-tree.el to notmuch.el but write autoload (for notmuch-tree-from-search-thread) to notmuch.el * Now Patch 10 is good as it is now. * Leave notmuch-tree-from-show-current-query in notmuch-tree.el, and add autoload for it in notmuch-show.el. Now you can also drop (declare-function notmuch-tree ...) out from notmuch-show.el (Patch 11). Tomi > The diffstat at the bottom of this message is huge, so I include the > rather more informative output from git diff -stat -M here. > > Apart from the first patch (which moves 80 lines from notmuch.el to notmuch-lib.el) the total is: > emacs/Makefile.local | 1 + > emacs/notmuch-lib.el | 1 + > emacs/notmuch-show.el | 10 ++++ > {contrib/notmuch-pick => emacs}/notmuch-tree.el | 47 ++----------------- > emacs/notmuch.el | 16 +++++++ > {contrib/notmuch-pick/test => test}/emacs-tree | 13 ----- > test/notmuch-test | 1 + > .../tree.expected-output/notmuch-tree-show-window | 0 > .../notmuch-tree-single-thread | 0 > .../tree.expected-output/notmuch-tree-tag-inbox | 0 > .../notmuch-tree-tag-inbox-tagged | 0 > .../notmuch-tree-tag-inbox-thread-tagged | 0 > 12 files changed, 34 insertions(+), 55 deletions(-) > > > Obviously this clashes with the remap/help series at > id:1382821479-23384-1-git-send-email-markwalters1009@gmail.com but > rebasing either way would be easy. > > Best wishes > > Mark > > > > > > Mark Walters (11): > emacs: move notmuch-help to lib > emacs: tree: remove unneeded declarations > emacs: move notmuch-tree from contrib to mainline > emacs: add tree to the makefile > test: move emacs-tree test into mainline > emacs: tree: remove test for emacs from tree test > emacs: minimal change to autoload notmuch-tree > test: tree: remove require from tests > emacs: move search based tree functions to notmuch.el > emacs: add z to common keymap > emacs: move the show entry to tree into show.el > > contrib/notmuch-pick/notmuch-tree.el | 951 -------------------- > contrib/notmuch-pick/test/emacs-tree | 210 ----- > .../tree.expected-output/notmuch-tree-show-window | 40 - > .../notmuch-tree-single-thread | 6 - > .../tree.expected-output/notmuch-tree-tag-inbox | 53 -- > .../notmuch-tree-tag-inbox-tagged | 53 -- > .../notmuch-tree-tag-inbox-thread-tagged | 53 -- > emacs/Makefile.local | 1 + > emacs/notmuch-lib.el | 88 ++ > emacs/notmuch-show.el | 10 + > emacs/notmuch-tree.el | 914 +++++++++++++++++++ > emacs/notmuch.el | 103 +-- > test/emacs-tree | 197 ++++ > test/notmuch-test | 1 + > test/tree.expected-output/notmuch-tree-show-window | 40 + > .../notmuch-tree-single-thread | 6 + > test/tree.expected-output/notmuch-tree-tag-inbox | 53 ++ > .../notmuch-tree-tag-inbox-tagged | 53 ++ > .../notmuch-tree-tag-inbox-thread-tagged | 53 ++ > 19 files changed, 1432 insertions(+), 1453 deletions(-) > delete mode 100644 contrib/notmuch-pick/notmuch-tree.el > delete mode 100755 contrib/notmuch-pick/test/emacs-tree > delete mode 100644 contrib/notmuch-pick/test/tree.expected-output/notmuch-tree-show-window > delete mode 100644 contrib/notmuch-pick/test/tree.expected-output/notmuch-tree-single-thread > delete mode 100644 contrib/notmuch-pick/test/tree.expected-output/notmuch-tree-tag-inbox > delete mode 100644 contrib/notmuch-pick/test/tree.expected-output/notmuch-tree-tag-inbox-tagged > delete mode 100644 contrib/notmuch-pick/test/tree.expected-output/notmuch-tree-tag-inbox-thread-tagged > create mode 100644 emacs/notmuch-tree.el > create mode 100755 test/emacs-tree > create mode 100644 test/tree.expected-output/notmuch-tree-show-window > create mode 100644 test/tree.expected-output/notmuch-tree-single-thread > create mode 100644 test/tree.expected-output/notmuch-tree-tag-inbox > create mode 100644 test/tree.expected-output/notmuch-tree-tag-inbox-tagged > create mode 100644 test/tree.expected-output/notmuch-tree-tag-inbox-thread-tagged > > -- > 1.7.9.1 > > _______________________________________________ > notmuch mailing list > notmuch@notmuchmail.org > http://notmuchmail.org/mailman/listinfo/notmuch ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH 00/11] Move notmuch-tree to mainline 2013-10-30 18:01 ` [PATCH 00/11] Move notmuch-tree to mainline Tomi Ollila @ 2013-10-30 18:48 ` Mark Walters 0 siblings, 0 replies; 22+ messages in thread From: Mark Walters @ 2013-10-30 18:48 UTC (permalink / raw) To: Tomi Ollila, notmuch Hi Thanks for the review On Wed, 30 Oct 2013, Tomi Ollila <tomi.ollila@iki.fi> wrote: > On Wed, Oct 30 2013, Mark Walters <markwalters1009@gmail.com> wrote: > >> This is a more complete version of the move of pick/tree to >> mainline. The previous version was at >> id:1382257699-29860-1-git-send-email-markwalters1009@gmail.com > > This series looks pretty good to me. IMO patches 1-6 are ready... > >> The previous version did not get the autoloading right: it all worked >> on my setup as I had stale files around in my tree which were loaded. >> This versions builds and tests pass at each stage on a fresh clone. > > You and Me seem to have different understanding what "autoload"ing means. Sorry about that; I just meant that it was automatically loaded when notmuch was loaded (that is the user no longer needs an explicit (require 'notmuch-tree) in their .emacs file. I would probably just stick with the require approach (to be consistent with show etc) unless you (or others) prefer the real autoload as you describe. I will fix the commit messages in the next version. Many thanks Mark > To me autoloading means using (autoload ...) function. In patch 7 > ( id:1383087338-10220-8-git-send-email-markwalters1009@gmail.com ) > (require 'notmuch-tree) is used. > > To me it is fine if this approach is taken, but then calling it autoloading > in commit message (in patches 7 and 8) is confusing. > > However, if (autoload ...) syntax were actually used, it could be done > the somewhat the following way: > > * Don't add (require 'notmuch-tree) in notmuch.el (Patch 7) > > * Add (autoload 'notmuch-tree-from-search-current-query "notmuch-tree" "docstring" t) > to notmuch.el (maybe we can live without declare-function ?) > > * Add (autoload 'notmuch-tree "notmuch-tree" "docstring" t) to > notmuch-lib.el. > > * Now Patch 9 is good as it is now. > > * Don't move the functions mentioned in Patch 9 from notmuch-tree.el to > notmuch.el but write autoload (for notmuch-tree-from-search-thread) to > notmuch.el > > * Now Patch 10 is good as it is now. > > * Leave notmuch-tree-from-show-current-query in notmuch-tree.el, and add > autoload for it in notmuch-show.el. Now you can also drop > (declare-function notmuch-tree ...) out from notmuch-show.el (Patch 11). > > > Tomi > > >> The diffstat at the bottom of this message is huge, so I include the >> rather more informative output from git diff -stat -M here. >> >> Apart from the first patch (which moves 80 lines from notmuch.el to notmuch-lib.el) the total is: >> emacs/Makefile.local | 1 + >> emacs/notmuch-lib.el | 1 + >> emacs/notmuch-show.el | 10 ++++ >> {contrib/notmuch-pick => emacs}/notmuch-tree.el | 47 ++----------------- >> emacs/notmuch.el | 16 +++++++ >> {contrib/notmuch-pick/test => test}/emacs-tree | 13 ----- >> test/notmuch-test | 1 + >> .../tree.expected-output/notmuch-tree-show-window | 0 >> .../notmuch-tree-single-thread | 0 >> .../tree.expected-output/notmuch-tree-tag-inbox | 0 >> .../notmuch-tree-tag-inbox-tagged | 0 >> .../notmuch-tree-tag-inbox-thread-tagged | 0 >> 12 files changed, 34 insertions(+), 55 deletions(-) >> >> >> Obviously this clashes with the remap/help series at >> id:1382821479-23384-1-git-send-email-markwalters1009@gmail.com but >> rebasing either way would be easy. >> >> Best wishes >> >> Mark >> >> >> >> >> >> Mark Walters (11): >> emacs: move notmuch-help to lib >> emacs: tree: remove unneeded declarations >> emacs: move notmuch-tree from contrib to mainline >> emacs: add tree to the makefile >> test: move emacs-tree test into mainline >> emacs: tree: remove test for emacs from tree test >> emacs: minimal change to autoload notmuch-tree >> test: tree: remove require from tests >> emacs: move search based tree functions to notmuch.el >> emacs: add z to common keymap >> emacs: move the show entry to tree into show.el >> >> contrib/notmuch-pick/notmuch-tree.el | 951 -------------------- >> contrib/notmuch-pick/test/emacs-tree | 210 ----- >> .../tree.expected-output/notmuch-tree-show-window | 40 - >> .../notmuch-tree-single-thread | 6 - >> .../tree.expected-output/notmuch-tree-tag-inbox | 53 -- >> .../notmuch-tree-tag-inbox-tagged | 53 -- >> .../notmuch-tree-tag-inbox-thread-tagged | 53 -- >> emacs/Makefile.local | 1 + >> emacs/notmuch-lib.el | 88 ++ >> emacs/notmuch-show.el | 10 + >> emacs/notmuch-tree.el | 914 +++++++++++++++++++ >> emacs/notmuch.el | 103 +-- >> test/emacs-tree | 197 ++++ >> test/notmuch-test | 1 + >> test/tree.expected-output/notmuch-tree-show-window | 40 + >> .../notmuch-tree-single-thread | 6 + >> test/tree.expected-output/notmuch-tree-tag-inbox | 53 ++ >> .../notmuch-tree-tag-inbox-tagged | 53 ++ >> .../notmuch-tree-tag-inbox-thread-tagged | 53 ++ >> 19 files changed, 1432 insertions(+), 1453 deletions(-) >> delete mode 100644 contrib/notmuch-pick/notmuch-tree.el >> delete mode 100755 contrib/notmuch-pick/test/emacs-tree >> delete mode 100644 contrib/notmuch-pick/test/tree.expected-output/notmuch-tree-show-window >> delete mode 100644 contrib/notmuch-pick/test/tree.expected-output/notmuch-tree-single-thread >> delete mode 100644 contrib/notmuch-pick/test/tree.expected-output/notmuch-tree-tag-inbox >> delete mode 100644 contrib/notmuch-pick/test/tree.expected-output/notmuch-tree-tag-inbox-tagged >> delete mode 100644 contrib/notmuch-pick/test/tree.expected-output/notmuch-tree-tag-inbox-thread-tagged >> create mode 100644 emacs/notmuch-tree.el >> create mode 100755 test/emacs-tree >> create mode 100644 test/tree.expected-output/notmuch-tree-show-window >> create mode 100644 test/tree.expected-output/notmuch-tree-single-thread >> create mode 100644 test/tree.expected-output/notmuch-tree-tag-inbox >> create mode 100644 test/tree.expected-output/notmuch-tree-tag-inbox-tagged >> create mode 100644 test/tree.expected-output/notmuch-tree-tag-inbox-thread-tagged >> >> -- >> 1.7.9.1 >> >> _______________________________________________ >> notmuch mailing list >> notmuch@notmuchmail.org >> http://notmuchmail.org/mailman/listinfo/notmuch ^ permalink raw reply [flat|nested] 22+ messages in thread
* [PATCH v2 7-11] Fix commit messages 2013-10-29 22:55 [PATCH 00/11] Move notmuch-tree to mainline Mark Walters ` (11 preceding siblings ...) 2013-10-30 18:01 ` [PATCH 00/11] Move notmuch-tree to mainline Tomi Ollila @ 2013-11-01 9:23 ` Mark Walters 2013-11-01 9:23 ` [PATCH v2 7/11] emacs: minimal change to load notmuch-tree by default Mark Walters ` (5 more replies) 2013-11-07 12:20 ` [PATCH 00/11] Move notmuch-tree to mainline David Bremner 13 siblings, 6 replies; 22+ messages in thread From: Mark Walters @ 2013-11-01 9:23 UTC (permalink / raw) To: notmuch This just fixes the commit message in patches 7 and 8 to not say autoload as that means something different. Best wishes Mark Mark Walters (5): emacs: minimal change to load notmuch-tree by default test: tree: remove require from tests emacs: move search based tree functions to notmuch.el emacs: add z to common keymap emacs: move the show entry to tree into show.el emacs/notmuch-lib.el | 1 + emacs/notmuch-show.el | 10 ++++++++++ emacs/notmuch-tree.el | 34 +--------------------------------- emacs/notmuch.el | 16 ++++++++++++++++ test/emacs-tree | 6 ------ 5 files changed, 28 insertions(+), 39 deletions(-) -- 1.7.9.1 ^ permalink raw reply [flat|nested] 22+ messages in thread
* [PATCH v2 7/11] emacs: minimal change to load notmuch-tree by default 2013-11-01 9:23 ` [PATCH v2 7-11] Fix commit messages Mark Walters @ 2013-11-01 9:23 ` Mark Walters 2013-11-01 9:23 ` [PATCH v2 8/11] test: tree: remove require from tests Mark Walters ` (4 subsequent siblings) 5 siblings, 0 replies; 22+ messages in thread From: Mark Walters @ 2013-11-01 9:23 UTC (permalink / raw) To: notmuch We want to load notmuch-tree when notmuch is loaded, so include it as a require in notmuch.el. To avoid circular dependency we need to move one keybinding from notmuch-tree.el to notmuch.el: it makes sense for it to be defined there anyway. Since tree is now loaded by default there is no need to print a message when it is loaded. --- emacs/notmuch-tree.el | 3 --- emacs/notmuch.el | 2 ++ 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/emacs/notmuch-tree.el b/emacs/notmuch-tree.el index d3330a0..ebfb5e7 100644 --- a/emacs/notmuch-tree.el +++ b/emacs/notmuch-tree.el @@ -29,7 +29,6 @@ (require 'notmuch-show) (require 'notmuch-tag) (require 'notmuch-parser) -(require 'notmuch) ;; XXX ATM, as notmuch-search-mode-map is defined here (eval-when-compile (require 'cl)) (declare-function notmuch-search "notmuch" (&optional query oldest-first target-thread target-line)) @@ -939,8 +938,6 @@ The arguments are: ;; Set up key bindings from the rest of notmuch. (define-key notmuch-common-keymap "z" 'notmuch-tree) -(define-key notmuch-search-mode-map "Z" 'notmuch-tree-from-search-current-query) (define-key notmuch-show-mode-map "Z" 'notmuch-tree-from-show-current-query) -(message "Initialised notmuch-tree") (provide 'notmuch-tree) diff --git a/emacs/notmuch.el b/emacs/notmuch.el index 19210cb..418c781 100644 --- a/emacs/notmuch.el +++ b/emacs/notmuch.el @@ -54,6 +54,7 @@ (require 'notmuch-lib) (require 'notmuch-tag) (require 'notmuch-show) +(require 'notmuch-tree) (require 'notmuch-mua) (require 'notmuch-hello) (require 'notmuch-maildir-fcc) @@ -156,6 +157,7 @@ To enter a line break in customize, press \\[quoted-insert] C-j." (define-key map "-" 'notmuch-search-remove-tag) (define-key map "+" 'notmuch-search-add-tag) (define-key map (kbd "RET") 'notmuch-search-show-thread) + (define-key map "Z" 'notmuch-tree-from-search-current-query) map) "Keymap for \"notmuch search\" buffers.") (fset 'notmuch-search-mode-map notmuch-search-mode-map) -- 1.7.9.1 ^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH v2 8/11] test: tree: remove require from tests 2013-11-01 9:23 ` [PATCH v2 7-11] Fix commit messages Mark Walters 2013-11-01 9:23 ` [PATCH v2 7/11] emacs: minimal change to load notmuch-tree by default Mark Walters @ 2013-11-01 9:23 ` Mark Walters 2013-11-01 9:23 ` [PATCH v2 9/11] emacs: move search based tree functions to notmuch.el Mark Walters ` (3 subsequent siblings) 5 siblings, 0 replies; 22+ messages in thread From: Mark Walters @ 2013-11-01 9:23 UTC (permalink / raw) To: notmuch Now tree is included by default we don't need to "require it" in the test. --- test/emacs-tree | 6 ------ 1 files changed, 0 insertions(+), 6 deletions(-) diff --git a/test/emacs-tree b/test/emacs-tree index 4e3b624..4bdfddd 100755 --- a/test/emacs-tree +++ b/test/emacs-tree @@ -9,7 +9,6 @@ add_email_corpus test_begin_subtest "Basic notmuch-tree view in emacs" test_emacs '(add-to-list (quote load-path) "'$PICK_DIR'") - (require (quote notmuch-tree)) (notmuch-tree "tag:inbox") (notmuch-test-wait) (test-output) @@ -18,7 +17,6 @@ test_expect_equal_file OUTPUT $EXPECTED/notmuch-tree-tag-inbox test_begin_subtest "Refreshed notmuch-tree view in emacs" test_emacs '(add-to-list (quote load-path) "'$PICK_DIR'") - (require (quote notmuch-tree)) (notmuch-tree "tag:inbox") (notmuch-test-wait) (notmuch-tree-refresh-view) @@ -33,7 +31,6 @@ test_expect_equal_file OUTPUT $EXPECTED/notmuch-tree-tag-inbox test_begin_subtest "Tag message in notmuch tree view (display)" test_emacs '(add-to-list (quote load-path) "'$PICK_DIR'") - (require (quote notmuch-tree)) (notmuch-tree "tag:inbox") (notmuch-test-wait) (forward-line) @@ -48,7 +45,6 @@ test_expect_equal "$output" "id:877h1wv7mg.fsf@inf-8657.int-evry.fr" test_begin_subtest "Untag message in notmuch tree view" test_emacs '(add-to-list (quote load-path) "'$PICK_DIR'") - (require (quote notmuch-tree)) (notmuch-tree "tag:inbox") (notmuch-test-wait) (forward-line) @@ -63,7 +59,6 @@ test_expect_equal "$output" "" test_begin_subtest "Tag thread in notmuch tree view" test_emacs '(add-to-list (quote load-path) "'$PICK_DIR'") - (require (quote notmuch-tree)) (notmuch-tree "tag:inbox") (notmuch-test-wait) ;; move to a sizable thread @@ -86,7 +81,6 @@ id:20091117190054.GU3165@dottiness.seas.harvard.edu" test_begin_subtest "Untag thread in notmuch tree view" test_emacs '(add-to-list (quote load-path) "'$PICK_DIR'") - (require (quote notmuch-tree)) (notmuch-tree "tag:inbox") (notmuch-test-wait) ;; move to the same sizable thread as above -- 1.7.9.1 ^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH v2 9/11] emacs: move search based tree functions to notmuch.el 2013-11-01 9:23 ` [PATCH v2 7-11] Fix commit messages Mark Walters 2013-11-01 9:23 ` [PATCH v2 7/11] emacs: minimal change to load notmuch-tree by default Mark Walters 2013-11-01 9:23 ` [PATCH v2 8/11] test: tree: remove require from tests Mark Walters @ 2013-11-01 9:23 ` Mark Walters 2013-11-01 9:23 ` [PATCH v2 10/11] emacs: add z to common keymap Mark Walters ` (2 subsequent siblings) 5 siblings, 0 replies; 22+ messages in thread From: Mark Walters @ 2013-11-01 9:23 UTC (permalink / raw) To: notmuch Move a couple of the search mode specifc caller helpers for tree from tree into notmuch.el. --- emacs/notmuch-tree.el | 18 ------------------ emacs/notmuch.el | 14 ++++++++++++++ 2 files changed, 14 insertions(+), 18 deletions(-) diff --git a/emacs/notmuch-tree.el b/emacs/notmuch-tree.el index ebfb5e7..78b4a57 100644 --- a/emacs/notmuch-tree.el +++ b/emacs/notmuch-tree.el @@ -413,24 +413,6 @@ Does NOT change the database." notmuch-show-query-context (notmuch-show-get-message-id))) -;; This function should be in notmuch.el but be we trying to minimise -;; impact on the rest of the codebase. -(defun notmuch-tree-from-search-current-query () - "Call notmuch tree with the current query" - (interactive) - (notmuch-tree notmuch-search-query-string)) - -;; This function should be in notmuch.el but be we trying to minimise -;; impact on the rest of the codebase. -(defun notmuch-tree-from-search-thread () - "Show the selected thread with notmuch-tree" - (interactive) - (notmuch-tree (notmuch-search-find-thread-id) - notmuch-search-query-string - nil - (notmuch-prettify-subject (notmuch-search-find-subject)) - t)) - (defun notmuch-tree-message-window-kill-hook () "Close the message pane when exiting the show buffer." (let ((buffer (current-buffer))) diff --git a/emacs/notmuch.el b/emacs/notmuch.el index 418c781..2c9a07c 100644 --- a/emacs/notmuch.el +++ b/emacs/notmuch.el @@ -439,6 +439,20 @@ If BARE is set then do not prefix with \"thread:\"" (concat "*" (truncate-string-to-width subject 30 nil nil t) "*")) (message "End of search results.")))) +(defun notmuch-tree-from-search-current-query () + "Call notmuch tree with the current query" + (interactive) + (notmuch-tree notmuch-search-query-string)) + +(defun notmuch-tree-from-search-thread () + "Show the selected thread with notmuch-tree" + (interactive) + (notmuch-tree (notmuch-search-find-thread-id) + notmuch-search-query-string + nil + (notmuch-prettify-subject (notmuch-search-find-subject)) + t)) + (defun notmuch-search-reply-to-thread (&optional prompt-for-sender) "Begin composing a reply-all to the entire current thread in a new buffer." (interactive "P") -- 1.7.9.1 ^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH v2 10/11] emacs: add z to common keymap 2013-11-01 9:23 ` [PATCH v2 7-11] Fix commit messages Mark Walters ` (2 preceding siblings ...) 2013-11-01 9:23 ` [PATCH v2 9/11] emacs: move search based tree functions to notmuch.el Mark Walters @ 2013-11-01 9:23 ` Mark Walters 2013-11-01 9:23 ` [PATCH v2 11/11] emacs: move the show entry to tree into show.el Mark Walters 2013-11-01 12:04 ` [PATCH v2 7-11] Fix commit messages Tomi Ollila 5 siblings, 0 replies; 22+ messages in thread From: Mark Walters @ 2013-11-01 9:23 UTC (permalink / raw) To: notmuch Add the main entry "z" to notmuch-tree to the common keymap. --- emacs/notmuch-lib.el | 1 + emacs/notmuch-tree.el | 1 - 2 files changed, 1 insertions(+), 1 deletions(-) diff --git a/emacs/notmuch-lib.el b/emacs/notmuch-lib.el index e7c5c97..921ed20 100644 --- a/emacs/notmuch-lib.el +++ b/emacs/notmuch-lib.el @@ -133,6 +133,7 @@ For example, if you wanted to remove an \"inbox\" tag and add an (define-key map "?" 'notmuch-help) (define-key map "q" 'notmuch-kill-this-buffer) (define-key map "s" 'notmuch-search) + (define-key map "z" 'notmuch-tree) (define-key map "m" 'notmuch-mua-new-mail) (define-key map "=" 'notmuch-refresh-this-buffer) (define-key map "G" 'notmuch-poll-and-refresh-this-buffer) diff --git a/emacs/notmuch-tree.el b/emacs/notmuch-tree.el index 78b4a57..c66dd35 100644 --- a/emacs/notmuch-tree.el +++ b/emacs/notmuch-tree.el @@ -919,7 +919,6 @@ The arguments are: ;; Set up key bindings from the rest of notmuch. -(define-key notmuch-common-keymap "z" 'notmuch-tree) (define-key notmuch-show-mode-map "Z" 'notmuch-tree-from-show-current-query) (provide 'notmuch-tree) -- 1.7.9.1 ^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH v2 11/11] emacs: move the show entry to tree into show.el 2013-11-01 9:23 ` [PATCH v2 7-11] Fix commit messages Mark Walters ` (3 preceding siblings ...) 2013-11-01 9:23 ` [PATCH v2 10/11] emacs: add z to common keymap Mark Walters @ 2013-11-01 9:23 ` Mark Walters 2013-11-01 12:04 ` [PATCH v2 7-11] Fix commit messages Tomi Ollila 5 siblings, 0 replies; 22+ messages in thread From: Mark Walters @ 2013-11-01 9:23 UTC (permalink / raw) To: notmuch Move the keybinding and show specific helper from tree.el to show.el --- emacs/notmuch-show.el | 10 ++++++++++ emacs/notmuch-tree.el | 12 +----------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/emacs/notmuch-show.el b/emacs/notmuch-show.el index 9e8b9c0..f00273a 100644 --- a/emacs/notmuch-show.el +++ b/emacs/notmuch-show.el @@ -44,6 +44,8 @@ (declare-function notmuch-foreach-mime-part "notmuch" (function mm-handle)) (declare-function notmuch-count-attachments "notmuch" (mm-handle)) (declare-function notmuch-save-attachments "notmuch" (mm-handle &optional queryp)) +(declare-function notmuch-tree "notmuch-tree" + (&optional query query-context target buffer-name open-target)) (defcustom notmuch-message-headers '("Subject" "To" "Cc" "Date") "Headers that should be shown in a message, in this order. @@ -1247,6 +1249,7 @@ reset based on the original query." (defvar notmuch-show-mode-map (let ((map (make-sparse-keymap))) (set-keymap-parent map notmuch-common-keymap) + (define-key map "Z" 'notmuch-tree-from-show-current-query) (define-key map (kbd "<C-tab>") 'widget-backward) (define-key map (kbd "M-TAB") 'notmuch-show-previous-button) (define-key map (kbd "<backtab>") 'notmuch-show-previous-button) @@ -1323,6 +1326,13 @@ All currently available key bindings: (setq buffer-read-only t truncate-lines t)) +(defun notmuch-tree-from-show-current-query () + "Call notmuch tree with the current query" + (interactive) + (notmuch-tree notmuch-show-thread-id + notmuch-show-query-context + (notmuch-show-get-message-id))) + (defun notmuch-show-move-to-message-top () (goto-char (notmuch-show-message-top))) diff --git a/emacs/notmuch-tree.el b/emacs/notmuch-tree.el index c66dd35..f13b41f 100644 --- a/emacs/notmuch-tree.el +++ b/emacs/notmuch-tree.el @@ -404,15 +404,6 @@ Does NOT change the database." (notmuch-tree-close-message-window) (notmuch-tree query))) -;; This function should be in notmuch-show.el but be we trying to -;; minimise impact on the rest of the codebase. -(defun notmuch-tree-from-show-current-query () - "Call notmuch tree with the current query" - (interactive) - (notmuch-tree notmuch-show-thread-id - notmuch-show-query-context - (notmuch-show-get-message-id))) - (defun notmuch-tree-message-window-kill-hook () "Close the message pane when exiting the show buffer." (let ((buffer (current-buffer))) @@ -918,7 +909,6 @@ The arguments are: (setq truncate-lines t)) -;; Set up key bindings from the rest of notmuch. -(define-key notmuch-show-mode-map "Z" 'notmuch-tree-from-show-current-query) +;; (provide 'notmuch-tree) -- 1.7.9.1 ^ permalink raw reply related [flat|nested] 22+ messages in thread
* Re: [PATCH v2 7-11] Fix commit messages 2013-11-01 9:23 ` [PATCH v2 7-11] Fix commit messages Mark Walters ` (4 preceding siblings ...) 2013-11-01 9:23 ` [PATCH v2 11/11] emacs: move the show entry to tree into show.el Mark Walters @ 2013-11-01 12:04 ` Tomi Ollila 5 siblings, 0 replies; 22+ messages in thread From: Tomi Ollila @ 2013-11-01 12:04 UTC (permalink / raw) To: Mark Walters, notmuch On Fri, Nov 01 2013, Mark Walters <markwalters1009@gmail.com> wrote: > This just fixes the commit message in patches 7 and 8 to not say > autoload as that means something different. The series not LGTM. Patches apply (w/ one known whitespace message) and tests pass. Tomi > > Best wishes > > Mark > > Mark Walters (5): > emacs: minimal change to load notmuch-tree by default > test: tree: remove require from tests > emacs: move search based tree functions to notmuch.el > emacs: add z to common keymap > emacs: move the show entry to tree into show.el > > emacs/notmuch-lib.el | 1 + > emacs/notmuch-show.el | 10 ++++++++++ > emacs/notmuch-tree.el | 34 +--------------------------------- > emacs/notmuch.el | 16 ++++++++++++++++ > test/emacs-tree | 6 ------ > 5 files changed, 28 insertions(+), 39 deletions(-) > > -- > 1.7.9.1 > > _______________________________________________ > notmuch mailing list > notmuch@notmuchmail.org > http://notmuchmail.org/mailman/listinfo/notmuch ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH 00/11] Move notmuch-tree to mainline 2013-10-29 22:55 [PATCH 00/11] Move notmuch-tree to mainline Mark Walters ` (12 preceding siblings ...) 2013-11-01 9:23 ` [PATCH v2 7-11] Fix commit messages Mark Walters @ 2013-11-07 12:20 ` David Bremner 13 siblings, 0 replies; 22+ messages in thread From: David Bremner @ 2013-11-07 12:20 UTC (permalink / raw) To: Mark Walters, notmuch Mark Walters <markwalters1009@gmail.com> writes: > This is a more complete version of the move of pick/tree to > mainline. The previous version was at > id:1382257699-29860-1-git-send-email-markwalters1009@gmail.com pushed, with the reworked commit messages for the last few patches. d ^ permalink raw reply [flat|nested] 22+ messages in thread
end of thread, other threads:[~2013-11-07 12:21 UTC | newest] Thread overview: 22+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2013-10-29 22:55 [PATCH 00/11] Move notmuch-tree to mainline Mark Walters 2013-10-29 22:55 ` [PATCH 01/11] emacs: move notmuch-help to lib Mark Walters 2013-10-29 22:55 ` [PATCH 02/11] emacs: tree: remove unneeded declarations Mark Walters 2013-10-29 22:55 ` [PATCH 03/11] emacs: move notmuch-tree from contrib to mainline Mark Walters 2013-10-29 22:55 ` [PATCH 04/11] emacs: add tree to the makefile Mark Walters 2013-10-29 22:55 ` [PATCH 05/11] test: move emacs-tree test into mainline Mark Walters 2013-10-29 22:55 ` [PATCH 06/11] emacs: tree: remove test for emacs from tree test Mark Walters 2013-10-29 22:55 ` [PATCH 07/11] emacs: minimal change to autoload notmuch-tree Mark Walters 2013-10-29 22:55 ` [PATCH 08/11] test: tree: remove require from tests Mark Walters 2013-10-29 22:55 ` [PATCH 09/11] emacs: move search based tree functions to notmuch.el Mark Walters 2013-10-29 22:55 ` [PATCH 10/11] emacs: add z to common keymap Mark Walters 2013-10-29 22:55 ` [PATCH 11/11] emacs: move the show entry to tree into show.el Mark Walters 2013-10-30 18:01 ` [PATCH 00/11] Move notmuch-tree to mainline Tomi Ollila 2013-10-30 18:48 ` Mark Walters 2013-11-01 9:23 ` [PATCH v2 7-11] Fix commit messages Mark Walters 2013-11-01 9:23 ` [PATCH v2 7/11] emacs: minimal change to load notmuch-tree by default Mark Walters 2013-11-01 9:23 ` [PATCH v2 8/11] test: tree: remove require from tests Mark Walters 2013-11-01 9:23 ` [PATCH v2 9/11] emacs: move search based tree functions to notmuch.el Mark Walters 2013-11-01 9:23 ` [PATCH v2 10/11] emacs: add z to common keymap Mark Walters 2013-11-01 9:23 ` [PATCH v2 11/11] emacs: move the show entry to tree into show.el Mark Walters 2013-11-01 12:04 ` [PATCH v2 7-11] Fix commit messages Tomi Ollila 2013-11-07 12:20 ` [PATCH 00/11] Move notmuch-tree to mainline David Bremner
Code repositories for project(s) associated with this public inbox https://yhetil.org/notmuch.git/ This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).