]> git.eshelyaron.com Git - emacs.git/commitdiff
Add new variable to selectively suppress backtraces in batch mode.
authorPhilipp Stephani <phst@google.com>
Mon, 7 Dec 2020 10:55:29 +0000 (11:55 +0100)
committerPhilipp Stephani <phst@google.com>
Mon, 7 Dec 2020 10:59:06 +0000 (11:59 +0100)
* src/eval.c (syms_of_eval): Define new variable
'backtrace-on-error-noninteractive' to selectively enable backtrace
printing in batch mode.
(signal_or_quit): Use it.

* etc/NEWS: Document new variable.

* test/src/eval-tests.el (eval-tests/backtrace-in-batch-mode/inhibit):
New unit test.

etc/NEWS
src/eval.c
test/src/eval-tests.el

index 8390c82c98b2dc0125229005222ace20431c9bca..a30355f20dbe1e800f9fccdcc1f05db387edaaa6 100644 (file)
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -193,7 +193,9 @@ These functions return the connection local value of the respective
 variables.  This can be used for remote hosts.
 
 ** Emacs now prints a backtrace when signaling an error in batch mode.  This
-makes debugging Emacs Lisp scripts run in batch mode easier.
+makes debugging Emacs Lisp scripts run in batch mode easier.  If you
+want to disable this behavior, set 'backtrace-on-error-noninteractive'
+to nil.
 
 \f
 * Editing Changes in Emacs 28.1
index 18df484aac07fa07490898dad2565221433bf575..1351d283c58399968cdc4299cd8d7cc62bf3f98f 100644 (file)
@@ -1735,7 +1735,8 @@ signal_or_quit (Lisp_Object error_symbol, Lisp_Object data, bool keyboard_quit)
      debugging.  Make sure to use `debug' unconditionally to not interfere with
      ERT or other packages that install custom debuggers.  */
   if (!debugger_called && !NILP (error_symbol)
-      && (NILP (clause) || EQ (h->tag_or_ch, Qerror)) && noninteractive)
+      && (NILP (clause) || EQ (h->tag_or_ch, Qerror)) && noninteractive
+      && backtrace_on_error_noninteractive)
     {
       ptrdiff_t count = SPECPDL_INDEX ();
       specbind (Vdebugger, Qdebug);
@@ -4264,6 +4265,12 @@ Note that `debug-on-error', `debug-on-quit' and friends
 still determine whether to handle the particular condition.  */);
   Vdebug_on_signal = Qnil;
 
+  DEFVAR_BOOL ("backtrace-on-error-noninteractive",
+               backtrace_on_error_noninteractive,
+               doc: /* If non-nil and Emacs is running noninteractively,
+print a backtrace on encountering an unhandled error.  */);
+  backtrace_on_error_noninteractive = true;
+
   /* The value of num_nonmacro_input_events as of the last time we
    started to enter the debugger.  If we decide to enter the debugger
    again when this is still equal to num_nonmacro_input_events, then we
index 4125573dc6adac876ce96eb81ab04e7a1e18824f..297db81f5ab3796ed6a98e676bf6ec64e52c960c 100644 (file)
@@ -195,6 +195,23 @@ expressions works for identifiers starting with period."
         (search-forward "  foo()")
         (search-forward "  normal-top-level()")))))
 
+(ert-deftest eval-tests/backtrace-in-batch-mode/inhibit ()
+  (let ((emacs (expand-file-name invocation-name invocation-directory)))
+    (skip-unless (file-executable-p emacs))
+    (with-temp-buffer
+      (let ((status (call-process
+                     emacs nil t nil
+                     "--quick" "--batch"
+                     (concat "--eval="
+                             (prin1-to-string
+                              '(progn
+                                 (defun foo () (error "Boo"))
+                                 (let ((backtrace-on-error-noninteractive nil))
+                                   (foo))))))))
+        (should (natnump status))
+        (should-not (eql status 0)))
+      (should (equal (string-trim (buffer-string)) "Boo")))))
+
 (ert-deftest eval-tests/backtrace-in-batch-mode/demoted-errors ()
   (let ((emacs (expand-file-name invocation-name invocation-directory)))
     (skip-unless (file-executable-p emacs))