* Org 9.6-pre and Bash sessions @ 2022-10-13 15:14 Rudolf Adamkovič 2022-10-13 17:07 ` Michael Welle 2022-10-14 3:44 ` Ihor Radchenko 0 siblings, 2 replies; 37+ messages in thread From: Rudolf Adamkovič @ 2022-10-13 15:14 UTC (permalink / raw) To: emacs-orgmode Hello there! I noticed today that Bash source blocks with ':session" does not seem to work with Org 9.6-pre (3e8648775). Does anyone else have the problem? CONFIGURATION FILE: ------------------ > (setq-default org-use-extra-keys t) > (with-eval-after-load 'org > (add-to-list 'org-babel-load-languages '(shell . t)) > ;; The weirdest API ever. > (org-babel-do-load-languages > 'org-babel-load-languages > org-babel-load-languages)) TEST FILE: --------- > * Something > > 1. Something > > #+begin_src bash :session test :results output > if true > then > echo "hello" > fi > #+end_src REPRODUCTION STEPS: ------------------ Execute the source block with C-c C-c. Expected: Block executes with the result "hello". Actual: Emacs says "Executing Bash unknown at position 22..." and freezes. (C-g unfreezes Emacs.) NOTES: ----- When I remove the leading whitespace ... > * Something > > 1. Something > > #+begin_src bash :session test :results output > if true > then > echo "hello" > fi > #+end_src ... then Emacs still freezes, but at least the message makes sense, saying "Bash code block" instead of "Bash unknown". Rudy -- "Simplicity is complexity resolved." -- Constantin Brâncuși, 1876-1957 Rudolf Adamkovič <salutis@me.com> [he/him] Studenohorská 25 84103 Bratislava Slovakia ^ permalink raw reply [flat|nested] 37+ messages in thread
* Re: Org 9.6-pre and Bash sessions 2022-10-13 15:14 Org 9.6-pre and Bash sessions Rudolf Adamkovič @ 2022-10-13 17:07 ` Michael Welle 2022-10-14 3:44 ` Ihor Radchenko 1 sibling, 0 replies; 37+ messages in thread From: Michael Welle @ 2022-10-13 17:07 UTC (permalink / raw) To: emacs-orgmode Hello, Rudolf Adamkovič <salutis@me.com> writes: > Hello there! > > I noticed today that Bash source blocks with ':session" does not seem to > work with Org 9.6-pre (3e8648775). Does anyone else have the problem? funnily I observed something similar while generating semester projects for my students. Example: #+name: seprj_conf_table | xxxzwei | 234 2bar | | xxxeins | 2342bar | | xxxdrei | aaaa${eins}bbbb | #+begin_src sh :session foo :var conf=seprj_conf_table :separator = IFS=$'^\n\t' for val in "$conf" ; do eval "export '$val'" done env |grep xxx #+end_src With main this hangs until C-g. I have an other machine with a little bit older Org: commit 9b62bcc9c60302467d1d45b6c240057e80fce656 (HEAD) Author: Lars Ingebrigtsen <larsi@gnus.org> Date: Sat Sep 24 15:17:23 2022 +0200 Backport commit 8dacd8cd9 from Emacs That works as expected. So I guess the regression was introduced within the last week or two. Regards hmw ^ permalink raw reply [flat|nested] 37+ messages in thread
* Re: Org 9.6-pre and Bash sessions 2022-10-13 15:14 Org 9.6-pre and Bash sessions Rudolf Adamkovič 2022-10-13 17:07 ` Michael Welle @ 2022-10-14 3:44 ` Ihor Radchenko 2022-10-15 20:56 ` Rudolf Adamkovič 1 sibling, 1 reply; 37+ messages in thread From: Ihor Radchenko @ 2022-10-14 3:44 UTC (permalink / raw) To: Rudolf Adamkovič; +Cc: emacs-orgmode Rudolf Adamkovič <salutis@me.com> writes: > I noticed today that Bash source blocks with ':session" does not seem to > work with Org 9.6-pre (3e8648775). Does anyone else have the problem? Confirmed. The cause is a35d16368 Author: Ihor Radchenko <yantar92@gmail.com> ob-shell: Fix output containing strings matching `comint-prompt-regexp' * lisp/ob-comint.el (org-babel-comint-wait-for-output): Do not rely on `face-at-point' returning non-nil. * lisp/ob-shell.el (org-babel-shell-set-prompt-commands): New constant holding shell-specific commands to change prompt. (org-babel-prompt-command): New variable holding command to be user to set distinguishable prompt. (org-babel-shell-initialize): Set `org-babel-prompt-command' according to shell name. (org-babel-sh-prompt): New variable holding default shell prompt. (org-babel-sh-initiate-session): Change the default prompt to `org-babel-sh-prompt' and alter `comint-prompt-regexp' to match it tightly. Fixes https://list.orgmode.org/CKK9TULBP2BG.2UITT31YJV03J@laptop/T/#mc8e3ca2f5f1b9a94040a68b4c6201234b209041c > CONFIGURATION FILE: > ------------------ > >> (setq-default org-use-extra-keys t) >> (with-eval-after-load 'org >> (add-to-list 'org-babel-load-languages '(shell . t)) >> ;; The weirdest API ever. >> (org-babel-do-load-languages >> 'org-babel-load-languages >> org-babel-load-languages)) > > TEST FILE: > --------- > >> * Something >> >> 1. Something >> >> #+begin_src bash :session test :results output >> if true >> then >> echo "hello" >> fi >> #+end_src > > REPRODUCTION STEPS: > ------------------ > > Execute the source block with C-c C-c. > > Expected: > > Block executes with the result "hello". Is it what you actually saw in the past? I just tried with older Org versions on my system and the output is : [00m > > > hello -- Ihor Radchenko // yantar92, Org mode contributor, Learn more about Org mode at <https://orgmode.org/>. Support Org development at <https://liberapay.com/org-mode>, or support my work at <https://liberapay.com/yantar92> ^ permalink raw reply [flat|nested] 37+ messages in thread
* Re: Org 9.6-pre and Bash sessions 2022-10-14 3:44 ` Ihor Radchenko @ 2022-10-15 20:56 ` Rudolf Adamkovič 2022-10-17 8:34 ` Ihor Radchenko 0 siblings, 1 reply; 37+ messages in thread From: Rudolf Adamkovič @ 2022-10-15 20:56 UTC (permalink / raw) To: Ihor Radchenko; +Cc: emacs-orgmode Ihor Radchenko <yantar92@gmail.com> writes: > Is it what you actually saw in the past? I just tried with older Org > versions on my system and the output is > > : [00m > > > hello No. By "expected", I mean what I expect as a user (and what I would assert on in a regression test as a developer). For the record, with Org in Emacs 29, I get: : : > > > hello on the first run and then : : > > hello on the subsequent runs. Better than the new version but still wrong. :) Rudy -- "Genius is 1% inspiration and 99% perspiration." -- Thomas Alva Edison, 1932 Rudolf Adamkovič <salutis@me.com> [he/him] Studenohorská 25 84103 Bratislava Slovakia ^ permalink raw reply [flat|nested] 37+ messages in thread
* Re: Org 9.6-pre and Bash sessions 2022-10-15 20:56 ` Rudolf Adamkovič @ 2022-10-17 8:34 ` Ihor Radchenko 2022-10-21 5:29 ` Ihor Radchenko 0 siblings, 1 reply; 37+ messages in thread From: Ihor Radchenko @ 2022-10-17 8:34 UTC (permalink / raw) To: Rudolf Adamkovič; +Cc: Ihor Radchenko, emacs-orgmode Rudolf Adamkovič <salutis@me.com> writes: > : > : > > hello > > on the subsequent runs. > > Better than the new version but still wrong. :) And this is what drove me crazy during debugging. I do not understand the logic of all that ob-comint code. I have identified that the hang happens because Org does not change PS2 prompt. Just PS1. But fixing this would yield to : org_babel_sh_prompt> org_babel_sh_prompt> hello Then, I tried to see how the original code works. And it does not :facepalm: I asked emacs-devel https://yhetil.org/emacs-devel/87y1tgqhmc.fsf@localhost/T/#u No clue how to read the script output programatically in comint buffer. -- Ihor Radchenko // yantar92, Org mode contributor, Learn more about Org mode at <https://orgmode.org/>. Support Org development at <https://liberapay.com/org-mode>, or support my work at <https://liberapay.com/yantar92> ^ permalink raw reply [flat|nested] 37+ messages in thread
* Re: Org 9.6-pre and Bash sessions 2022-10-17 8:34 ` Ihor Radchenko @ 2022-10-21 5:29 ` Ihor Radchenko 2022-10-21 13:38 ` Rudolf Adamkovič 0 siblings, 1 reply; 37+ messages in thread From: Ihor Radchenko @ 2022-10-21 5:29 UTC (permalink / raw) To: Rudolf Adamkovič; +Cc: Ihor Radchenko, emacs-orgmode [-- Attachment #1: Type: text/plain, Size: 811 bytes --] Ihor Radchenko <yantar92@posteo.net> writes: > Rudolf Adamkovič <salutis@me.com> writes: > >> : >> : > > hello >> >> on the subsequent runs. >> >> Better than the new version but still wrong. :) > > And this is what drove me crazy during debugging. I do not understand > the logic of all that ob-comint code. > > I have identified that the hang happens because Org does not change PS2 > prompt. Just PS1. But fixing this would yield to > > : org_babel_sh_prompt> org_babel_sh_prompt> hello > > Then, I tried to see how the original code works. And it does not > :facepalm: > > I asked emacs-devel > https://yhetil.org/emacs-devel/87y1tgqhmc.fsf@localhost/T/#u See the attached tentative patch. I'd appreciate some testing. Hopefully, I did not break anything. Comint is tricky. [-- Attachment #2: 0001-ob-shell-Fix-multi-line-scripts-in-sessions.patch --] [-- Type: text/x-patch, Size: 4766 bytes --] From 4c6eead351cbdce1b9210a738c65b3a139d1cc0c Mon Sep 17 00:00:00 2001 Message-Id: <4c6eead351cbdce1b9210a738c65b3a139d1cc0c.1666330028.git.yantar92@posteo.net> From: Ihor Radchenko <yantar92@posteo.net> Date: Fri, 21 Oct 2022 13:21:57 +0800 Subject: [PATCH] ob-shell: Fix multi-line scripts in sessions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * lisp/ob-comint.el (org-babel-comint-with-output): Cleanup empty output. Such output is spitted unnecessarily for multi-line scripts. * lisp/ob-shell.el (org-babel-shell-set-prompt-commands): Disable PS2 and equivalent prompts. Make sure that PROMPT_COMMAND does not interfere with PS1 setting in POSIX shells. (org-babel-sh-evaluate): Do not send input line-by-line. Instead, let `org-babel-coming-with-output' handle waiting for the output as well as recording it. Update to the new `org-babel-coming-with-output' behavior of cleaning empty outputs. * testing/lisp/test-ob-shell.el (test-ob-shell/session): Add test. Reported-by: Rudolf Adamkovič <salutis@me.com> Link: https://list.orgmode.org/orgmode/m2r0zboix1.fsf@me.com/ --- lisp/ob-comint.el | 2 +- lisp/ob-shell.el | 29 ++++++++++++++--------------- testing/lisp/test-ob-shell.el | 6 +++++- 3 files changed, 20 insertions(+), 17 deletions(-) diff --git a/lisp/ob-comint.el b/lisp/ob-comint.el index 36a55d36c..ec7d3f6c9 100644 --- a/lisp/ob-comint.el +++ b/lisp/ob-comint.el @@ -109,7 +109,7 @@ (defmacro org-babel-comint-with-output (meta &rest body) "\n" "[\r\n]+" (regexp-quote (or ,full-body ""))) string-buffer)) (setq string-buffer (substring string-buffer (match-end 0)))) - (split-string string-buffer comint-prompt-regexp))))) + (delete "" (split-string string-buffer comint-prompt-regexp)))))) (defun org-babel-comint-input-command (buffer cmd) "Pass CMD to BUFFER. diff --git a/lisp/ob-shell.el b/lisp/ob-shell.el index 4d579ae87..d38d2d335 100644 --- a/lisp/ob-shell.el +++ b/lisp/ob-shell.el @@ -47,10 +47,15 @@ (defvar org-babel-default-header-args:shell '()) (defvar org-babel-shell-names) (defconst org-babel-shell-set-prompt-commands - '(("fish" . "function fish_prompt\n\techo \"%s\"\nend") - ("csh" . "set prompt=\"%s\"") + '(;; Fish has no PS2 equivalent. + ("fish" . "function fish_prompt\n\techo \"%s\"\nend") + ;; prompt2 is like PS2 in POSIX shells. + ("csh" . "set prompt=\"%s\"\nset prompt2=\"\"") + ;; PowerShell, similar to fish, does not have PS2 equivalent. ("posh" . "function prompt { \"%s\" }") - (t . "PS1=\"%s\"")) + ;; PROMPT_COMMAND can override PS1 settings. Disable it. + ;; Disable PS2 to avoid garbage in multi-line inputs. + (t . "PROMPT_COMMAND=;PS1=\"%s\";PS2=")) "Alist assigning shells with their prompt setting command. Each element of the alist associates a shell type from @@ -299,20 +304,14 @@ (defun org-babel-sh-evaluate (session body &optional params stdin cmdline) #'org-babel-sh-strip-weird-long-prompt (mapcar #'org-trim - (butlast + (butlast ; Remove eoe indicator (org-babel-comint-with-output (session org-babel-sh-eoe-output t body) - (dolist (line (append (split-string (org-trim body) "\n") - (list org-babel-sh-eoe-indicator))) - (insert line) - (comint-send-input nil t) - (while (save-excursion - (goto-char comint-last-input-end) - (not (re-search-forward - comint-prompt-regexp nil t))) - (accept-process-output - (get-buffer-process (current-buffer)))))) - 2)) + (insert (org-trim body) "\n" + org-babel-sh-eoe-indicator) + (comint-send-input nil t)) + ;; Remove `org-babel-sh-eoe-indicator' output line. + 1)) "\n")) ;; External shell script, with or without a predefined ;; shebang. diff --git a/testing/lisp/test-ob-shell.el b/testing/lisp/test-ob-shell.el index a0d5a8d22..05c369174 100644 --- a/testing/lisp/test-ob-shell.el +++ b/testing/lisp/test-ob-shell.el @@ -46,7 +46,11 @@ (ert-deftest test-ob-shell/session () ob-comint.el, which was not previously tested." (let ((res (org-babel-execute:sh "echo 1; echo 2" '((:session . "yes"))))) (should res) - (should (listp res)))) + (should (listp res))) + ;; Test multi-line input. + (let ((res (org-babel-execute:sh "if true; then\necho \"yes\"\nfi" '((:session . "yes"))))) + (should res) + (should (string= "yes" res)))) ; A list of tests using the samples in ob-shell-test.org (ert-deftest ob-shell/generic-uses-no-arrays () -- 2.35.1 [-- Attachment #3: Type: text/plain, Size: 225 bytes --] -- Ihor Radchenko // yantar92, Org mode contributor, Learn more about Org mode at <https://orgmode.org/>. Support Org development at <https://liberapay.com/org-mode>, or support my work at <https://liberapay.com/yantar92> ^ permalink raw reply related [flat|nested] 37+ messages in thread
* Re: Org 9.6-pre and Bash sessions 2022-10-21 5:29 ` Ihor Radchenko @ 2022-10-21 13:38 ` Rudolf Adamkovič 2022-10-22 4:22 ` Ihor Radchenko 0 siblings, 1 reply; 37+ messages in thread From: Rudolf Adamkovič @ 2022-10-21 13:38 UTC (permalink / raw) To: Ihor Radchenko; +Cc: Ihor Radchenko, emacs-orgmode Ihor Radchenko <yantar92@posteo.net> writes: > See the attached tentative patch. > I'd appreciate some testing. Hopefully, I did not break anything. I did some testing and found no issues. Great work! Below, I include some suggestions regarding the patch. > * lisp/ob-comint.el (org-babel-comint-with-output): Cleanup empty > output. Such output is spitted unnecessarily for multi-line scripts. - 'cleanup' (noun) -> 'clean up' (verb) - 'spitted' -> ??? (did you mean 'split', perhaps?) > * testing/lisp/test-ob-shell.el (test-ob-shell/session): Add test. - 'test' -> 'a test' > + (let ((res (org-babel-execute:sh "if true; then\necho \"yes\"\nfi" '((:session . "yes"))))) This line has 93 columns, which makes it needlessly hard to read. Consider, (let ((result (org-babel-execute:sh "if true \n then \n echo yes \n fi" '((:session . "yes"))))) (should result) (should (string= "yes" result))) I replaced the remaining semicolons with newlines, given the test focuses on "multi-line scripts". Further, I removed the needless (escaped) quotes around "yes". Lastly, I renamed 'res' to 'result', improving readability and consistency, given the file already uses 'result' in another 'let'. Rudy -- "Programming reliably -- must be an activity of an undeniably mathematical nature […] You see, mathematics is about thinking, and doing mathematics is always trying to think as well as possible." -- Edsger W. Dijkstra, 1981 Rudolf Adamkovič <salutis@me.com> [he/him] Studenohorská 25 84103 Bratislava Slovakia ^ permalink raw reply [flat|nested] 37+ messages in thread
* Re: Org 9.6-pre and Bash sessions 2022-10-21 13:38 ` Rudolf Adamkovič @ 2022-10-22 4:22 ` Ihor Radchenko 2022-10-22 9:44 ` Rudolf Adamkovič 0 siblings, 1 reply; 37+ messages in thread From: Ihor Radchenko @ 2022-10-22 4:22 UTC (permalink / raw) To: Rudolf Adamkovič; +Cc: Ihor Radchenko, emacs-orgmode Rudolf Adamkovič <salutis@me.com> writes: > Ihor Radchenko <yantar92@posteo.net> writes: > >> See the attached tentative patch. >> I'd appreciate some testing. Hopefully, I did not break anything. > > I did some testing and found no issues. > > Great work! > > Below, I include some suggestions regarding the patch. Thanks! Applied onto main incorporating your suggestions. https://git.savannah.gnu.org/cgit/emacs/org-mode.git/commit/?id=801c93638ab4b6616567035c6438ad229bc14c1d -- Ihor Radchenko // yantar92, Org mode contributor, Learn more about Org mode at <https://orgmode.org/>. Support Org development at <https://liberapay.com/org-mode>, or support my work at <https://liberapay.com/yantar92> ^ permalink raw reply [flat|nested] 37+ messages in thread
* Re: Org 9.6-pre and Bash sessions 2022-10-22 4:22 ` Ihor Radchenko @ 2022-10-22 9:44 ` Rudolf Adamkovič 2022-10-22 10:59 ` Ihor Radchenko 0 siblings, 1 reply; 37+ messages in thread From: Rudolf Adamkovič @ 2022-10-22 9:44 UTC (permalink / raw) To: Ihor Radchenko; +Cc: Ihor Radchenko, emacs-orgmode Ihor Radchenko <yantar92@posteo.net> writes: >> I did some testing and found no issues. Update: Today I needed to run some Bash, and it seems broken. PROBLEM 1: WITHOUT A SESSION ============================ CONFIGURATION: Emacs 29, Org from Git (2f5e7103e59f06631e985d3dd39af21b5b7464ea) REPRODUCTION STEPS: Run the following code block: #+begin_src bash :results output echo one > one.txt echo two > two.txt diff one.txt two.txt #+end_src ACTUAL RESULTS: #+RESULTS: EXPECTED RESULTS: #+RESULTS: : 1c1 : < one : --- : > two PROBLEM 2: WITH A SESSION ========================= CONFIGURATION: Emacs 29, Org from Git (2f5e7103e59f06631e985d3dd39af21b5b7464ea) REPRODUCTION STEPS: #+begin_src bash :session bash :results output echo one > one.txt echo two > two.txt diff one.txt two.txt #+end_src ACTUAL: #+RESULTS: : org_babel_sh_prompt> 1c1 : < one : --- : > two EXPECTED: #+RESULTS: : 1c1 : < one : --- : > two ADDENDUM ======== A friend of mine, who uses Org that comes with Emacs 28.1 on Linux, tried the PROBLEM 1 source block shown above, the one *without* a session, and he got no results either. (We might need better tests.) Rudy -- "One can begin to reason only when a clear picture has been formed in the imagination." -- Walter Warwick Sawyer, Mathematician's Delight, 1943 Rudolf Adamkovič <salutis@me.com> [he/him] Studenohorská 25 84103 Bratislava Slovakia ^ permalink raw reply [flat|nested] 37+ messages in thread
* Re: Org 9.6-pre and Bash sessions 2022-10-22 9:44 ` Rudolf Adamkovič @ 2022-10-22 10:59 ` Ihor Radchenko 2022-10-23 4:27 ` Ihor Radchenko 0 siblings, 1 reply; 37+ messages in thread From: Ihor Radchenko @ 2022-10-22 10:59 UTC (permalink / raw) To: Rudolf Adamkovič; +Cc: Ihor Radchenko, emacs-orgmode Rudolf Adamkovič <salutis@me.com> writes: > Ihor Radchenko <yantar92@posteo.net> writes: > >>> I did some testing and found no issues. > > Update: Today I needed to run some Bash, and it seems broken. > > PROBLEM 1: WITHOUT A SESSION > ============================ > > CONFIGURATION: > > Emacs 29, Org from Git (2f5e7103e59f06631e985d3dd39af21b5b7464ea) > > REPRODUCTION STEPS: > > Run the following code block: > > #+begin_src bash :results output > echo one > one.txt > echo two > two.txt > diff one.txt two.txt > #+end_src > > ACTUAL RESULTS: > > #+RESULTS: > > EXPECTED RESULTS: > > #+RESULTS: > : 1c1 > : < one > : --- > : > two This is actually expected. Without session, ob-shell discards results of src blocks that fail and display *Error* window (empty in this case). If you try #+begin_src bash :results output echo one > one.txt echo two > two.txt diff one.txt two.txt || true #+end_src things will work as expected. I guess we can display a bit more info in `org-babel-eval'. > PROBLEM 2: WITH A SESSION > ========================= > > CONFIGURATION: > > Emacs 29, Org from Git (2f5e7103e59f06631e985d3dd39af21b5b7464ea) > > REPRODUCTION STEPS: > > #+begin_src bash :session bash :results output > echo one > one.txt > echo two > two.txt > diff one.txt two.txt > #+end_src > > ACTUAL: > > #+RESULTS: > : org_babel_sh_prompt> 1c1 > : < one > : --- > : > two > > EXPECTED: > > #+RESULTS: > : 1c1 > : < one > : --- > : > two Confirmed. I know what is the problem. It is comint sometimes throwing output without newlines, which leads to comint-prompt-regexp not matching all the prompts after concatenating. Will take a look tomorrow. > ADDENDUM > ======== > > A friend of mine, who uses Org that comes with Emacs 28.1 on Linux, > tried the PROBLEM 1 source block shown above, the one *without* a > session, and he got no results either. > > (We might need better tests.) Better tests are always needed :) https://orgmode.org/list/874k81bsvz.fsf@localhost -- Ihor Radchenko // yantar92, Org mode contributor, Learn more about Org mode at <https://orgmode.org/>. Support Org development at <https://liberapay.com/org-mode>, or support my work at <https://liberapay.com/yantar92> ^ permalink raw reply [flat|nested] 37+ messages in thread
* Re: Org 9.6-pre and Bash sessions 2022-10-22 10:59 ` Ihor Radchenko @ 2022-10-23 4:27 ` Ihor Radchenko 2022-10-26 11:56 ` Rudolf Adamkovič 0 siblings, 1 reply; 37+ messages in thread From: Ihor Radchenko @ 2022-10-23 4:27 UTC (permalink / raw) To: Rudolf Adamkovič; +Cc: Ihor Radchenko, emacs-orgmode Ihor Radchenko <yantar92@posteo.net> writes: > This is actually expected. Without session, ob-shell discards results of > src blocks that fail and display *Error* window (empty in this case). > > If you try > > #+begin_src bash :results output > echo one > one.txt > echo two > two.txt > diff one.txt two.txt || true > #+end_src > > things will work as expected. > > I guess we can display a bit more info in `org-babel-eval'. I improved the error buffer a bit and also made babel return the available output with non-0 exit code. https://git.savannah.gnu.org/cgit/emacs/org-mode.git/commit/?id=ab7eff9d9c0968392bd9783d72c56a4023bd10be https://git.savannah.gnu.org/cgit/emacs/org-mode.git/commit/?id=f8a9cd23087799519bd709ea5c208ed29cb6587f >> #+begin_src bash :session bash :results output >> echo one > one.txt >> echo two > two.txt >> diff one.txt two.txt >> #+end_src >> >> ACTUAL: >> >> #+RESULTS: >> : org_babel_sh_prompt> 1c1 >> : < one >> : --- >> : > two >> >> EXPECTED: >> >> #+RESULTS: >> : 1c1 >> : < one >> : --- >> : > two > > Confirmed. > I know what is the problem. It is comint sometimes throwing output > without newlines, which leads to comint-prompt-regexp not matching all > the prompts after concatenating. Will take a look tomorrow. Fixed. https://git.savannah.gnu.org/cgit/emacs/org-mode.git/commit/?id=1ef420b19d2e310d9ef67e090ef84cdb6da4744d -- Ihor Radchenko // yantar92, Org mode contributor, Learn more about Org mode at <https://orgmode.org/>. Support Org development at <https://liberapay.com/org-mode>, or support my work at <https://liberapay.com/yantar92> ^ permalink raw reply [flat|nested] 37+ messages in thread
* Re: Org 9.6-pre and Bash sessions 2022-10-23 4:27 ` Ihor Radchenko @ 2022-10-26 11:56 ` Rudolf Adamkovič 2022-10-26 13:21 ` Rudolf Adamkovič 2022-10-27 3:53 ` Ihor Radchenko 0 siblings, 2 replies; 37+ messages in thread From: Rudolf Adamkovič @ 2022-10-26 11:56 UTC (permalink / raw) To: Ihor Radchenko; +Cc: Ihor Radchenko, emacs-orgmode [-- Attachment #1: Type: text/plain, Size: 949 bytes --] Ihor, Thank you for investigating, explaining, and also fixing the problem! I pulled the latest 'main' and everything works a bit, it seems. Then, to avoid walking in circles, I decided to write some tests, for I think shell blocks should never, never, never break in such basic ways, let alone in production Emacs. Please, see the WIP patch attached to this message. I noticed that the following tests do not pass: 1. ob-shell/error-output-after-success We seem to trash error output, such as warnings, on success. I think we should not do this. Now, on the execution of "echo X &>2", Org says "Code block produced no output." But that does hold true. The block did produce output, just on the other output stream, namely error output. 2. ob-shell/error-output-after-failure We seem not to show the exit code in this case. Why? 3. ob-shell/exit-codes Should we add a newline after the exit code message? Rudy [-- Warning: decoded text below may be mangled, UTF-8 assumed --] [-- Attachment #2: 0001-WIP-test-ob-shell-Add-tests-for-some-recent-changes.patch --] [-- Type: text/x-patch, Size: 3021 bytes --] From 90432170552a6e922d48d51138b2062aa11e5575 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rudolf=20Adamkovi=C4=8D?= <salutis@me.com> Date: Wed, 26 Oct 2022 13:35:26 +0200 Subject: [PATCH] WIP test-ob-shell: Add tests for some recent changes --- testing/lisp/test-ob-shell.el | 60 +++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/testing/lisp/test-ob-shell.el b/testing/lisp/test-ob-shell.el index 4c00faa49..8cd967343 100644 --- a/testing/lisp/test-ob-shell.el +++ b/testing/lisp/test-ob-shell.el @@ -170,6 +170,66 @@ ob-comint.el, which was not previously tested." "#+BEGIN_SRC sh :results table\necho 'I \"want\" it all'\n#+END_SRC" (org-babel-execute-src-block))))) +;;; Standard output + +(ert-deftest ob-shell/standard-output-after-failure () + "Test standard output after exiting with a non-zero code." + (should (= 1 + (org-babel-execute:sh + "echo 1; exit 2" nil)))) + +;;; Error output + +(ert-deftest ob-shell/error-output-after-success () + "Test that error output shows in the error buffer after exiting +with a zero code." + (should + (string= "1 +[ Babel evaluation exited with code 2 ]" + (progn (org-babel-eval-wipe-error-buffer) + (org-babel-execute:sh + "echo 1 >&2" nil) + (with-current-buffer org-babel-error-buffer-name + (buffer-string)))))) + +(ert-deftest ob-shell/error-output-after-failure () + "Test that error output shows in the error buffer, alongside the +exit code, after exiting with a non-zero code." + (should + (string= "1 +[ Babel evaluation exited with code 2 ]" + (progn (org-babel-eval-wipe-error-buffer) + (org-babel-execute:sh + "echo 1 >&2; exit 2" nil) + (with-current-buffer org-babel-error-buffer-name + (buffer-string)))))) + +;;; Exit codes + +(ert-deftest ob-shell/exit-code () + "Test that the exit code shows in the error buffer after exiting +with a non-zero return code." + (should + (string= "[ Babel evaluation exited with code 1 ]" + (progn (org-babel-eval-wipe-error-buffer) + (org-babel-execute:sh + "exit 1" nil) + (with-current-buffer org-babel-error-buffer-name + (buffer-string)))))) + +(ert-deftest ob-shell/exit-codes () + "Test that multiple exit codes show in the error buffer after +exiting with a non-zero return code more than once." + (should + (string= "[ Babel evaluation exited with code 1 ] +[ Babel evaluation exited with code 2 ]" + (progn (org-babel-eval-wipe-error-buffer) + (org-babel-execute:sh + "exit 1" nil) + (org-babel-execute:sh + "exit 2" nil) + (with-current-buffer org-babel-error-buffer-name + (buffer-string)))))) (provide 'test-ob-shell) -- 2.38.1 [-- Attachment #3: Type: text/plain, Size: 246 bytes --] -- "One can begin to reason only when a clear picture has been formed in the imagination." -- Walter Warwick Sawyer, Mathematician's Delight, 1943 Rudolf Adamkovič <salutis@me.com> [he/him] Studenohorská 25 84103 Bratislava Slovakia ^ permalink raw reply related [flat|nested] 37+ messages in thread
* Re: Org 9.6-pre and Bash sessions 2022-10-26 11:56 ` Rudolf Adamkovič @ 2022-10-26 13:21 ` Rudolf Adamkovič 2022-10-27 3:53 ` Ihor Radchenko 1 sibling, 0 replies; 37+ messages in thread From: Rudolf Adamkovič @ 2022-10-26 13:21 UTC (permalink / raw) To: Ihor Radchenko; +Cc: Ihor Radchenko, emacs-orgmode Rudolf Adamkovič <salutis@me.com> writes: > I pulled the latest 'main' and everything works a bit, it seems. I meant to say "a bit better" not "a bit". :) Rudy -- "It is no paradox to say that in our most theoretical moods we may be nearest to our most practical applications." -- Alfred North Whitehead, 1861-1947 Rudolf Adamkovič <salutis@me.com> [he/him] Studenohorská 25 84103 Bratislava Slovakia ^ permalink raw reply [flat|nested] 37+ messages in thread
* Re: Org 9.6-pre and Bash sessions 2022-10-26 11:56 ` Rudolf Adamkovič 2022-10-26 13:21 ` Rudolf Adamkovič @ 2022-10-27 3:53 ` Ihor Radchenko 2022-10-28 13:12 ` Rudolf Adamkovič 1 sibling, 1 reply; 37+ messages in thread From: Ihor Radchenko @ 2022-10-27 3:53 UTC (permalink / raw) To: Rudolf Adamkovič; +Cc: Ihor Radchenko, emacs-orgmode Rudolf Adamkovič <salutis@me.com> writes: > Thank you for investigating, explaining, and also fixing the problem! I > pulled the latest 'main' and everything works a bit, it seems. > > Then, to avoid walking in circles, I decided to write some tests, for I > think shell blocks should never, never, never break in such basic ways, > let alone in production Emacs. Thanks! I will not look much into details of the patch for now. Let's discuss the general expectations from shell blocks first. You seem to be missing several things described in the documentation. > I noticed that the following tests do not pass: > > 1. ob-shell/error-output-after-success > > We seem to trash error output, such as warnings, on success. I think > we should not do this. Now, on the execution of "echo X &>2", Org > says "Code block produced no output." But that does hold true. The > block did produce output, just on the other output stream, namely > error output. Trashing error output is expected by default. I suggest you to read through https://orgmode.org/worg/org-contrib/babel/languages/ob-doc-shell.html The default :results argument is output, which implies: output returns stdout, default As expected, stdout is empty in your example. ob-shell follows the spec here. Another question is if users may want to obtain strerr in some cases. A new feature like :results stderr might be implemented. Though users can already do the usual 2>&1 to merge stderr into stdout. > 2. ob-shell/error-output-after-failure > > We seem not to show the exit code in this case. Why? Exit code was not shown in the past until my commit https://git.savannah.gnu.org/cgit/emacs/org-mode.git/commit/?id=ab7eff9d9c0968392bd9783d72c56a4023bd10be I guess that showing the error code unconditionally (when exit code is non-0) could be an option. Now done in https://git.savannah.gnu.org/cgit/emacs/org-mode.git/commit/?id=d87a496b54b502d98e49f8bd6596e0562be9d105 > 3. ob-shell/exit-codes > > Should we add a newline after the exit code message? Done. -- Ihor Radchenko // yantar92, Org mode contributor, Learn more about Org mode at <https://orgmode.org/>. Support Org development at <https://liberapay.com/org-mode>, or support my work at <https://liberapay.com/yantar92> ^ permalink raw reply [flat|nested] 37+ messages in thread
* Re: Org 9.6-pre and Bash sessions 2022-10-27 3:53 ` Ihor Radchenko @ 2022-10-28 13:12 ` Rudolf Adamkovič 2022-10-28 13:29 ` Ihor Radchenko 0 siblings, 1 reply; 37+ messages in thread From: Rudolf Adamkovič @ 2022-10-28 13:12 UTC (permalink / raw) To: Ihor Radchenko; +Cc: Ihor Radchenko, emacs-orgmode Ihor Radchenko <yantar92@posteo.net> writes: >> 1. ob-shell/error-output-after-success >> >> We seem to trash error output, such as warnings, on success. I >> think we should not do this. Now, on the execution of "echo X >> &>2", Org says "Code block produced no output." But that does >> hold true. The block did produce output, just on the other output >> stream, namely error output. > Trashing error output is expected by default. [...] I suggest you to > read through [...] ob-shell follows the spec here. I get that ':results output' makes Org capture standard output, but not error output, for its #+RESULTS. However, if you look at the test in question, you will see that it expects error output in the *Org-Babel Error Output* buffer, not in the #+RESULTS. We should not trash error output; it belongs in the *Org-Babel Error Output* buffer. >> 2. ob-shell/error-output-after-failure > Now done in [...] Thanks! This works *correctly* now. >> 3. ob-shell/exit-codes >> >> Should we add a newline after the exit code message? > Done. I updated the tests and now every string needs a final newline, which does not seem correct. If we let the tests guide our design, all becomes clear. Buffers that use the 'compilation-mode' never append data on re-execution. Instead, they clear the buffer. Thus, we should 1. undo this change and instead 2. call 'org-babel-eval-wipe-error-buffer' before execution. Rudy -- "The whole science is nothing more than a refinement of everyday thinking." -- Albert Einstein, 1879-1955 Rudolf Adamkovič <salutis@me.com> [he/him] Studenohorská 25 84103 Bratislava Slovakia ^ permalink raw reply [flat|nested] 37+ messages in thread
* Re: Org 9.6-pre and Bash sessions 2022-10-28 13:12 ` Rudolf Adamkovič @ 2022-10-28 13:29 ` Ihor Radchenko 2022-10-28 21:52 ` Rudolf Adamkovič 0 siblings, 1 reply; 37+ messages in thread From: Ihor Radchenko @ 2022-10-28 13:29 UTC (permalink / raw) To: Rudolf Adamkovič; +Cc: Ihor Radchenko, emacs-orgmode Rudolf Adamkovič <salutis@me.com> writes: >>> 1. ob-shell/error-output-after-success >>> >>> We seem to trash error output, such as warnings, on success. I >>> think we should not do this. Now, on the execution of "echo X >>> &>2", Org says "Code block produced no output." But that does >>> hold true. The block did produce output, just on the other output >>> stream, namely error output. > >> Trashing error output is expected by default. [...] I suggest you to >> read through [...] ob-shell follows the spec here. > > I get that ':results output' makes Org capture standard output, but not > error output, for its #+RESULTS. However, if you look at the test in > question, you will see that it expects error output in the *Org-Babel > Error Output* buffer, not in the #+RESULTS. We should not trash error > output; it belongs in the *Org-Babel Error Output* buffer. I do not think that it make sense to display that buffer when the code finishes successfully. I can see this kind of behaviour breaking/spamming automated scripts or export---code working in the past may throw error output into unsuspecting users. >>> 3. ob-shell/exit-codes >>> >>> Should we add a newline after the exit code message? > >> Done. > > I updated the tests and now every string needs a final newline, which > does not seem correct. If we let the tests guide our design, all > becomes clear. Buffers that use the 'compilation-mode' never append > data on re-execution. Instead, they clear the buffer. > > Thus, we should > > 1. undo this change and instead > 2. call 'org-babel-eval-wipe-error-buffer' before execution. I do not think that it is a good idea. Code block execution may involve a whole chain of blocks when expanding references. If we wipe the error buffer and multiple blocks are failing, some errors may go unnoticed by the user. -- Ihor Radchenko // yantar92, Org mode contributor, Learn more about Org mode at <https://orgmode.org/>. Support Org development at <https://liberapay.com/org-mode>, or support my work at <https://liberapay.com/yantar92> ^ permalink raw reply [flat|nested] 37+ messages in thread
* Re: Org 9.6-pre and Bash sessions 2022-10-28 13:29 ` Ihor Radchenko @ 2022-10-28 21:52 ` Rudolf Adamkovič 2022-10-29 4:05 ` [FR] Display stderr contents after executing shell blocks (even when stdout :results output is requested) (was: Org 9.6-pre and Bash sessions) Ihor Radchenko 2022-10-29 4:05 ` Org 9.6-pre and Bash sessions Ihor Radchenko 0 siblings, 2 replies; 37+ messages in thread From: Rudolf Adamkovič @ 2022-10-28 21:52 UTC (permalink / raw) To: Ihor Radchenko; +Cc: Ihor Radchenko, emacs-orgmode Ihor Radchenko <yantar92@posteo.net> writes: > I do not think that it make sense to display that buffer when the code > finishes successfully. I can see this kind of behaviour > breaking/spamming automated scripts or export---code working in the > past may throw error output into unsuspecting users. But the exit code has nothing to do with the standard error. Unix programs can, and often do, halt with non-zero exit codes while producing error output containing important information, such as deprecation warnings. Further, many programs use error output as the alternative "anything but the result" stream. Preserving user data, instead of trashing it, data does not count as "spamming ... unsuspected users". On the contrary! For example, I use a program for work that uploads data to a certain 3rd-party server. It exits with a zero code but also shows extremely important notices on error output. As an "unsuspecting user", if I used Babel to run the program, I would end up in a trouble. So, we should never implicitly trash user-generated data, let alone based on a "completely made up" belief that a non-zero exit code somehow implies "no important error output". It does not. (I speak only about Unix-like systems here. Perhaps on other operating systems, things work differently.) > I do not think that it is a good idea. Code block execution may > involve a whole chain of blocks when expanding references. If we wipe > the error buffer and multiple blocks are failing, some errors may go > unnoticed by the user. In that case, can we prepend a newline instead of appending it? That way, the tests would look "more normal" and the buffer content would have the content one would expect, with no "hanging whitespace". Rudy -- "Genius is 1% inspiration and 99% perspiration." p-- Thomas Alva Edison, 1932 Rudolf Adamkovič <salutis@me.com> [he/him] Studenohorská 25 84103 Bratislava Slovakia ^ permalink raw reply [flat|nested] 37+ messages in thread
* [FR] Display stderr contents after executing shell blocks (even when stdout :results output is requested) (was: Org 9.6-pre and Bash sessions) 2022-10-28 21:52 ` Rudolf Adamkovič @ 2022-10-29 4:05 ` Ihor Radchenko 2022-10-29 6:14 ` tomas ` (2 more replies) 2022-10-29 4:05 ` Org 9.6-pre and Bash sessions Ihor Radchenko 1 sibling, 3 replies; 37+ messages in thread From: Ihor Radchenko @ 2022-10-29 4:05 UTC (permalink / raw) To: Rudolf Adamkovič; +Cc: Ihor Radchenko, emacs-orgmode Rudolf Adamkovič <salutis@me.com> writes: > Ihor Radchenko <yantar92@posteo.net> writes: > >> I do not think that it make sense to display that buffer when the code >> finishes successfully. I can see this kind of behaviour >> breaking/spamming automated scripts or export---code working in the >> past may throw error output into unsuspecting users. > > But the exit code has nothing to do with the standard error. > > Unix programs can, and often do, halt with non-zero exit codes while > producing error output containing important information, such as > deprecation warnings. Further, many programs use error output as the > alternative "anything but the result" stream. > > Preserving user data, instead of trashing it, data does not count as > "spamming ... unsuspected users". On the contrary! > > For example, I use a program for work that uploads data to a certain > 3rd-party server. It exits with a zero code but also shows extremely > important notices on error output. As an "unsuspecting user", if I used > Babel to run the program, I would end up in a trouble. > > So, we should never implicitly trash user-generated data, let alone > based on a "completely made up" belief that a non-zero exit code somehow > implies "no important error output". It does not. > > (I speak only about Unix-like systems here. Perhaps on other operating > systems, things work differently.) Dear All, As explained in the above quote, it may be reasonable to display stderr in the shell (and possibly other) src blocks upon execution. + Stderr may contain important information even if the code block succeeds - Displaying stderr will raise *Error* buffer, which may or may not be expected or desired. What do you think? -- Ihor Radchenko // yantar92, Org mode contributor, Learn more about Org mode at <https://orgmode.org/>. Support Org development at <https://liberapay.com/org-mode>, or support my work at <https://liberapay.com/yantar92> ^ permalink raw reply [flat|nested] 37+ messages in thread
* Re: [FR] Display stderr contents after executing shell blocks (even when stdout :results output is requested) (was: Org 9.6-pre and Bash sessions) 2022-10-29 4:05 ` [FR] Display stderr contents after executing shell blocks (even when stdout :results output is requested) (was: Org 9.6-pre and Bash sessions) Ihor Radchenko @ 2022-10-29 6:14 ` tomas 2022-10-29 6:43 ` Samuel Wales 2022-10-29 11:58 ` Max Nikulin 2022-10-30 20:28 ` Tim Cross 2 siblings, 1 reply; 37+ messages in thread From: tomas @ 2022-10-29 6:14 UTC (permalink / raw) To: emacs-orgmode [-- Attachment #1: Type: text/plain, Size: 2360 bytes --] On Sat, Oct 29, 2022 at 04:05:19AM +0000, Ihor Radchenko wrote: > Rudolf Adamkovič <salutis@me.com> writes: > > > Ihor Radchenko <yantar92@posteo.net> writes: > > > >> I do not think that it make sense to display that buffer when the code > >> finishes successfully. I can see this kind of behaviour > >> breaking/spamming automated scripts or export---code working in the > >> past may throw error output into unsuspecting users. > > > > But the exit code has nothing to do with the standard error. [...] > > For example, I use a program for work that uploads data to a certain > > 3rd-party server. It exits with a zero code but also shows extremely > > important notices on error output. As an "unsuspecting user", if I used > > Babel to run the program, I would end up in a trouble. [...] > Dear All, > > As explained in the above quote, it may be reasonable to display stderr > in the shell (and possibly other) src blocks upon execution. > > + Stderr may contain important information even if the code block > succeeds > - Displaying stderr will raise *Error* buffer, which may or may not be > expected or desired. > > What do you think? My take as an Org user is that this makes a lot of sense. I don't know whether there is an elegant way to accomodate all the use cases in an elegant way, but to provide a concrete example where I'd have found it handy... While preparing a handout for an introduction to shell programming (at a very basic level), I wanted to embed little examples with their results. Org rocks at this kind of task. But in this case it's important to show everything the students are going to see. One could argue that the error part is even the most important. So what I needed was not only the stderr (optionally somehow separated from stdout -- optionally as someone would see it in some terminal session), but also all the above even when the exit code was nonzero. Ideally, a display of that exit code, too. I ended up massaging prologue and epilogue, which worked nicely, but sadly is language dependent for a set of concepts which are, one could argue, independent of the language [1]. So yes, I would be thrilled by such a possibility. Cheers [1] These are OS conventions. So also a language of sorts, but at another level. -- tomás [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 195 bytes --] ^ permalink raw reply [flat|nested] 37+ messages in thread
* Re: [FR] Display stderr contents after executing shell blocks (even when stdout :results output is requested) (was: Org 9.6-pre and Bash sessions) 2022-10-29 6:14 ` tomas @ 2022-10-29 6:43 ` Samuel Wales 2022-10-29 9:00 ` tomas 0 siblings, 1 reply; 37+ messages in thread From: Samuel Wales @ 2022-10-29 6:43 UTC (permalink / raw) To: tomas; +Cc: emacs-orgmode long ago i made the contents of my shell blocks look like this: { code } 2>&1 : On 10/28/22, tomas@tuxteam.de <tomas@tuxteam.de> wrote: > On Sat, Oct 29, 2022 at 04:05:19AM +0000, Ihor Radchenko wrote: >> Rudolf Adamkovič <salutis@me.com> writes: >> >> > Ihor Radchenko <yantar92@posteo.net> writes: >> > >> >> I do not think that it make sense to display that buffer when the code >> >> finishes successfully. I can see this kind of behaviour >> >> breaking/spamming automated scripts or export---code working in the >> >> past may throw error output into unsuspecting users. >> > >> > But the exit code has nothing to do with the standard error. > > [...] > >> > For example, I use a program for work that uploads data to a certain >> > 3rd-party server. It exits with a zero code but also shows extremely >> > important notices on error output. As an "unsuspecting user", if I >> > used >> > Babel to run the program, I would end up in a trouble. > > [...] > >> Dear All, >> >> As explained in the above quote, it may be reasonable to display stderr >> in the shell (and possibly other) src blocks upon execution. >> >> + Stderr may contain important information even if the code block >> succeeds >> - Displaying stderr will raise *Error* buffer, which may or may not be >> expected or desired. >> >> What do you think? > > My take as an Org user is that this makes a lot of sense. I don't know > whether there is an elegant way to accomodate all the use cases in > an elegant way, but to provide a concrete example where I'd have found > it handy... > > While preparing a handout for an introduction to shell programming > (at a very basic level), I wanted to embed little examples with > their results. Org rocks at this kind of task. > > But in this case it's important to show everything the students are > going to see. One could argue that the error part is even the most > important. > > So what I needed was not only the stderr (optionally somehow separated > from stdout -- optionally as someone would see it in some terminal > session), but also all the above even when the exit code was nonzero. > > Ideally, a display of that exit code, too. > > I ended up massaging prologue and epilogue, which worked nicely, > but sadly is language dependent for a set of concepts which are, > one could argue, independent of the language [1]. > > So yes, I would be thrilled by such a possibility. > > Cheers > > [1] These are OS conventions. So also a language of sorts, but at > another level. > > -- > tomás > -- The Kafka Pandemic A blog about science, health, human rights, and misopathy: https://thekafkapandemic.blogspot.com ^ permalink raw reply [flat|nested] 37+ messages in thread
* Re: [FR] Display stderr contents after executing shell blocks (even when stdout :results output is requested) (was: Org 9.6-pre and Bash sessions) 2022-10-29 6:43 ` Samuel Wales @ 2022-10-29 9:00 ` tomas 2022-10-29 9:09 ` Ihor Radchenko 0 siblings, 1 reply; 37+ messages in thread From: tomas @ 2022-10-29 9:00 UTC (permalink / raw) To: Samuel Wales; +Cc: emacs-orgmode [-- Attachment #1: Type: text/plain, Size: 471 bytes --] On Fri, Oct 28, 2022 at 11:43:39PM -0700, Samuel Wales wrote: > long ago i made the contents of my shell blocks look like this: > > { > code > } 2>&1 > : As I hinted at, I also wanted to have the exit code documented. So my setup was a bit more involved than this. Plus, I didn't want all that code scaffolding to show up in the typeset results (my audience had enough to digest as it was), so I hid all that in the prologue/ epilogue. Cheers -- t [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 195 bytes --] ^ permalink raw reply [flat|nested] 37+ messages in thread
* Re: [FR] Display stderr contents after executing shell blocks (even when stdout :results output is requested) (was: Org 9.6-pre and Bash sessions) 2022-10-29 9:00 ` tomas @ 2022-10-29 9:09 ` Ihor Radchenko 2022-10-29 9:18 ` tomas 0 siblings, 1 reply; 37+ messages in thread From: Ihor Radchenko @ 2022-10-29 9:09 UTC (permalink / raw) To: tomas; +Cc: Samuel Wales, emacs-orgmode tomas@tuxteam.de writes: > As I hinted at, I also wanted to have the exit code documented. So > my setup was a bit more involved than this. Plus, I didn't want all > that code scaffolding to show up in the typeset results (my audience > had enough to digest as it was), so I hid all that in the prologue/ > epilogue. Note that what we are discussing here is different from your description. A popup window accumulating stderr is displayed upon code evaluation. stderr does not go into results. What you are describing would better fit into a new :results option. -- Ihor Radchenko // yantar92, Org mode contributor, Learn more about Org mode at <https://orgmode.org/>. Support Org development at <https://liberapay.com/org-mode>, or support my work at <https://liberapay.com/yantar92> ^ permalink raw reply [flat|nested] 37+ messages in thread
* Re: [FR] Display stderr contents after executing shell blocks (even when stdout :results output is requested) (was: Org 9.6-pre and Bash sessions) 2022-10-29 9:09 ` Ihor Radchenko @ 2022-10-29 9:18 ` tomas 2022-10-30 3:31 ` Ihor Radchenko 0 siblings, 1 reply; 37+ messages in thread From: tomas @ 2022-10-29 9:18 UTC (permalink / raw) To: Ihor Radchenko; +Cc: Samuel Wales, emacs-orgmode [-- Attachment #1: Type: text/plain, Size: 636 bytes --] On Sat, Oct 29, 2022 at 09:09:04AM +0000, Ihor Radchenko wrote: > tomas@tuxteam.de writes: > > > As I hinted at, I also wanted to have the exit code documented [...] > Note that what we are discussing here is different from your > description. A popup window accumulating stderr is displayed upon code > evaluation. stderr does not go into results. > > What you are describing would better fit into a new :results option. Oh, I missed the popup part. Sounds useful for yet another profile, yes. Thanks and sorry for the noise. And thanks for your incredible work on Org. Do you ever sleep? In awe -- tomás [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 195 bytes --] ^ permalink raw reply [flat|nested] 37+ messages in thread
* Re: [FR] Display stderr contents after executing shell blocks (even when stdout :results output is requested) (was: Org 9.6-pre and Bash sessions) 2022-10-29 9:18 ` tomas @ 2022-10-30 3:31 ` Ihor Radchenko 2022-10-30 6:11 ` tomas 0 siblings, 1 reply; 37+ messages in thread From: Ihor Radchenko @ 2022-10-30 3:31 UTC (permalink / raw) To: tomas; +Cc: Samuel Wales, emacs-orgmode tomas@tuxteam.de writes: >> What you are describing would better fit into a new :results option. > > Oh, I missed the popup part. Sounds useful for yet another profile, > yes. If you need it, feel free to open a separate feature request for extra :results options in ob-shell. Possibly providing more details how you envision this header argument to work. > And thanks for your incredible work on Org. Do you ever sleep? Remember that we may have radically different time zones. What appears to be nightly emails may not necessarily be sent at night. -- Ihor Radchenko // yantar92, Org mode contributor, Learn more about Org mode at <https://orgmode.org/>. Support Org development at <https://liberapay.com/org-mode>, or support my work at <https://liberapay.com/yantar92> ^ permalink raw reply [flat|nested] 37+ messages in thread
* Re: [FR] Display stderr contents after executing shell blocks (even when stdout :results output is requested) (was: Org 9.6-pre and Bash sessions) 2022-10-30 3:31 ` Ihor Radchenko @ 2022-10-30 6:11 ` tomas 2022-10-30 7:09 ` Ihor Radchenko 0 siblings, 1 reply; 37+ messages in thread From: tomas @ 2022-10-30 6:11 UTC (permalink / raw) To: Ihor Radchenko; +Cc: Samuel Wales, emacs-orgmode [-- Attachment #1: Type: text/plain, Size: 837 bytes --] On Sun, Oct 30, 2022 at 03:31:32AM +0000, Ihor Radchenko wrote: > tomas@tuxteam.de writes: > > >> What you are describing would better fit into a new :results option. > > > > Oh, I missed the popup part. Sounds useful for yet another profile, > > yes. > > If you need it, feel free to open a separate feature request for extra > :results options in ob-shell. Possibly providing more details how you > envision this header argument to work. I'll mull over it. Perhaps I come up with some (patch) proposal. > > And thanks for your incredible work on Org. Do you ever sleep? > > Remember that we may have radically different time zones. What appears > to be nightly emails may not necessarily be sent at night. I'm aware of that. My awe is more directed at your bandwidth than at your timings. Cheers -- t [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 195 bytes --] ^ permalink raw reply [flat|nested] 37+ messages in thread
* Re: [FR] Display stderr contents after executing shell blocks (even when stdout :results output is requested) (was: Org 9.6-pre and Bash sessions) 2022-10-30 6:11 ` tomas @ 2022-10-30 7:09 ` Ihor Radchenko 2022-10-30 8:18 ` tomas 0 siblings, 1 reply; 37+ messages in thread From: Ihor Radchenko @ 2022-10-30 7:09 UTC (permalink / raw) To: tomas; +Cc: Samuel Wales, emacs-orgmode tomas@tuxteam.de writes: >> If you need it, feel free to open a separate feature request for extra >> :results options in ob-shell. Possibly providing more details how you >> envision this header argument to work. > > I'll mull over it. Perhaps I come up with some (patch) proposal. Thinking more about it in the context of the current feature request, displaying the stderr buffer unconditionally may be undesired when the script already does 2>&1 or, potentially, uses imaginary :results stderr header argument. >> > And thanks for your incredible work on Org. Do you ever sleep? >> >> Remember that we may have radically different time zones. What appears >> to be nightly emails may not necessarily be sent at night. > > I'm aware of that. My awe is more directed at your bandwidth than at > your timings. I use Org mode and Org agenda to manage the maintenance 😀 -- Ihor Radchenko // yantar92, Org mode contributor, Learn more about Org mode at <https://orgmode.org/>. Support Org development at <https://liberapay.com/org-mode>, or support my work at <https://liberapay.com/yantar92> ^ permalink raw reply [flat|nested] 37+ messages in thread
* Re: [FR] Display stderr contents after executing shell blocks (even when stdout :results output is requested) (was: Org 9.6-pre and Bash sessions) 2022-10-30 7:09 ` Ihor Radchenko @ 2022-10-30 8:18 ` tomas 0 siblings, 0 replies; 37+ messages in thread From: tomas @ 2022-10-30 8:18 UTC (permalink / raw) To: Ihor Radchenko; +Cc: Samuel Wales, emacs-orgmode [-- Attachment #1: Type: text/plain, Size: 851 bytes --] On Sun, Oct 30, 2022 at 07:09:30AM +0000, Ihor Radchenko wrote: > tomas@tuxteam.de writes: > > >> If you need it, feel free to open a separate feature request for extra > >> :results options in ob-shell. Possibly providing more details how you > >> envision this header argument to work. > > > > I'll mull over it. Perhaps I come up with some (patch) proposal. > > Thinking more about it in the context of the current feature request, > displaying the stderr buffer unconditionally may be undesired when the > script already does 2>&1 or, potentially, uses imaginary :results stderr > header argument. Definitely. It's not for everyone. > >> > And thanks for your incredible work on Org. Do you ever sleep? [...] > I use Org mode and Org agenda to manage the maintenance 😀 Still genuinely impressed. Cheers -- t [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 195 bytes --] ^ permalink raw reply [flat|nested] 37+ messages in thread
* Re: [FR] Display stderr contents after executing shell blocks (even when stdout :results output is requested) (was: Org 9.6-pre and Bash sessions) 2022-10-29 4:05 ` [FR] Display stderr contents after executing shell blocks (even when stdout :results output is requested) (was: Org 9.6-pre and Bash sessions) Ihor Radchenko 2022-10-29 6:14 ` tomas @ 2022-10-29 11:58 ` Max Nikulin 2022-10-30 3:37 ` Ihor Radchenko 2022-10-30 20:28 ` Tim Cross 2 siblings, 1 reply; 37+ messages in thread From: Max Nikulin @ 2022-10-29 11:58 UTC (permalink / raw) To: emacs-orgmode On 29/10/2022 11:05, Ihor Radchenko wrote: > > As explained in the above quote, it may be reasonable to display stderr > in the shell (and possibly other) src blocks upon execution. > > + Stderr may contain important information even if the code block > succeeds > - Displaying stderr will raise *Error* buffer, which may or may not be > expected or desired. > > What do you think? I agree that stderr may be important. I would not mind to have a buffer that combines both stderr and stdout (maybe fontified). Despite order of messages in separate streams is not strictly defined, it still may shed some light on the reason what went wrong. ^ permalink raw reply [flat|nested] 37+ messages in thread
* Re: [FR] Display stderr contents after executing shell blocks (even when stdout :results output is requested) (was: Org 9.6-pre and Bash sessions) 2022-10-29 11:58 ` Max Nikulin @ 2022-10-30 3:37 ` Ihor Radchenko 0 siblings, 0 replies; 37+ messages in thread From: Ihor Radchenko @ 2022-10-30 3:37 UTC (permalink / raw) To: Max Nikulin; +Cc: emacs-orgmode Max Nikulin <manikulin@gmail.com> writes: > I agree that stderr may be important. I would not mind to have a buffer > that combines both stderr and stdout (maybe fontified). Despite order of > messages in separate streams is not strictly defined, it still may shed > some light on the reason what went wrong. I am not sure about the right approach of mixing streams. What we currently do is directing stderr to a separate file. See `org-babel--shell-command-on-region' and `org-babel-eval'. Also, note that our error display code is not only used by shell scripts. Also, by other interpreted languages like python. And we use compilation-mode, which provides reasonable fontification in many cases. -- Ihor Radchenko // yantar92, Org mode contributor, Learn more about Org mode at <https://orgmode.org/>. Support Org development at <https://liberapay.com/org-mode>, or support my work at <https://liberapay.com/yantar92> ^ permalink raw reply [flat|nested] 37+ messages in thread
* Re: [FR] Display stderr contents after executing shell blocks (even when stdout :results output is requested) (was: Org 9.6-pre and Bash sessions) 2022-10-29 4:05 ` [FR] Display stderr contents after executing shell blocks (even when stdout :results output is requested) (was: Org 9.6-pre and Bash sessions) Ihor Radchenko 2022-10-29 6:14 ` tomas 2022-10-29 11:58 ` Max Nikulin @ 2022-10-30 20:28 ` Tim Cross 2022-10-31 1:13 ` Org babel API (was: [FR] Display stderr contents after executing shell blocks (even when stdout :results output is requested) (was: Org 9.6-pre and Bash sessions)) Ihor Radchenko 2 siblings, 1 reply; 37+ messages in thread From: Tim Cross @ 2022-10-30 20:28 UTC (permalink / raw) To: emacs-orgmode Ihor Radchenko <yantar92@posteo.net> writes: > Rudolf Adamkovič <salutis@me.com> writes: > >> Ihor Radchenko <yantar92@posteo.net> writes: >> >>> I do not think that it make sense to display that buffer when the code >>> finishes successfully. I can see this kind of behaviour >>> breaking/spamming automated scripts or export---code working in the >>> past may throw error output into unsuspecting users. >> >> But the exit code has nothing to do with the standard error. >> >> Unix programs can, and often do, halt with non-zero exit codes while >> producing error output containing important information, such as >> deprecation warnings. Further, many programs use error output as the >> alternative "anything but the result" stream. >> >> Preserving user data, instead of trashing it, data does not count as >> "spamming ... unsuspected users". On the contrary! >> >> For example, I use a program for work that uploads data to a certain >> 3rd-party server. It exits with a zero code but also shows extremely >> important notices on error output. As an "unsuspecting user", if I used >> Babel to run the program, I would end up in a trouble. >> >> So, we should never implicitly trash user-generated data, let alone >> based on a "completely made up" belief that a non-zero exit code somehow >> implies "no important error output". It does not. >> >> (I speak only about Unix-like systems here. Perhaps on other operating >> systems, things work differently.) > > Dear All, > > As explained in the above quote, it may be reasonable to display stderr > in the shell (and possibly other) src blocks upon execution. > > + Stderr may contain important information even if the code block > succeeds > - Displaying stderr will raise *Error* buffer, which may or may not be > expected or desired. > > What do you think? I think this is perhaps the tip of a more complex iceberg. Not sure if we can address bits individually. Suspect we are better off clarifying the basic babel model and then look at specific language exceptions/limits and adjusting the model or documenting where back ends need to diverge from the basic model. Part of the challenge here is that the relevance/importance of stderr is somewhat dependent on the language. Same holds true for handling of error/return codes and to 'results' output. For me, this is another symptom of our need to define a clearer model for babel processes so that we can get some consistency across the board. Such a model would likely also make it easier for people to develop new babel back ends. We may even need 2 models, one for interactive/repl based back ends and one for non-interactive/scripted back ends. The 2 big questions I see are "What should be defaults be?" and "How do we handle the options without adding lots of new switches or suffering an option permutation blow out?". I do agree with the other posts regarding the importance of stderr. ^ permalink raw reply [flat|nested] 37+ messages in thread
* Org babel API (was: [FR] Display stderr contents after executing shell blocks (even when stdout :results output is requested) (was: Org 9.6-pre and Bash sessions)) 2022-10-30 20:28 ` Tim Cross @ 2022-10-31 1:13 ` Ihor Radchenko 2022-10-31 2:03 ` Tim Cross 0 siblings, 1 reply; 37+ messages in thread From: Ihor Radchenko @ 2022-10-31 1:13 UTC (permalink / raw) To: Tim Cross; +Cc: emacs-orgmode Tim Cross <theophilusx@gmail.com> writes: > For me, this is another symptom of our need to define a clearer model > for babel processes so that we can get some consistency across the > board. Such a model would likely also make it easier for people to > develop new babel back ends. We may even need 2 models, one for > interactive/repl based back ends and one for non-interactive/scripted > back ends. We do have two models already. We have some small bits documented in https://orgmode.org/worg/org-contrib/babel/languages/index.html Generally, the defaults are implemented in ob-core.el. Session API is in ob-comint.el. Shell command API is in ob-eval.el. > The 2 big questions I see are "What should be defaults be?" and "How do > we handle the options without adding lots of new switches or suffering > an option permutation blow out?". I am sorry, but I do not fully understand what you are talking about. Which defaults are you referring to? -- Ihor Radchenko // yantar92, Org mode contributor, Learn more about Org mode at <https://orgmode.org/>. Support Org development at <https://liberapay.com/org-mode>, or support my work at <https://liberapay.com/yantar92> ^ permalink raw reply [flat|nested] 37+ messages in thread
* Re: Org babel API (was: [FR] Display stderr contents after executing shell blocks (even when stdout :results output is requested) (was: Org 9.6-pre and Bash sessions)) 2022-10-31 1:13 ` Org babel API (was: [FR] Display stderr contents after executing shell blocks (even when stdout :results output is requested) (was: Org 9.6-pre and Bash sessions)) Ihor Radchenko @ 2022-10-31 2:03 ` Tim Cross 2022-10-31 3:12 ` Ihor Radchenko 0 siblings, 1 reply; 37+ messages in thread From: Tim Cross @ 2022-10-31 2:03 UTC (permalink / raw) To: Ihor Radchenko; +Cc: emacs-orgmode Ihor Radchenko <yantar92@posteo.net> writes: > Tim Cross <theophilusx@gmail.com> writes: > >> For me, this is another symptom of our need to define a clearer model >> for babel processes so that we can get some consistency across the >> board. Such a model would likely also make it easier for people to >> develop new babel back ends. We may even need 2 models, one for >> interactive/repl based back ends and one for non-interactive/scripted >> back ends. > > We do have two models already. > We have some small bits documented in > https://orgmode.org/worg/org-contrib/babel/languages/index.html > > Generally, the defaults are implemented in ob-core.el. > Session API is in ob-comint.el. Shell command API is in ob-eval.el. > >> The 2 big questions I see are "What should be defaults be?" and "How do >> we handle the options without adding lots of new switches or suffering >> an option permutation blow out?". > > I am sorry, but I do not fully understand what you are talking about. > Which defaults are you referring to? In general, all the defaults for babel blocks, but morfe specifically here, deffault handling for stderr. ^ permalink raw reply [flat|nested] 37+ messages in thread
* Re: Org babel API (was: [FR] Display stderr contents after executing shell blocks (even when stdout :results output is requested) (was: Org 9.6-pre and Bash sessions)) 2022-10-31 2:03 ` Tim Cross @ 2022-10-31 3:12 ` Ihor Radchenko 0 siblings, 0 replies; 37+ messages in thread From: Ihor Radchenko @ 2022-10-31 3:12 UTC (permalink / raw) To: Tim Cross; +Cc: emacs-orgmode Tim Cross <theophilusx@gmail.com> writes: >>> The 2 big questions I see are "What should be defaults be?" and "How do >>> we handle the options without adding lots of new switches or suffering >>> an option permutation blow out?". >> >> I am sorry, but I do not fully understand what you are talking about. >> Which defaults are you referring to? > > In general, all the defaults for babel blocks, but morfe specifically > here, deffault handling for stderr. stdout is the current default. And I'd say that it is expected default. Sorry, I still do not understand the concrete problem you are trying to highlight. -- Ihor Radchenko // yantar92, Org mode contributor, Learn more about Org mode at <https://orgmode.org/>. Support Org development at <https://liberapay.com/org-mode>, or support my work at <https://liberapay.com/yantar92> ^ permalink raw reply [flat|nested] 37+ messages in thread
* Re: Org 9.6-pre and Bash sessions 2022-10-28 21:52 ` Rudolf Adamkovič 2022-10-29 4:05 ` [FR] Display stderr contents after executing shell blocks (even when stdout :results output is requested) (was: Org 9.6-pre and Bash sessions) Ihor Radchenko @ 2022-10-29 4:05 ` Ihor Radchenko 2022-11-03 16:30 ` Rudolf Adamkovič 1 sibling, 1 reply; 37+ messages in thread From: Ihor Radchenko @ 2022-10-29 4:05 UTC (permalink / raw) To: Rudolf Adamkovič; +Cc: Ihor Radchenko, emacs-orgmode Rudolf Adamkovič <salutis@me.com> writes: >> I do not think that it is a good idea. Code block execution may >> involve a whole chain of blocks when expanding references. If we wipe >> the error buffer and multiple blocks are failing, some errors may go >> unnoticed by the user. > > In that case, can we prepend a newline instead of appending it? That > way, the tests would look "more normal" and the buffer content would > have the content one would expect, with no "hanging whitespace". Feel free to change it in the patch together with tests. -- Ihor Radchenko // yantar92, Org mode contributor, Learn more about Org mode at <https://orgmode.org/>. Support Org development at <https://liberapay.com/org-mode>, or support my work at <https://liberapay.com/yantar92> ^ permalink raw reply [flat|nested] 37+ messages in thread
* Re: Org 9.6-pre and Bash sessions 2022-10-29 4:05 ` Org 9.6-pre and Bash sessions Ihor Radchenko @ 2022-11-03 16:30 ` Rudolf Adamkovič 2022-11-04 2:52 ` Ihor Radchenko 0 siblings, 1 reply; 37+ messages in thread From: Rudolf Adamkovič @ 2022-11-03 16:30 UTC (permalink / raw) To: Ihor Radchenko; +Cc: Ihor Radchenko, emacs-orgmode [-- Attachment #1: Type: text/plain, Size: 294 bytes --] Ihor Radchenko <yantar92@posteo.net> writes: > Feel free to change it in the patch together with tests. Thank you for driving the discussion and for giving me the opportunity to solve the problem (and not just temporarily, but with tests). What do you think about the attached patch? Rudy [-- Warning: decoded text below may be mangled, UTF-8 assumed --] [-- Attachment #2: 0001-ob-shell-Never-throw-away-standard-error.patch --] [-- Type: text/x-patch, Size: 7362 bytes --] From 7001ed80e5fd146f6acf586b3cf3ef20bbba04e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rudolf=20Adamkovi=C4=8D?= <salutis@me.com> Date: Wed, 26 Oct 2022 13:35:26 +0200 Subject: [PATCH] ob-shell: Never throw away standard error * lisp/ob-eval.el (org-babel-eval-error-notify): Do not insert superfluous whitespace. * lisp/ob-eval.el (org-babel-eval): Show standard error even if the command exits with a zero code. * testing/lisp/test-ob-shell.el( ob-shell/standard-output-after-success, ob-shell/standard-output-after-failure, ob-shell/error-output-after-success, ob-shell/error-output-after-failure, ob-shell/error-output-after-failure-multiple, ob-shell/exit-code, ob-shell/exit-code-multiple ): Add tests to avoid regressions. --- lisp/ob-eval.el | 47 +++++++++++--------- testing/lisp/test-ob-shell.el | 82 +++++++++++++++++++++++++++++++++++ 2 files changed, 108 insertions(+), 21 deletions(-) diff --git a/lisp/ob-eval.el b/lisp/ob-eval.el index e1278bbad..af9283c0a 100644 --- a/lisp/ob-eval.el +++ b/lisp/ob-eval.el @@ -40,39 +40,44 @@ (with-current-buffer buf (goto-char (point-max)) (save-excursion - (insert stderr) (unless (bolp) (insert "\n")) - (insert (format "[ Babel evaluation exited with code %S ]\n" exit-code)))) + (insert stderr) + (insert (format "[ Babel evaluation exited with code %S ]" exit-code)))) (display-buffer buf)) (message "Babel evaluation exited with code %S" exit-code)) (defun org-babel-eval (command query) "Run COMMAND on QUERY. +Return standard output produced by COMMAND. If COMMAND exits +with a non-zero code or produces error output, show it with +`org-babel-eval-error-notify'. + Writes QUERY into a temp-buffer that is processed with -`org-babel--shell-command-on-region'. If COMMAND succeeds then return -its results, otherwise display STDERR with -`org-babel-eval-error-notify'." +`org-babel--shell-command-on-region'." (let ((error-buffer (get-buffer-create " *Org-Babel Error*")) exit-code) (with-current-buffer error-buffer (erase-buffer)) (with-temp-buffer (insert query) (setq exit-code - (org-babel--shell-command-on-region - command error-buffer)) - (if (or (not (numberp exit-code)) (> exit-code 0)) - (progn - (with-current-buffer error-buffer - (org-babel-eval-error-notify exit-code (buffer-string))) - (save-excursion - (when (get-buffer org-babel-error-buffer-name) - (with-current-buffer org-babel-error-buffer-name - (unless (derived-mode-p 'compilation-mode) - (compilation-mode)) - ;; Compilation-mode enforces read-only, but Babel expects the buffer modifiable. - (setq buffer-read-only nil)))) - ;; Return output, if any. - (buffer-string)) - (buffer-string))))) + (org-babel--shell-command-on-region + command error-buffer)) + (let ((stderr (with-current-buffer error-buffer (buffer-string)))) + (if (or (not (numberp exit-code)) + (> exit-code 0) + (not (string-empty-p stderr))) + (progn + (org-babel-eval-error-notify exit-code stderr) + (save-excursion + (when (get-buffer org-babel-error-buffer-name) + (with-current-buffer org-babel-error-buffer-name + (unless (derived-mode-p 'compilation-mode) + (compilation-mode)) + ;; Compilation-mode enforces read-only, but + ;; Babel expects the buffer modifiable. + (setq buffer-read-only nil)))) + ;; Return output, if any. + (buffer-string)) + (buffer-string)))))) (defun org-babel-eval-read-file (file) "Return the contents of FILE as a string." diff --git a/testing/lisp/test-ob-shell.el b/testing/lisp/test-ob-shell.el index 4c00faa49..7aa45cc8a 100644 --- a/testing/lisp/test-ob-shell.el +++ b/testing/lisp/test-ob-shell.el @@ -170,6 +170,88 @@ ob-comint.el, which was not previously tested." "#+BEGIN_SRC sh :results table\necho 'I \"want\" it all'\n#+END_SRC" (org-babel-execute-src-block))))) +;;; Standard output + +(ert-deftest ob-shell/standard-output-after-success () + "Test standard output after exiting with a zero code." + (should (= 1 + (org-babel-execute:sh + "echo 1" nil)))) + +(ert-deftest ob-shell/standard-output-after-failure () + "Test standard output after exiting with a non-zero code." + (should (= 1 + (org-babel-execute:sh + "echo 1; exit 2" nil)))) + +;;; Standard error + +(ert-deftest ob-shell/error-output-after-success () + "Test that standard error shows in the error buffer, alongside the +exit code, after exiting with a zero code." + (should + (string= "1 +[ Babel evaluation exited with code 0 ]" + (progn (org-babel-eval-wipe-error-buffer) + (org-babel-execute:sh + "echo 1 >&2" nil) + (with-current-buffer org-babel-error-buffer-name + (buffer-string)))))) + +(ert-deftest ob-shell/error-output-after-failure () + "Test that standard error shows in the error buffer, alongside the +exit code, after exiting with a non-zero code." + (should + (string= "1 +[ Babel evaluation exited with code 2 ]" + (progn (org-babel-eval-wipe-error-buffer) + (org-babel-execute:sh + "echo 1 >&2; exit 2" nil) + (with-current-buffer org-babel-error-buffer-name + (buffer-string)))))) + +(ert-deftest ob-shell/error-output-after-failure-multiple () + "Test that multiple standard error strings show in the error +buffer, alongside multiple exit codes." + (should + (string= "1 +[ Babel evaluation exited with code 2 ] +3 +[ Babel evaluation exited with code 4 ]" + (progn (org-babel-eval-wipe-error-buffer) + (org-babel-execute:sh + "echo 1 >&2; exit 2" nil) + (org-babel-execute:sh + "echo 3 >&2; exit 4" nil) + (with-current-buffer org-babel-error-buffer-name + (buffer-string)))))) + +;;; Exit codes + +(ert-deftest ob-shell/exit-code () + "Test that the exit code shows in the error buffer after exiting +with a non-zero return code." + (should + (string= "[ Babel evaluation exited with code 1 ]" + (progn (org-babel-eval-wipe-error-buffer) + (org-babel-execute:sh + "exit 1" nil) + (with-current-buffer org-babel-error-buffer-name + (buffer-string)))))) + +(ert-deftest ob-shell/exit-code-multiple () + "Test that multiple exit codes show in the error buffer after +exiting with a non-zero return code multiple times." + (should + (string= "[ Babel evaluation exited with code 1 ] +[ Babel evaluation exited with code 2 ]" + (progn (org-babel-eval-wipe-error-buffer) + (org-babel-execute:sh + "exit 1" nil) + (org-babel-execute:sh + "exit 2" nil) + (with-current-buffer org-babel-error-buffer-name + (buffer-string)))))) (provide 'test-ob-shell) -- 2.38.1 [-- Attachment #3: Type: text/plain, Size: 246 bytes --] -- "One can begin to reason only when a clear picture has been formed in the imagination." -- Walter Warwick Sawyer, Mathematician's Delight, 1943 Rudolf Adamkovič <salutis@me.com> [he/him] Studenohorská 25 84103 Bratislava Slovakia ^ permalink raw reply related [flat|nested] 37+ messages in thread
* Re: Org 9.6-pre and Bash sessions 2022-11-03 16:30 ` Rudolf Adamkovič @ 2022-11-04 2:52 ` Ihor Radchenko 2022-11-05 1:12 ` Rudolf Adamkovič 0 siblings, 1 reply; 37+ messages in thread From: Ihor Radchenko @ 2022-11-04 2:52 UTC (permalink / raw) To: Rudolf Adamkovič; +Cc: Ihor Radchenko, emacs-orgmode Rudolf Adamkovič <salutis@me.com> writes: > Ihor Radchenko <yantar92@posteo.net> writes: > >> Feel free to change it in the patch together with tests. > > Thank you for driving the discussion and for giving me the opportunity > to solve the problem (and not just temporarily, but with tests). What > do you think about the attached patch? Applied onto main changing the commit summary to "org-babel: ...". This change will affect all the babel backends that use `org-babel-eval'. https://git.savannah.gnu.org/cgit/emacs/org-mode.git/commit/?id=f7b16402e6a694d592210f766544f6114056b4b0 A small note: If stderr does not contain a trailing newline, it will be displayed as Stderr output with no trailing newline[ Babel evaluation exited with code 1 ] One may argue that it is ugly. On the other hand, adding an extra newline will make stderr with and without the newline indistinguishable. -- Ihor Radchenko // yantar92, Org mode contributor, Learn more about Org mode at <https://orgmode.org/>. Support Org development at <https://liberapay.com/org-mode>, or support my work at <https://liberapay.com/yantar92> ^ permalink raw reply [flat|nested] 37+ messages in thread
* Re: Org 9.6-pre and Bash sessions 2022-11-04 2:52 ` Ihor Radchenko @ 2022-11-05 1:12 ` Rudolf Adamkovič 0 siblings, 0 replies; 37+ messages in thread From: Rudolf Adamkovič @ 2022-11-05 1:12 UTC (permalink / raw) To: Ihor Radchenko; +Cc: Ihor Radchenko, emacs-orgmode Ihor Radchenko <yantar92@posteo.net> writes: > Applied onto main changing the commit summary to "org-babel: ...". > This change will affect all the babel backends that use > `org-babel-eval'. That makes sense. Thank you for the correction! > A small note: If stderr does not contain a trailing newline, it will > be displayed as > > Stderr output with no trailing newline[ Babel evaluation exited with > code 1 ] > > One may argue that it is ugly. On the other hand, adding an extra > newline will make stderr with and without the newline > indistinguishable. Ugly but correct. Besides, virtually every shell does the same, so every "civilized" program ends its output with a newline. Also, it makes me happy that we have this important behavior fixed in tests! Thank you for all your help! Rudy -- "Genius is 1% inspiration and 99% perspiration." -- Thomas Alva Edison, 1932 Rudolf Adamkovič <salutis@me.com> [he/him] Studenohorská 25 84103 Bratislava Slovakia ^ permalink raw reply [flat|nested] 37+ messages in thread
end of thread, other threads:[~2022-11-05 1:13 UTC | newest] Thread overview: 37+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2022-10-13 15:14 Org 9.6-pre and Bash sessions Rudolf Adamkovič 2022-10-13 17:07 ` Michael Welle 2022-10-14 3:44 ` Ihor Radchenko 2022-10-15 20:56 ` Rudolf Adamkovič 2022-10-17 8:34 ` Ihor Radchenko 2022-10-21 5:29 ` Ihor Radchenko 2022-10-21 13:38 ` Rudolf Adamkovič 2022-10-22 4:22 ` Ihor Radchenko 2022-10-22 9:44 ` Rudolf Adamkovič 2022-10-22 10:59 ` Ihor Radchenko 2022-10-23 4:27 ` Ihor Radchenko 2022-10-26 11:56 ` Rudolf Adamkovič 2022-10-26 13:21 ` Rudolf Adamkovič 2022-10-27 3:53 ` Ihor Radchenko 2022-10-28 13:12 ` Rudolf Adamkovič 2022-10-28 13:29 ` Ihor Radchenko 2022-10-28 21:52 ` Rudolf Adamkovič 2022-10-29 4:05 ` [FR] Display stderr contents after executing shell blocks (even when stdout :results output is requested) (was: Org 9.6-pre and Bash sessions) Ihor Radchenko 2022-10-29 6:14 ` tomas 2022-10-29 6:43 ` Samuel Wales 2022-10-29 9:00 ` tomas 2022-10-29 9:09 ` Ihor Radchenko 2022-10-29 9:18 ` tomas 2022-10-30 3:31 ` Ihor Radchenko 2022-10-30 6:11 ` tomas 2022-10-30 7:09 ` Ihor Radchenko 2022-10-30 8:18 ` tomas 2022-10-29 11:58 ` Max Nikulin 2022-10-30 3:37 ` Ihor Radchenko 2022-10-30 20:28 ` Tim Cross 2022-10-31 1:13 ` Org babel API (was: [FR] Display stderr contents after executing shell blocks (even when stdout :results output is requested) (was: Org 9.6-pre and Bash sessions)) Ihor Radchenko 2022-10-31 2:03 ` Tim Cross 2022-10-31 3:12 ` Ihor Radchenko 2022-10-29 4:05 ` Org 9.6-pre and Bash sessions Ihor Radchenko 2022-11-03 16:30 ` Rudolf Adamkovič 2022-11-04 2:52 ` Ihor Radchenko 2022-11-05 1:12 ` Rudolf Adamkovič
Code repositories for project(s) associated with this public inbox https://git.savannah.gnu.org/cgit/emacs/org-mode.git This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).