X-Git-Url: https://git.notmuchmail.org/git?p=notmuch;a=blobdiff_plain;f=emacs%2Fnotmuch.el;h=c98a4febbf69f9dcc100aa8e2b3449d77a9ed89d;hp=428b0117fadcba0a00b0526a685a3ba09e142292;hb=401dbebd4803477563eff03d719605ed37a8e44d;hpb=294667871a30b86790f7dd19c13a4da6806bf52a diff --git a/emacs/notmuch.el b/emacs/notmuch.el index 428b0117..c98a4feb 100644 --- a/emacs/notmuch.el +++ b/emacs/notmuch.el @@ -536,19 +536,13 @@ If BARE is set then do not prefix with \"thread:\"" (defun notmuch-call-notmuch-process (&rest args) "Synchronously invoke \"notmuch\" with the given list of arguments. -Output from the process will be presented to the user as an error -and will also appear in a buffer named \"*Notmuch errors*\"." - (let ((error-buffer (get-buffer-create "*Notmuch errors*"))) - (with-current-buffer error-buffer - (erase-buffer)) - (if (eq (apply 'call-process notmuch-command nil error-buffer nil args) 0) - (point) - (progn - (with-current-buffer error-buffer - (let ((beg (point-min)) - (end (- (point-max) 1))) - (error (buffer-substring beg end)) - )))))) +If notmuch exits with a non-zero status, output from the process +will appear in a buffer named \"*Notmuch errors*\" and an error +will be signaled." + (with-temp-buffer + (let ((status (apply #'call-process notmuch-command nil t nil args))) + (notmuch-check-exit-status status (cons notmuch-command args) + (buffer-string))))) (defun notmuch-search-set-tags (tags &optional pos) (let ((new-result (plist-put (notmuch-search-get-result pos) :tags tags))) @@ -644,6 +638,7 @@ of the result." (exit-status (process-exit-status proc)) (never-found-target-thread nil)) (when (memq status '(exit signal)) + (catch 'return (kill-buffer (process-get proc 'parse-buf)) (if (buffer-live-p buffer) (with-current-buffer buffer @@ -654,17 +649,26 @@ of the result." (if (eq status 'signal) (insert "Incomplete search results (search 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") + (insert "End of search results.\n") + ;; For version mismatch, there's no point in + ;; showing the search buffer + (when (or (= exit-status 20) (= exit-status 21)) + (kill-buffer)) + (condition-case err + (notmuch-check-async-exit-status proc msg) + ;; Suppress the error signal since strange + ;; things happen if a sentinel signals. Mimic + ;; the top-level's handling of error messages. + (error + (message "%s" (second err)) + (throw 'return nil))) (if (and atbob (not (string= notmuch-search-target-thread "found"))) (set 'never-found-target-thread t))))) (when (and never-found-target-thread notmuch-search-target-line) (goto-char (point-min)) - (forward-line (1- notmuch-search-target-line)))))))) + (forward-line (1- notmuch-search-target-line))))))))) (defcustom notmuch-search-line-faces '(("unread" :weight bold) ("flagged" :foreground "blue")) @@ -820,16 +824,6 @@ non-authors is found, assume that all of the authors match." (insert (apply #'format string objects)) (insert "\n"))) -;; These two variables are internal variables to the parsing -;; routines. They are always used buffer local but need to be declared -;; globally to avoid compiler warnings. - -(defvar notmuch-json-state nil - "Internal incremental JSON parser object: local to the buffer being parsed.") - -(defvar notmuch-json-parser nil - "State of the internal JSON parser: local to the buffer being parsed.") - (defun notmuch-search-process-filter (proc string) "Process and filter the output of \"notmuch search\"" (let ((results-buf (process-buffer proc)) @@ -847,59 +841,6 @@ non-authors is found, assume that all of the authors match." 'notmuch-search-show-error results-buf))))) -(defun notmuch-json-parse-partial-list (result-function error-function results-buf) - "Parse a partial JSON list from current buffer. - -This function consumes a JSON list from the current buffer, -applying RESULT-FUNCTION in buffer RESULT-BUFFER to each complete -value in the list. It operates incrementally and should be -called whenever the buffer has been extended with additional -data. - -If there is a syntax error, this will attempt to resynchronize -with the input and will apply ERROR-FUNCTION in buffer -RESULT-BUFFER to any input that was skipped. - -It sets up all the needed internal variables: the caller just -needs to call it with point in the same place that the parser -left it." - (let (done) - (unless (local-variable-p 'notmuch-json-parser) - (set (make-local-variable 'notmuch-json-parser) - (notmuch-json-create-parser (current-buffer))) - (set (make-local-variable 'notmuch-json-state) 'begin)) - (while (not done) - (condition-case nil - (case notmuch-json-state - ((begin) - ;; Enter the results list - (if (eq (notmuch-json-begin-compound - notmuch-json-parser) 'retry) - (setq done t) - (setq notmuch-json-state 'result))) - ((result) - ;; Parse a result - (let ((result (notmuch-json-read notmuch-json-parser))) - (case result - ((retry) (setq done t)) - ((end) (setq notmuch-json-state 'end)) - (otherwise (with-current-buffer results-buf - (funcall result-function result)))))) - ((end) - ;; Any trailing data is unexpected - (notmuch-json-eof notmuch-json-parser) - (setq done t))) - (json-error - ;; Do our best to resynchronize and ensure forward - ;; progress - (let ((bad (buffer-substring (line-beginning-position) - (line-end-position)))) - (forward-line) - (with-current-buffer results-buf - (funcall error-function "%s" bad)))))) - ;; Clear out what we've parsed - (delete-region (point-min) (point)))) - (defun notmuch-search-tag-all (&optional tag-changes) "Add/remove tags from all messages in current search buffer. @@ -1001,7 +942,7 @@ Other optional parameters are used as follows: (let ((proc (start-process "notmuch-search" buffer notmuch-command "search" - "--format=json" + "--format=json" "--format-version=1" (if oldest-first "--sort=oldest-first" "--sort=newest-first")