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 <m43cap@yandex.com>
<https://orgmode.org/list/878se3nhbj.fsf@yandex.com>
This commit is contained in:
Kyle Meyer 2020-08-29 13:22:48 -04:00
parent e8ebf5d6c9
commit 7bc18ebbed
2 changed files with 39 additions and 6 deletions

View File

@ -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)

View File

@ -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