Auto merge of #114590 - ijackson:stdio-stdio-2, r=dtolnay
Allow redirecting subprocess stdout to our stderr etc. (redux) This is the code from #88561, tidied up, including review suggestions, and with the for-testing-only CI commit removed. FCP for the API completed in #88561. I have made a new MR to facilitate review. The discussion there is very cluttered and the branch is full of changes (in many cases as a result of changes to other Rust stdlib APIs since then). Assuming this MR is approvedl we should close that one. ### Reviewer doing a de novo review Just code review these four commits.. FCP discussion starts here: https://github.com/rust-lang/rust/pull/88561#issuecomment-1640527595 Portability tests: you can see that this branch works on Windows too by looking at the CI results in #88561, which has the same code changes as this branch but with an additional "DO NOT MERGE" commit to make the Windows tests run. ### Reviewer doing an incremental review from some version of #88561 Review the new commits since your last review. I haven't force pushed the branch there. git diff the two branches (eg `git diff 176886197d6..0842b69c219`). You'll see that the only difference is in gitlab CI files. You can also see that *this* MR doesn't touch those files.
This commit is contained in:
commit
559421e8e3
4 changed files with 134 additions and 11 deletions
|
@ -1501,6 +1501,66 @@ impl From<fs::File> for Stdio {
|
|||
}
|
||||
}
|
||||
|
||||
#[stable(feature = "stdio_from_stdio", since = "CURRENT_RUSTC_VERSION")]
|
||||
impl From<io::Stdout> for Stdio {
|
||||
/// Redirect command stdout/stderr to our stdout
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```rust
|
||||
/// #![feature(exit_status_error)]
|
||||
/// use std::io;
|
||||
/// use std::process::Command;
|
||||
///
|
||||
/// # fn test() -> Result<(), Box<dyn std::error::Error>> {
|
||||
/// let output = Command::new("whoami")
|
||||
// "whoami" is a command which exists on both Unix and Windows,
|
||||
// and which succeeds, producing some stdout output but no stderr.
|
||||
/// .stdout(io::stdout())
|
||||
/// .output()?;
|
||||
/// output.status.exit_ok()?;
|
||||
/// assert!(output.stdout.is_empty());
|
||||
/// # Ok(())
|
||||
/// # }
|
||||
/// #
|
||||
/// # if cfg!(unix) {
|
||||
/// # test().unwrap();
|
||||
/// # }
|
||||
/// ```
|
||||
fn from(inherit: io::Stdout) -> Stdio {
|
||||
Stdio::from_inner(inherit.into())
|
||||
}
|
||||
}
|
||||
|
||||
#[stable(feature = "stdio_from_stdio", since = "CURRENT_RUSTC_VERSION")]
|
||||
impl From<io::Stderr> for Stdio {
|
||||
/// Redirect command stdout/stderr to our stderr
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```rust
|
||||
/// #![feature(exit_status_error)]
|
||||
/// use std::io;
|
||||
/// use std::process::Command;
|
||||
///
|
||||
/// # fn test() -> Result<(), Box<dyn std::error::Error>> {
|
||||
/// let output = Command::new("whoami")
|
||||
/// .stdout(io::stderr())
|
||||
/// .output()?;
|
||||
/// output.status.exit_ok()?;
|
||||
/// assert!(output.stdout.is_empty());
|
||||
/// # Ok(())
|
||||
/// # }
|
||||
/// #
|
||||
/// # if cfg!(unix) {
|
||||
/// # test().unwrap();
|
||||
/// # }
|
||||
/// ```
|
||||
fn from(inherit: io::Stderr) -> Stdio {
|
||||
Stdio::from_inner(inherit.into())
|
||||
}
|
||||
}
|
||||
|
||||
/// Describes the result of a process after it has terminated.
|
||||
///
|
||||
/// This `struct` is used to represent the exit status or other termination of a child process.
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue