1
0
mirror of https://git.savannah.gnu.org/git/emacs.git synced 2024-12-11 09:20:51 +00:00

; 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.
This commit is contained in:
Jim Porter 2023-04-02 21:54:32 -07:00
parent 6419f318e4
commit dd2438eeaa

View 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))))))