Skip to content

Commit a47933f

Browse files
committed
Simplify and generalize implementation of output mode
1 parent 8e5cfc6 commit a47933f

File tree

2 files changed

+46
-34
lines changed

2 files changed

+46
-34
lines changed

src/bootstrap/src/lib.rs

+25-19
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ use std::fmt::Display;
2323
use std::fs::{self, File};
2424
use std::io;
2525
use std::path::{Path, PathBuf};
26-
use std::process::{Command, Output, Stdio};
26+
use std::process::{Command, Stdio};
2727
use std::str;
2828
use std::sync::OnceLock;
2929

@@ -971,18 +971,25 @@ impl Build {
971971

972972
self.verbose(|| println!("running: {command:?}"));
973973

974-
let output: io::Result<Output> = match command.output_mode {
975-
OutputMode::Print => command.command.status().map(|status| Output {
976-
status,
977-
stdout: vec![],
978-
stderr: vec![],
979-
}),
980-
OutputMode::CaptureAll => command.command.output(),
981-
OutputMode::CaptureStdout => {
974+
match command.stdout {
975+
OutputMode::Print => {
976+
command.command.stdout(Stdio::inherit());
977+
}
978+
OutputMode::Capture => {
979+
command.command.stdout(Stdio::piped());
980+
}
981+
}
982+
983+
match command.stderr {
984+
OutputMode::Print => {
982985
command.command.stderr(Stdio::inherit());
983-
command.command.output()
984986
}
985-
};
987+
OutputMode::Capture => {
988+
command.command.stderr(Stdio::piped());
989+
}
990+
}
991+
992+
let output = command.command.output();
986993

987994
use std::fmt::Write;
988995

@@ -1001,16 +1008,15 @@ impl Build {
10011008
.unwrap();
10021009

10031010
let output: CommandOutput = output.into();
1004-
// If the output mode is OutputMode::Print, the output has already been printed to
1011+
1012+
// If the output mode is OutputMode::Capture, we can now print the output.
1013+
// If it is OutputMode::Print, then the output has already been printed to
10051014
// stdout/stderr, and we thus don't have anything captured to print anyway.
1006-
if matches!(command.output_mode, OutputMode::CaptureAll | OutputMode::CaptureStdout)
1007-
{
1015+
if command.stdout.captures() {
10081016
writeln!(message, "\nSTDOUT ----\n{}", output.stdout().trim()).unwrap();
1009-
1010-
// Stderr is added to the message only if it was captured
1011-
if matches!(command.output_mode, OutputMode::CaptureAll) {
1012-
writeln!(message, "\nSTDERR ----\n{}", output.stderr().trim()).unwrap();
1013-
}
1017+
}
1018+
if command.stderr.captures() {
1019+
writeln!(message, "\nSTDERR ----\n{}", output.stderr().trim()).unwrap();
10141020
}
10151021
output
10161022
}

src/bootstrap/src/utils/exec.rs

+21-15
Original file line numberDiff line numberDiff line change
@@ -13,19 +13,23 @@ pub enum BehaviorOnFailure {
1313
Ignore,
1414
}
1515

16-
/// How should the output of the command be handled (whether it should be captured or printed).
16+
/// How should the output of a specific stream of the command (stdout/stderr) be handled
17+
/// (whether it should be captured or printed).
1718
#[derive(Debug, Copy, Clone)]
1819
pub enum OutputMode {
19-
/// Prints the stdout/stderr of the command to stdout/stderr of bootstrap (by inheriting these
20-
/// streams).
21-
/// Corresponds to calling `cmd.status()`.
20+
/// Prints the stream by inheriting it from the bootstrap process.
2221
Print,
23-
/// Captures the stdout and stderr of the command into memory.
24-
/// Corresponds to calling `cmd.output()`.
25-
CaptureAll,
26-
/// Captures the stdout of the command into memory, inherits stderr.
27-
/// Corresponds to calling `cmd.output()`.
28-
CaptureStdout,
22+
/// Captures the stream into memory.
23+
Capture,
24+
}
25+
26+
impl OutputMode {
27+
pub fn captures(&self) -> bool {
28+
match self {
29+
OutputMode::Print => false,
30+
OutputMode::Capture => true,
31+
}
32+
}
2933
}
3034

3135
/// Wrapper around `std::process::Command`.
@@ -45,7 +49,8 @@ pub enum OutputMode {
4549
pub struct BootstrapCommand {
4650
pub command: Command,
4751
pub failure_behavior: BehaviorOnFailure,
48-
pub output_mode: OutputMode,
52+
pub stdout: OutputMode,
53+
pub stderr: OutputMode,
4954
// Run the command even during dry run
5055
pub run_always: bool,
5156
}
@@ -113,14 +118,14 @@ impl BootstrapCommand {
113118
self
114119
}
115120

116-
/// Capture the output of the command, do not print it.
121+
/// Capture all output of the command, do not print it.
117122
pub fn capture(self) -> Self {
118-
Self { output_mode: OutputMode::CaptureAll, ..self }
123+
Self { stdout: OutputMode::Capture, stderr: OutputMode::Capture, ..self }
119124
}
120125

121126
/// Capture stdout of the command, do not print it.
122127
pub fn capture_stdout(self) -> Self {
123-
Self { output_mode: OutputMode::CaptureStdout, ..self }
128+
Self { stdout: OutputMode::Capture, ..self }
124129
}
125130
}
126131

@@ -137,7 +142,8 @@ impl From<Command> for BootstrapCommand {
137142
Self {
138143
command,
139144
failure_behavior: BehaviorOnFailure::Exit,
140-
output_mode: OutputMode::Print,
145+
stdout: OutputMode::Print,
146+
stderr: OutputMode::Print,
141147
run_always: false,
142148
}
143149
}

0 commit comments

Comments
 (0)