summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJameson Graef Rollins <jrollins@finestructure.net>2009-12-20 11:03:19 -0500
committerJameson Graef Rollins <jrollins@finestructure.net>2009-12-20 11:03:19 -0500
commit518c8c0d3f9d845b2e5a87e83382d61b05fc2958 (patch)
tree0af9ba97048d5f840d1c2a2c5f368ce2efa78ddc
parent9f99a301b158dc1ed1c8c6754db1d57e3b0becf4 (diff)
parentdac01ec52036e0320f66211be3dc5e5126eb218f (diff)
Merge branch 'upstream' into debian
-rw-r--r--TODO16
-rw-r--r--lib/database.cc9
-rw-r--r--lib/notmuch-private.h4
-rw-r--r--notmuch.el98
4 files changed, 68 insertions, 59 deletions
diff --git a/TODO b/TODO
index d6c303e..4395669 100644
--- a/TODO
+++ b/TODO
@@ -8,6 +8,12 @@ Fix the things that are causing the most pain to new users
Emacs interface (notmuch.el)
----------------------------
+Enhance '+' and '-' in the search view to operate on an entire region
+if set.
+
+Fix '*' to work by simply calling '+' or '-' on a region consisting of
+the entire buffer.
+
Add a global keybinding table for notmuch, and then view-specific
tables that add to it.
@@ -44,6 +50,10 @@ and *then* --max-threads), and also complete value for --sort=
notmuch command-line tool
-------------------------
+Implement "notmuch search --exclude-threads=<search-terms>" to allow
+for excluding muted threads, (and any other negative, thread-based
+filtering that the user wants to do).
+
Fix "notmuch show" so that the UI doesn't fail to show a thread that
is visible in a search buffer, but happens to no longer match the
current search. (Perhaps add a --matching=<secondary-search-terms>
@@ -130,6 +140,12 @@ Add support for configuring "virtual tags" which are a tuple of
(tag-name, search-specification). The database is responsible for
ensuring that the virtual tag is always consistent.
+Indicate to the user if two files with the same message ID have
+content that is actually different in some interesting way. Perhaps
+notmuch initially sees all changes as interesting, and quickly learns
+from the user which changes are not interesting (such as the very
+common mailing-list footer).
+
General
-------
Audit everything for dealing with out-of-memory (and drop xutil.c).
diff --git a/lib/database.cc b/lib/database.cc
index 23ddd4a..b6c4d07 100644
--- a/lib/database.cc
+++ b/lib/database.cc
@@ -855,12 +855,11 @@ _notmuch_database_link_message_to_children (notmuch_database_t *notmuch,
*
* We first look at 'message_file' and its link-relevant headers
* (References and In-Reply-To) for message IDs. We also look in the
- * database for existing message that reference 'message'.p
+ * database for existing message that reference 'message'.
*
- * The end result is to call _notmuch_message_add_thread_id with one
- * or more thread IDs to which this message belongs, (including
- * generating a new thread ID if necessary if the message doesn't
- * connect to any existing threads).
+ * The end result is to call _notmuch_message_ensure_thread_id which
+ * generates a new thread ID if the message doesn't connect to any
+ * existing threads.
*/
static notmuch_status_t
_notmuch_database_link_message (notmuch_database_t *notmuch,
diff --git a/lib/notmuch-private.h b/lib/notmuch-private.h
index 0c340a7..116f63d 100644
--- a/lib/notmuch-private.h
+++ b/lib/notmuch-private.h
@@ -194,10 +194,6 @@ _notmuch_message_set_filename (notmuch_message_t *message,
const char *filename);
void
-_notmuch_message_add_thread_id (notmuch_message_t *message,
- const char *thread_id);
-
-void
_notmuch_message_ensure_thread_id (notmuch_message_t *message);
void
diff --git a/notmuch.el b/notmuch.el
index c504f46..97914f2 100644
--- a/notmuch.el
+++ b/notmuch.el
@@ -322,7 +322,9 @@ buffer."
(lambda (p)
(let ((disposition (mm-handle-disposition p)))
(and (listp disposition)
- (equal (car disposition) "attachment")
+ (or (equal (car disposition) "attachment")
+ (and (equal (car disposition) "inline")
+ (assq 'filename disposition)))
(incf count))))
mm-handle)
count))
@@ -332,7 +334,9 @@ buffer."
(lambda (p)
(let ((disposition (mm-handle-disposition p)))
(and (listp disposition)
- (equal (car disposition) "attachment")
+ (or (equal (car disposition) "attachment")
+ (and (equal (car disposition) "inline")
+ (assq 'filename disposition)))
(or (not queryp)
(y-or-n-p
(concat "Save '" (cdr (assq 'filename disposition)) "' ")))
@@ -595,26 +599,27 @@ which this thread was originally shown."
(while (< (point) end)
(let ((beg-sub (point-marker))
(indent (make-string depth ? ))
- (citation "[[:space:]]*>"))
+ (citation ">"))
+ (move-to-column depth)
(if (looking-at citation)
(progn
(while (looking-at citation)
- (forward-line))
+ (forward-line)
+ (move-to-column depth))
(let ((overlay (make-overlay beg-sub (point)))
(invis-spec (make-symbol "notmuch-citation-region")))
(add-to-invisibility-spec invis-spec)
(overlay-put overlay 'invisible invis-spec)
- (let ((p (point))
+ (let ((p (point-marker))
(cite-button-text
(concat "[" (number-to-string (count-lines beg-sub (point)))
- "-line citation.]")))
+ "-line citation. Click/Enter to show.]")))
(goto-char (- beg-sub 1))
(insert (concat "\n" indent))
(insert-button cite-button-text
'invisibility-spec invis-spec
:type 'notmuch-button-citation-toggle-type)
- (insert "\n")
- (goto-char (+ (length cite-button-text) p))
+ (forward-line)
))))
(move-to-column depth)
(if (looking-at notmuch-show-signature-regexp)
@@ -629,7 +634,7 @@ which this thread was originally shown."
(goto-char (- beg-sub 1))
(insert (concat "\n" indent))
(let ((sig-button-text (concat "[" (number-to-string sig-lines)
- "-line signature.]")))
+ "-line signature. Click/Enter to show.]")))
(insert-button sig-button-text 'invisibility-spec invis-spec
:type 'notmuch-button-signature-toggle-type)
)
@@ -637,52 +642,29 @@ which this thread was originally shown."
(goto-char end))))))
(forward-line))))
-(defun notmuch-show-markup-part (beg end depth mime-message)
+(defun notmuch-show-markup-part (beg end depth)
(if (re-search-forward notmuch-show-part-begin-regexp nil t)
(progn
- (if (eq mime-message nil)
- (let ((filename (notmuch-show-get-filename)))
- (with-temp-buffer
- (insert-file-contents filename nil nil nil t)
- (setq mime-message (mm-dissect-buffer)))))
(forward-line)
- (let ((part-beg (point-marker)))
+ (let ((beg (point-marker)))
(re-search-forward notmuch-show-part-end-regexp)
-
- (let ((part-end (copy-marker (match-beginning 0))))
- (goto-char part-end)
+ (let ((end (copy-marker (match-beginning 0))))
+ (goto-char end)
(if (not (bolp))
(insert "\n"))
- (indent-rigidly part-beg part-end depth)
- (save-excursion
- (goto-char part-beg)
- (forward-line -1)
- (beginning-of-line)
- (let ((handle-type (mm-handle-type mime-message))
- mime-type)
- (if (sequencep (car handle-type))
- (setq mime-type (car handle-type))
- (setq mime-type (car (car (cdr handle-type))))
- )
- (if (equal mime-type "text/html")
- (mm-display-part mime-message))))
-
- (notmuch-show-markup-citations-region part-beg part-end depth)
+ (indent-rigidly beg end depth)
+ (notmuch-show-markup-citations-region beg end depth)
; Advance to the next part (if any) (so the outer loop can
; determine whether we've left the current message.
(if (re-search-forward notmuch-show-part-begin-regexp nil t)
(beginning-of-line)))))
- (goto-char end))
- mime-message)
+ (goto-char end)))
(defun notmuch-show-markup-parts-region (beg end depth)
(save-excursion
(goto-char beg)
- (let (mime-message)
- (while (< (point) end)
- (setq mime-message
- (notmuch-show-markup-part
- beg end depth mime-message))))))
+ (while (< (point) end)
+ (notmuch-show-markup-part beg end depth))))
(defun notmuch-show-markup-body (depth match btn)
"Markup a message body, (indenting, buttonizing citations,
@@ -949,15 +931,17 @@ All currently available key bindings:
(lambda()
(hl-line-mode 1) ))
-(defun notmuch-show (thread-id &optional parent-buffer)
+(defun notmuch-show (thread-id &optional parent-buffer query-context)
"Run \"notmuch show\" with the given thread ID and display results.
The optional PARENT-BUFFER is the notmuch-search buffer from
which this notmuch-show command was executed, (so that the next
-thread from that buffer can be show when done with this one)."
+thread from that buffer can be show when done with this one).
+
+The optional QUERY-CONTEXT is a notmuch search term. Only messages from the thread
+matching this search term are shown if non-nil. "
(interactive "sNotmuch show: ")
- (let ((query notmuch-search-query-string)
- (buffer (get-buffer-create (concat "*notmuch-show-" thread-id "*"))))
+ (let ((buffer (get-buffer-create (concat "*notmuch-show-" thread-id "*"))))
(switch-to-buffer buffer)
(notmuch-show-mode)
(set (make-local-variable 'notmuch-show-parent-buffer) parent-buffer)
@@ -969,7 +953,11 @@ thread from that buffer can be show when done with this one)."
(erase-buffer)
(goto-char (point-min))
(save-excursion
- (call-process notmuch-command nil t nil "show" "--entire-thread" thread-id "and (" query ")")
+ (let* ((basic-args (list notmuch-command nil t nil "show" "--entire-thread" thread-id))
+ (args (if query-context (append basic-args (list "and (" query-context ")")) basic-args)))
+ (apply 'call-process args)
+ (when (and (eq (buffer-size) 0) query-context)
+ (apply 'call-process basic-args)))
(notmuch-show-markup-messages)
)
(run-hooks 'notmuch-show-hook)
@@ -1133,12 +1121,20 @@ Complete list of currently available key bindings:
"Return the thread for the current thread"
(get-text-property (point) 'notmuch-search-thread-id))
+(defun notmuch-search-find-authors ()
+ "Return the authors for the current thread"
+ (get-text-property (point) 'notmuch-search-authors))
+
+(defun notmuch-search-find-subject ()
+ "Return the subject for the current thread"
+ (get-text-property (point) 'notmuch-search-subject))
+
(defun notmuch-search-show-thread ()
"Display the currently selected thread."
(interactive)
(let ((thread-id (notmuch-search-find-thread-id)))
(if (> (length thread-id) 0)
- (notmuch-show thread-id (current-buffer))
+ (notmuch-show thread-id (current-buffer) notmuch-search-query-string)
(error "End of search results"))))
(defun notmuch-search-reply-to-thread ()
@@ -1193,7 +1189,7 @@ The tag is added to messages in the currently selected thread
which match the current search terms."
(interactive
(list (notmuch-select-tag-with-completion "Tag to add: ")))
- (notmuch-call-notmuch-process "tag" (concat "+" tag) (notmuch-search-find-thread-id) " and " notmuch-search-query-string)
+ (notmuch-call-notmuch-process "tag" (concat "+" tag) (notmuch-search-find-thread-id))
(notmuch-search-set-tags (delete-dups (sort (cons tag (notmuch-search-get-tags)) 'string<))))
(defun notmuch-search-remove-tag (tag)
@@ -1203,7 +1199,7 @@ The tag is removed from messages in the currently selected thread
which match the current search terms."
(interactive
(list (notmuch-select-tag-with-completion "Tag to remove: " (notmuch-search-find-thread-id))))
- (notmuch-call-notmuch-process "tag" (concat "-" tag) (notmuch-search-find-thread-id) " and " notmuch-search-query-string)
+ (notmuch-call-notmuch-process "tag" (concat "-" tag) (notmuch-search-find-thread-id))
(notmuch-search-set-tags (delete tag (notmuch-search-get-tags))))
(defun notmuch-search-archive-thread ()
@@ -1257,7 +1253,9 @@ This function advances the next thread when finished."
(goto-char (point-max))
(let ((beg (point-marker)))
(insert (format "%s %-7s %-40s %s (%s)\n" date count authors subject tags))
- (put-text-property beg (point-marker) 'notmuch-search-thread-id thread-id))
+ (put-text-property beg (point-marker) 'notmuch-search-thread-id thread-id)
+ (put-text-property beg (point-marker) 'notmuch-search-authors authors)
+ (put-text-property beg (point-marker) 'notmuch-search-subject subject))
(set 'line (match-end 0)))
(set 'more nil))))))
(delete-process proc))))