From a0e2d16c3ad86646c0aacd5e07ad59709eb1d5b8 Mon Sep 17 00:00:00 2001 From: Jim Porter Date: Wed, 28 Aug 2024 18:53:03 -0700 Subject: [PATCH 1/2] Fix redirecting Eshell output to symbols in some places Do not merge to master. * lisp/eshell/esh-io.el (eshell-output-object-to-target): Don't require TARGET to be bound. * lisp/eshell/em-script.el (eshell-execute-file): Quote the output/error targets. * test/lisp/eshell/em-script-tests.el (eshell-execute-file-output): New variable. (em-script-test/execute-file/output-file) (em-script-test/execute-file/output-symbol): New tests. * test/lisp/eshell/esh-io-tests.el (eshell-test-file-string): Move to... * test/lisp/eshell/eshell-tests-helpers.el (eshell-test-file-string): ... here. --- lisp/eshell/em-script.el | 2 +- lisp/eshell/esh-io.el | 2 +- test/lisp/eshell/em-script-tests.el | 18 ++++++++++++++++++ test/lisp/eshell/esh-io-tests.el | 6 ------ test/lisp/eshell/eshell-tests-helpers.el | 6 ++++++ 5 files changed, 26 insertions(+), 8 deletions(-) diff --git a/lisp/eshell/em-script.el b/lisp/eshell/em-script.el index ba020d2eb5b..ebba0440d68 100644 --- a/lisp/eshell/em-script.el +++ b/lisp/eshell/em-script.el @@ -119,7 +119,7 @@ eshell-execute-file (eshell-mode) (eshell-do-eval `(let ((eshell-current-handles - (eshell-create-handles ,stdout 'insert)) + (eshell-create-handles ',stdout 'insert)) (eshell-current-subjob-p)) ,(eshell--source-file file args)) t)))) diff --git a/lisp/eshell/esh-io.el b/lisp/eshell/esh-io.el index 9de9cc4509a..570ace2ebb8 100644 --- a/lisp/eshell/esh-io.el +++ b/lisp/eshell/esh-io.el @@ -713,7 +713,7 @@ eshell-output-object-to-target (cl-defmethod eshell-output-object-to-target (object (target symbol)) "Output OBJECT to the value of the symbol TARGET." - (if (not (symbol-value target)) + (if (not (and (boundp target) (symbol-value target))) (set target object) (setq object (eshell-stringify object)) (if (not (stringp (symbol-value target))) diff --git a/test/lisp/eshell/em-script-tests.el b/test/lisp/eshell/em-script-tests.el index 86a78e43026..5e5eb80f215 100644 --- a/test/lisp/eshell/em-script-tests.el +++ b/test/lisp/eshell/em-script-tests.el @@ -33,6 +33,9 @@ (expand-file-name "eshell-tests-helpers" (file-name-directory (or load-file-name default-directory)))) + +(defvar eshell-execute-file-output) + ;;; Tests: (ert-deftest em-script-test/source-script () @@ -113,6 +116,21 @@ em-script-test/execute-file/args (eshell-execute-file temp-file '(1 2 3) t)) (should (equal (buffer-string) "6"))))) +(ert-deftest em-script-test/execute-file/output-file () + "Test `eshell-execute-file' redirecting to a file." + (ert-with-temp-file temp-file :text "echo more" + (ert-with-temp-file output-file :text "initial" + (with-temp-eshell-settings + (eshell-execute-file temp-file nil output-file)) + (should (equal (eshell-test-file-string output-file) "moreinitial"))))) + +(ert-deftest em-script-test/execute-file/output-symbol () + "Test `eshell-execute-file' redirecting to a symbol." + (ert-with-temp-file temp-file :text "echo hi\necho bye" + (with-temp-eshell-settings + (eshell-execute-file temp-file nil 'eshell-execute-file-output)) + (should (equal eshell-execute-file-output "hibye")))) + (ert-deftest em-script-test/batch-file () "Test running an Eshell script file as a batch script." (ert-with-temp-file temp-file diff --git a/test/lisp/eshell/esh-io-tests.el b/test/lisp/eshell/esh-io-tests.el index b4e8c0b4a9a..6add14c05fa 100644 --- a/test/lisp/eshell/esh-io-tests.el +++ b/test/lisp/eshell/esh-io-tests.el @@ -34,12 +34,6 @@ eshell-test-value (defvar eshell-test-value-with-fun nil) (defun eshell-test-value-with-fun ()) -(defun eshell-test-file-string (file) - "Return the contents of FILE as a string." - (with-temp-buffer - (insert-file-contents file) - (buffer-string))) - (defun eshell/test-output () "Write some test output separately to stdout and stderr." (eshell-printn "stdout") diff --git a/test/lisp/eshell/eshell-tests-helpers.el b/test/lisp/eshell/eshell-tests-helpers.el index bfd829c95e9..def04be0577 100644 --- a/test/lisp/eshell/eshell-tests-helpers.el +++ b/test/lisp/eshell/eshell-tests-helpers.el @@ -139,6 +139,12 @@ eshell-last-output (buffer-substring-no-properties (eshell-beginning-of-output) (eshell-end-of-output))) +(defun eshell-test-file-string (file) + "Return the contents of FILE as a string." + (with-temp-buffer + (insert-file-contents file) + (buffer-string))) + (defun eshell-match-output (regexp) "Test whether the output of the last command matches REGEXP." (string-match-p regexp (eshell-last-output))) -- 2.25.1