From 7bc18ebbed409ace4665ec9c9910b2837834b03d Mon Sep 17 00:00:00 2001 From: Kyle Meyer Date: Sat, 29 Aug 2020 13:22:48 -0400 Subject: [PATCH] ob-core: Avoid table conversion warning for empty results * lisp/ob-core.el (org-babel-import-elisp-from-file): Don't try to convert empty file to a table. * testing/lisp/test-ob.el (test-ob/import-elisp-from-file): Add tests. If org-babel-import-elisp-from-file is called with an empty file (which many ob- libraries do when there are no results), feeding that to org-table-import leads to a beginning-of-buffer error. Before 14878f3f9 (ob-core: Display warning on failure to read results, 2020-05-21), this error was hard to notice because, after catching it, it was reported as a quickly buried message. After that commit, it is displayed as a warning, which is not appropriate for the common and unproblematic case of empty results. Avoid the warning by only doing the table conversion if the file has content. Another option would be to do the table conversion but add a beginning-of-buffer arm to the surrounding condition-case. However, that risks swallowing other sources of that error. Reported-by: Colin Baxter --- lisp/ob-core.el | 17 +++++++++++------ testing/lisp/test-ob.el | 28 ++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 6 deletions(-) diff --git a/lisp/ob-core.el b/lisp/ob-core.el index 578622232..5b79919e8 100644 --- a/lisp/ob-core.el +++ b/lisp/ob-core.el @@ -3003,13 +3003,18 @@ If the table is trivial, then return it as a scalar." (with-temp-buffer (condition-case err (progn - (org-table-import file-name separator) + (insert-file-contents file-name) (delete-file file-name) - (delq nil - (mapcar (lambda (row) - (and (not (eq row 'hline)) - (mapcar #'org-babel-string-read row))) - (org-table-to-lisp)))) + (let ((pmax (point-max))) + ;; If the file was empty, don't bother trying to + ;; convert the table. + (when (> pmax 1) + (org-table-convert-region (point-min) pmax separator) + (delq nil + (mapcar (lambda (row) + (and (not (eq row 'hline)) + (mapcar #'org-babel-string-read row))) + (org-table-to-lisp)))))) (error (display-warning 'org-babel (format "Error reading results: %S" err) diff --git a/testing/lisp/test-ob.el b/testing/lisp/test-ob.el index afaf13555..580cd7d89 100644 --- a/testing/lisp/test-ob.el +++ b/testing/lisp/test-ob.el @@ -2252,6 +2252,34 @@ abc (should (= 0.1 (org-babel--string-to-number "0.1"))) (should (= 1.0 (org-babel--string-to-number "1.0")))) +(ert-deftest test-ob/import-elisp-from-file () + "Test `org-babel-import-elisp-from-file'." + (should + (equal + (org-test-with-temp-text-in-file "line 1\nline 2\n" + (cl-letf (((symbol-function 'display-warning) + (lambda (&rest _) (error "No warnings should occur")) + (org-table-convert-region-max-lines 2))) + (org-babel-import-elisp-from-file (buffer-file-name)))) + '(("line" 1) + ("line" 2)))) + ;; If an error occurs during table conversion, it is shown with + ;; `display-warning' rather than as a message to make sure the + ;; caller sees it. + (should-error + (org-test-with-temp-text-in-file "line 1\nline 2\n" + (cl-letf (((symbol-function 'display-warning) + (lambda (&rest _) (error "Warning should be displayed"))) + (org-table-convert-region-max-lines 1)) + (org-babel-import-elisp-from-file (buffer-file-name))))) + ;; But an empty file (as is the case when there are no execution + ;; results) does not trigger a warning. + (should-not + (org-test-with-temp-text-in-file "" + (cl-letf (((symbol-function 'display-warning) + (lambda (&rest _) (error "No warnings should occur")))) + (org-babel-import-elisp-from-file (buffer-file-name)))))) + (provide 'test-ob) ;;; test-ob ends here