(put-text-property pos next 'face (cons face cur))
(setq pos next)))))
-(defun notmuch-pop-up-error (msg)
- "Pop up an error buffer displaying MSG.
-
-This will accumulate error messages in the errors buffer until
-the user dismisses it."
-
- (let ((buf (get-buffer-create "*Notmuch errors*")))
- (with-current-buffer buf
- (view-mode-enter nil #'kill-buffer)
- (let ((inhibit-read-only t))
- (goto-char (point-max))
- (unless (bobp)
- (insert "\n"))
- (insert msg)
+(defun notmuch-logged-error (msg &optional extra)
+ "Log MSG and EXTRA to *Notmuch errors* and signal MSG.
+
+This logs MSG and EXTRA to the *Notmuch errors* buffer and
+signals MSG as an error. If EXTRA is non-nil, text referring the
+user to the *Notmuch errors* buffer will be appended to the
+signaled error. This function does not return."
+
+ (with-current-buffer (get-buffer-create "*Notmuch errors*")
+ (goto-char (point-max))
+ (unless (bobp)
+ (newline))
+ (save-excursion
+ (insert "[" (current-time-string) "]\n" msg)
+ (unless (bolp)
+ (newline))
+ (when extra
+ (insert extra)
(unless (bolp)
- (insert "\n"))))
- (pop-to-buffer buf)))
+ (newline)))))
+ (error "%s" (concat msg (when extra
+ " (see *Notmuch errors* for more details)"))))
(defun notmuch-check-async-exit-status (proc msg)
"If PROC exited abnormally, pop up an error buffer and signal an error.
(cond
((eq exit-status 0) t)
((eq exit-status 20)
- (notmuch-pop-up-error "Error: Version mismatch.
+ (notmuch-logged-error "notmuch CLI version mismatch
Emacs requested an older output format than supported by the notmuch CLI.
-You may need to restart Emacs or upgrade your notmuch Emacs package.")
- (error "notmuch CLI version mismatch"))
+You may need to restart Emacs or upgrade your notmuch Emacs package."))
((eq exit-status 21)
- (notmuch-pop-up-error "Error: Version mismatch.
+ (notmuch-logged-error "notmuch CLI version mismatch
Emacs requested a newer output format than supported by the notmuch CLI.
-You may need to restart Emacs or upgrade your notmuch package.")
- (error "notmuch CLI version mismatch"))
+You may need to restart Emacs or upgrade your notmuch package."))
(t
- (notmuch-pop-up-error
- (concat
- (format "Error invoking notmuch. %s exited with %s%s.\n"
- (mapconcat #'identity command " ")
- ;; Signal strings look like "Terminated", hence the
- ;; colon.
- (if (integerp exit-status) "status " "signal: ")
- exit-status)
- (when err-file
- (concat "Error:\n"
- (with-temp-buffer
- (insert-file-contents err-file)
- (if (eobp)
- "(no error output)\n"
- (buffer-string)))))
- (when (and output (not (equal output "")))
- (format "Output:\n%s" output))))
- ;; Mimic `process-lines'
- (error "%s exited with status %s" (car command) exit-status))))
+ (let* ((err (when err-file
+ (with-temp-buffer
+ (insert-file-contents err-file)
+ (unless (eobp)
+ (buffer-string)))))
+ (extra
+ (concat
+ "command: " (mapconcat #'shell-quote-argument command " ") "\n"
+ (if (integerp exit-status)
+ (format "exit status: %s\n" exit-status)
+ (format "exit signal: %s\n" exit-status))
+ (when err
+ (concat "stderr:\n" err))
+ (when output
+ (concat "stdout:\n" output)))))
+ (if err
+ ;; We have an error message straight from the CLI.
+ (notmuch-logged-error
+ (replace-regexp-in-string "\\s $" "" err) extra)
+ ;; We only have combined output from the CLI; don't inundate
+ ;; the user with it. Mimic `process-lines'.
+ (notmuch-logged-error (format "%s exited with status %s"
+ (car command) exit-status)
+ extra))
+ ;; `notmuch-logged-error' does not return.
+ ))))
(defun notmuch-call-notmuch-json (&rest args)
"Invoke `notmuch-command' with `args' and return the parsed JSON output.
EOF
chmod a+x notmuch_fail
test_emacs "(let ((notmuch-command \"$PWD/notmuch_fail\"))
+ (with-current-buffer \"*Messages*\" (erase-buffer))
(notmuch-search \"tag:inbox\")
(notmuch-test-wait)
- (test-output)
+ (with-current-buffer \"*Messages*\"
+ (test-output \"MESSAGES\"))
(with-current-buffer \"*Notmuch errors*\"
- (test-output \"ERROR\")))"
-test_expect_equal "$(cat OUTPUT ERROR)" "\
+ (test-output \"ERROR\"))
+ (test-output))"
+sed -i -e 's/^\[.*\]$/[XXX]/' ERROR
+test_expect_equal "$(cat OUTPUT; echo ---; cat MESSAGES; echo ---; cat ERROR)" "\
Error: Unexpected output from notmuch search:
This is output
Error: Unexpected output from notmuch search:
This is an error
End of search results.
-Error invoking notmuch. $PWD/notmuch_fail search --format=json --format-version=1 --sort=newest-first tag:inbox exited with status 1."
-
+---
+$PWD/notmuch_fail exited with status 1 (see *Notmuch errors* for more details)
+---
+[XXX]
+$PWD/notmuch_fail exited with status 1
+command: $PWD/notmuch_fail search --format\=json --format-version\=1 --sort\=newest-first tag\:inbox
+exit status: 1"
test_done
EOF
chmod a+x notmuch_fail
test_emacs "(let ((notmuch-command \"$PWD/notmuch_fail\"))
- (ignore-errors (notmuch-show \"*\"))
+ (with-current-buffer \"*Messages*\" (erase-buffer))
+ (condition-case err
+ (notmuch-show \"*\")
+ (error (message \"%s\" (second err))))
(notmuch-test-wait)
- (test-output)
+ (with-current-buffer \"*Messages*\"
+ (test-output \"MESSAGES\"))
(with-current-buffer \"*Notmuch errors*\"
- (test-output \"ERROR\")))"
-test_expect_equal "$(cat OUTPUT ERROR)" "\
-Error invoking notmuch. $PWD/notmuch_fail show --format=json --format-version=1 --exclude=false ' * ' exited with status 1.
-Error:
+ (test-output \"ERROR\"))
+ (test-output))"
+sed -i -e 's/^\[.*\]$/[XXX]/' ERROR
+test_expect_equal "$(cat OUTPUT; echo ---; cat MESSAGES; echo ---; cat ERROR)" "\
+---
+This is an error (see *Notmuch errors* for more details)
+---
+[XXX]
This is an error
-Output:
+command: $PWD/notmuch_fail show --format\\=json --format-version\\=1 --exclude\\=false \\' \\* \\'
+exit status: 1
+stderr:
+This is an error
+stdout:
This is output"