From: Jim Porter Date: Mon, 3 Apr 2023 04:54:32 +0000 (-0700) Subject: ; Make Eshell synchronous pipeline code more similar to asynchronous X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=dd2438eeaa6a2420383a5e783c7a2d178c64c590;p=emacs.git ; Make Eshell synchronous pipeline code more similar to asynchronous * lisp/eshell/esh-cmd.el (eshell-do-pipelines-synchronously): Use 'eshell-with-copied-handles'. (eshell-execute-pipeline): Remove now-unnecessary let-bindings. --- diff --git a/lisp/eshell/esh-cmd.el b/lisp/eshell/esh-cmd.el index f6846345d7d..45176b332d8 100644 --- a/lisp/eshell/esh-cmd.el +++ b/lisp/eshell/esh-cmd.el @@ -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))))))