Function: eshell-parse-pipeline

eshell-parse-pipeline is a byte-compiled function defined in esh-cmd.el.gz.

Signature

(eshell-parse-pipeline TERMS)

Documentation

Parse a pipeline from TERMS, return the appropriate Lisp forms.

Source Code

;; Defined in /usr/src/emacs/lisp/eshell/esh-cmd.el.gz
(defun eshell-parse-pipeline (terms)
  "Parse a pipeline from TERMS, return the appropriate Lisp forms."
  (pcase-let*
      ((`(,bigpieces . ,sep-terms)
        (eshell-split-commands terms "\\(&&\\|||\\)" nil t))
       (results) (final))
    (dolist (subterms bigpieces)
      (let* ((pieces (eshell-split-commands subterms "|"))
             (p pieces))
        (while p
          (let ((cmd (car p)))
            (run-hook-with-args 'eshell-pre-rewrite-command-hook cmd)
            (setq cmd (run-hook-with-args-until-success
                       'eshell-rewrite-command-hook cmd))
            (let ((eshell--cmd cmd))
              (run-hook-with-args 'eshell-post-rewrite-command-hook
                                  'eshell--cmd)
              (setq cmd eshell--cmd))
            (setcar p (funcall eshell-post-rewrite-command-function cmd)))
          (setq p (cdr p)))
        (push (if (<= (length pieces) 1)
                  (car pieces)
                (cl-assert (not eshell-in-pipeline-p))
                `(eshell-execute-pipeline (quote ,pieces)))
              results)))
    ;; `results' might be empty; this happens in the case of
    ;; multi-line input
    (setq final (car results)
          results (cdr results)
          sep-terms (nreverse sep-terms))
    (while results
      (cl-assert (car sep-terms))
      (setq final `(,(if (string= (pop sep-terms) "&&") 'and 'or)
                    (eshell-command-success
                     (eshell-deferrable ,(pop results)))
                    ,final)))
    final))