(not (process-live-p proc))))
(finish-io
(lambda ()
- (if (or (process-get proc :eshell-busy)
- (and wait-for-stderr (car stderr-live)))
- (progn
- (eshell-debug-command 'process
- "i/o busy for process `%s'" proc)
- (run-at-time 0 nil finish-io))
- (when data
- (ignore-error eshell-pipe-broken
- (eshell-output-object
- data index handles)))
- (eshell-close-handles
- status
- (when status (list 'quote (= status 0)))
- handles)
- ;; Clear the handles to mark that we're 100%
- ;; finished with the I/O for this process.
- (process-put proc :eshell-handles nil)
- (eshell-debug-command 'process
- "finished external process `%s'" proc)
- (if primary
- (run-hook-with-args 'eshell-kill-hook proc string)
- (setcar stderr-live nil))))))
+ (with-current-buffer (process-buffer proc)
+ (if (or (process-get proc :eshell-busy)
+ (and wait-for-stderr (car stderr-live)))
+ (progn
+ (eshell-debug-command 'process
+ "i/o busy for process `%s'" proc)
+ (run-at-time 0 nil finish-io))
+ (when data
+ (ignore-error eshell-pipe-broken
+ (eshell-output-object
+ data index handles)))
+ (eshell-close-handles
+ status
+ (when status (list 'quote (= status 0)))
+ handles)
+ ;; Clear the handles to mark that we're 100%
+ ;; finished with the I/O for this process.
+ (process-put proc :eshell-handles nil)
+ (eshell-debug-command 'process
+ "finished external process `%s'" proc)
+ (if primary
+ (run-hook-with-args 'eshell-kill-hook
+ proc string)
+ (setcar stderr-live nil)))))))
(funcall finish-io)))
(when-let ((entry (assq proc eshell-process-list)))
(eshell-remove-process-entry entry))))))
"'")
"A shell command that prints the standard streams connected as TTYs.")
+(defvar eshell-test-value nil)
+
;;; Tests:
\f
(should (= eshell-last-command-status 1))
(should (eq eshell-last-command-result nil)))))
+(ert-deftest esh-proc-test/sentinel/change-buffer ()
+ "Check that changing the current buffer while running a command works.
+See bug#71778."
+ (eshell-with-temp-buffer bufname ""
+ (with-temp-eshell
+ (let (eshell-test-value)
+ (eshell-insert-command
+ (concat (format "for i in 1 2 {sleep 1; echo hello} > #<%s>; " bufname)
+ "setq eshell-test-value t"))
+ (with-current-buffer bufname
+ (eshell-wait-for (lambda () eshell-test-value))
+ (should (equal (buffer-string) "hellohello")))
+ (eshell-match-command-output "echo goodbye" "\\`goodbye\n")))))
+
\f
;; Pipelines