]> git.notmuchmail.org Git - notmuch/blobdiff - emacs/notmuch.el
emacs: Use --format-version for search, show, and reply
[notmuch] / emacs / notmuch.el
index 428b0117fadcba0a00b0526a685a3ba09e142292..63387a2dfe28c85fce445dc0a1f74d63498f3d0f 100644 (file)
@@ -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,23 @@ 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 nil
+                       (notmuch-check-async-exit-status proc msg)
+                     ;; Suppress the error signal since strange
+                     ;; things happen if a sentinel signals.
+                     (error (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 +821,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 +838,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 +939,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")