emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

master 2e60ef696a 1/3: Ensure that tailproc is set for the last process


From: Lars Ingebrigtsen
Subject: master 2e60ef696a 1/3: Ensure that tailproc is set for the last process in an Eshell pipeline
Date: Thu, 3 Feb 2022 14:03:51 -0500 (EST)

branch: master
commit 2e60ef696a3cf16b0eb297948e27ba0cb32a125e
Author: Jim Porter <jporterbugs@gmail.com>
Commit: Lars Ingebrigtsen <larsi@gnus.org>

    Ensure that tailproc is set for the last process in an Eshell pipeline
    
    In particular, this used to fail for pipelines where the last process
    in the pipeline came from the first element of the pipeline. This
    could happen when a process was piped to an ordinary Lisp function,
    like in '*echo hi | echo bye'.
    
    * lisp/eshell/esh-cmd.el (eshell-do-pipelines): Set the tailproc even
    for the first process in the pipeline.
    
    * test/lisp/eshell/eshell-tests.el (eshell-test/pipe-tailproc): New
    test.
---
 lisp/eshell/esh-cmd.el           | 7 ++++---
 test/lisp/eshell/eshell-tests.el | 7 +++++++
 2 files changed, 11 insertions(+), 3 deletions(-)

diff --git a/lisp/eshell/esh-cmd.el b/lisp/eshell/esh-cmd.el
index 04d65df4f3..14139896dd 100644
--- a/lisp/eshell/esh-cmd.el
+++ b/lisp/eshell/esh-cmd.el
@@ -764,8 +764,7 @@ This macro calls itself recursively, with NOTFIRST non-nil."
               (eshell-set-output-handle ,eshell-output-handle
                                         'append nextproc)
               (eshell-set-output-handle ,eshell-error-handle
-                                        'append nextproc)
-              (setq tailproc (or tailproc nextproc))))
+                                        'append nextproc)))
        ,(let ((head (car pipeline)))
           (if (memq (car head) '(let progn))
               (setq head (car (last head))))
@@ -781,7 +780,9 @@ This macro calls itself recursively, with NOTFIRST non-nil."
               ,(cond ((not notfirst) (quote 'first))
                      ((cdr pipeline) t)
                      (t (quote 'last)))))
-         ,(car pipeline))))))
+          (let ((proc ,(car pipeline)))
+            (setq tailproc (or tailproc proc))
+            proc))))))
 
 (defmacro eshell-do-pipelines-synchronously (pipeline)
   "Execute the commands in PIPELINE in sequence synchronously.
diff --git a/test/lisp/eshell/eshell-tests.el b/test/lisp/eshell/eshell-tests.el
index 542815df80..7658d5f551 100644
--- a/test/lisp/eshell/eshell-tests.el
+++ b/test/lisp/eshell/eshell-tests.el
@@ -129,6 +129,13 @@ e.g. \"{(+ 1 2)} 3\" => 3"
    (eshell-command-result-p "echo ${echo hi}-${*echo there}"
                             "hi-there\n")))
 
+(ert-deftest eshell-test/pipe-tailproc ()
+  "Check that piping a process to a non-process command waits for the process"
+  (skip-unless (executable-find "echo"))
+  (with-temp-eshell
+   (eshell-command-result-p "*echo hi | echo bye"
+                            "bye\nhi\n")))
+
 (ert-deftest eshell-test/window-height ()
   "$LINES should equal (window-height)"
   (should (eshell-test-command-result "= $LINES (window-height)")))



reply via email to

[Prev in Thread] Current Thread [Next in Thread]