]> git.eshelyaron.com Git - emacs.git/commitdiff
; Make Eshell synchronous pipeline code more similar to asynchronous
authorJim Porter <jporterbugs@gmail.com>
Mon, 3 Apr 2023 04:54:32 +0000 (21:54 -0700)
committerJim Porter <jporterbugs@gmail.com>
Sun, 10 Sep 2023 17:38:25 +0000 (10:38 -0700)
* lisp/eshell/esh-cmd.el (eshell-do-pipelines-synchronously): Use
'eshell-with-copied-handles'.
(eshell-execute-pipeline): Remove now-unnecessary let-bindings.

lisp/eshell/esh-cmd.el

index f6846345d7da057c799e346600194efdf5b0f06c..45176b332d8e2350b92d6dea27bb6dca56534a03 100644 (file)
@@ -838,39 +838,37 @@ This is used on systems where async subprocesses are not supported."
     ;; FIXME: is deferrable significant here?
     (eshell--unmark-deferrable (car pipeline))
     `(progn
+       (eshell-with-copied-handles
+        (progn
+          ,(when (cdr pipeline)
+             `(let ((output-marker ,(point-marker)))
+                (eshell-set-output-handle ,eshell-output-handle
+                                          'append output-marker)))
+          (let (;; XXX: `eshell-in-pipeline-p' has a different meaning
+                ;; for synchronous processes: it's non-nil only when
+                ;; piping *to* a process.
+                (eshell-in-pipeline-p ,(and (cdr pipeline) t)))
+            (let ((result ,(car pipeline)))
+              ;; `tailproc' gets the result of the last successful
+              ;; process in the pipeline.
+              (set tailproc (or result (symbol-value tailproc))))))
+        ;; Steal handles if this is the last item in the pipeline.
+        ,(null (cdr pipeline)))
        ,(when (cdr pipeline)
-          `(let ((output-marker ,(point-marker)))
-             (eshell-set-output-handle ,eshell-output-handle
-                                       'append output-marker)))
-       ;; The last process in the pipe should get its handles
-       ;; redirected as we found them before running the pipe.
-       ,(if (null (cdr pipeline))
-            '(progn
-               (setq eshell-current-handles tail-handles)
-               (setq eshell-in-pipeline-p nil)))
-       (let ((result ,(car pipeline)))
-         ;; tailproc gets the result of the last successful process in
-         ;; the pipeline.
-         (set tailproc (or result (symbol-value tailproc)))
-         ,(if (cdr pipeline)
-              `(eshell-do-pipelines-synchronously (quote ,(cdr pipeline))))
-         result))))
+          `(eshell-do-pipelines-synchronously (quote ,(cdr pipeline)))))))
 
 (defalias 'eshell-process-identity 'identity)
 
 (defmacro eshell-execute-pipeline (pipeline)
   "Execute the commands in PIPELINE, connecting each to one another."
-  `(let ((eshell-in-pipeline-p t)
-         (headproc (make-symbol "headproc"))
+  `(let ((headproc (make-symbol "headproc"))
          (tailproc (make-symbol "tailproc")))
      (set headproc nil)
      (set tailproc nil)
      (progn
        ,(if eshell-supports-asynchronous-processes
            `(eshell-do-pipelines ,pipeline)
-          `(let ((tail-handles (eshell-duplicate-handles
-                                eshell-current-handles)))
-            (eshell-do-pipelines-synchronously ,pipeline)))
+         `(eshell-do-pipelines-synchronously ,pipeline))
        (eshell-process-identity (cons (symbol-value headproc)
                                       (symbol-value tailproc))))))