def _update_last_spec(last): captured = last.captured last.last_in_pipeline = True if not captured: return callable_alias = callable(last.alias) if callable_alias: pass else: thable = (last.stdin is not None) or \ builtins.__xonsh_commands_cache__.predict_threadable(last.args) if captured and thable: last.cls = PopenThread elif not thable: # foreground processes should use Popen and not pipe stdout, stderr last.threadable = False return # cannot used PTY pipes for aliases, for some dark reason, # and must use normal pipes instead. use_tty = ON_POSIX and not callable_alias # Do not set standard in! Popen is not a fan of redirections here # set standard out if last.stdout is not None: last.universal_newlines = True elif captured in STDOUT_CAPTURE_KINDS: last.universal_newlines = False r, w = os.pipe() last.stdout = safe_open(w, 'wb') last.captured_stdout = safe_open(r, 'rb') elif builtins.__xonsh_stdout_uncaptured__ is not None: last.universal_newlines = True last.stdout = builtins.__xonsh_stdout_uncaptured__ last.captured_stdout = last.stdout elif ON_WINDOWS and not callable_alias: last.universal_newlines = True last.stdout = None # must truly stream on windows last.captured_stdout = ConsoleParallelReader(1) else: last.universal_newlines = True r, w = pty.openpty() if use_tty else os.pipe() last.stdout = safe_open(w, 'w') last.captured_stdout = safe_open(r, 'r') # set standard error if last.stderr is not None: pass elif captured == 'object': r, w = os.pipe() last.stderr = safe_open(w, 'w') last.captured_stderr = safe_open(r, 'r') elif builtins.__xonsh_stderr_uncaptured__ is not None: last.stderr = builtins.__xonsh_stderr_uncaptured__ last.captured_stderr = last.stderr elif ON_WINDOWS and not callable_alias: last.universal_newlines = True last.stderr = None # must truly stream on windows else: r, w = pty.openpty() if use_tty else os.pipe() last.stderr = safe_open(w, 'w') last.captured_stderr = safe_open(r, 'r')
def _update_last_spec(last): env = builtins.__xonsh__.env captured = last.captured last.last_in_pipeline = True if not captured: return callable_alias = callable(last.alias) if callable_alias: pass else: cmds_cache = builtins.__xonsh__.commands_cache thable = (env.get("THREAD_SUBPROCS") and cmds_cache.predict_threadable(last.args) and cmds_cache.predict_threadable(last.cmd)) if captured and thable: last.cls = PopenThread elif not thable: # foreground processes should use Popen last.threadable = False if captured == "object" or captured == "hiddenobject": # CommandPipeline objects should not pipe stdout, stderr return # cannot used PTY pipes for aliases, for some dark reason, # and must use normal pipes instead. use_tty = ON_POSIX and not callable_alias # Do not set standard in! Popen is not a fan of redirections here # set standard out if last.stdout is not None: last.universal_newlines = True elif captured in STDOUT_CAPTURE_KINDS: last.universal_newlines = False r, w = os.pipe() last.stdout = safe_open(w, "wb") last.captured_stdout = safe_open(r, "rb") elif builtins.__xonsh__.stdout_uncaptured is not None: last.universal_newlines = True last.stdout = builtins.__xonsh__.stdout_uncaptured last.captured_stdout = last.stdout elif ON_WINDOWS and not callable_alias: last.universal_newlines = True last.stdout = None # must truly stream on windows last.captured_stdout = ConsoleParallelReader(1) else: last.universal_newlines = True r, w = pty.openpty() if use_tty else os.pipe() _safe_pipe_properties(w, use_tty=use_tty) last.stdout = safe_open(w, "w") _safe_pipe_properties(r, use_tty=use_tty) last.captured_stdout = safe_open(r, "r") # set standard error if last.stderr is not None: pass elif captured == "object": r, w = os.pipe() last.stderr = safe_open(w, "w") last.captured_stderr = safe_open(r, "r") elif builtins.__xonsh__.stderr_uncaptured is not None: last.stderr = builtins.__xonsh__.stderr_uncaptured last.captured_stderr = last.stderr elif ON_WINDOWS and not callable_alias: last.universal_newlines = True last.stderr = None # must truly stream on windows else: r, w = pty.openpty() if use_tty else os.pipe() _safe_pipe_properties(w, use_tty=use_tty) last.stderr = safe_open(w, "w") _safe_pipe_properties(r, use_tty=use_tty) last.captured_stderr = safe_open(r, "r") # redirect stdout to stderr, if we should if isinstance(last.stdout, int) and last.stdout == 2: # need to use private interface to avoid duplication. last._stdout = last.stderr # redirect stderr to stdout, if we should if callable_alias and last.stderr == subprocess.STDOUT: last._stderr = last.stdout last.captured_stderr = last.captured_stdout