in src/commands.rs [439:494]
fn handle_compile_finished(
response: CompileFinished,
stdout: &mut dyn Write,
stderr: &mut dyn Write,
) -> Result<i32> {
trace!("handle_compile_finished");
fn write_output(
stream: impl IsTerminal,
writer: &mut dyn Write,
data: &[u8],
color_mode: ColorMode,
) -> Result<()> {
// rustc uses the `termcolor` crate which explicitly checks for TERM=="dumb", so
// match that behavior here.
let dumb_term = env::var("TERM").map(|v| v == "dumb").unwrap_or(false);
// If the compiler options explicitly requested color output, or if this output stream
// is a terminal and the compiler options didn't explicitly request non-color output,
// then write the compiler output directly.
if color_mode == ColorMode::On
|| (!dumb_term && stream.is_terminal() && color_mode != ColorMode::Off)
{
writer.write_all(data)?;
} else {
// Remove escape codes (and thus colors) while writing.
let mut writer = Writer::new(writer);
writer.write_all(data)?;
}
Ok(())
}
// It might be nice if the server sent stdout/stderr as the process
// ran, but then it would have to also save them in the cache as
// interleaved streams to really make it work.
write_output(
std::io::stdout(),
stdout,
&response.stdout,
response.color_mode,
)?;
write_output(
std::io::stderr(),
stderr,
&response.stderr,
response.color_mode,
)?;
if let Some(ret) = response.retcode {
trace!("compiler exited with status {}", ret);
Ok(ret)
} else if let Some(signal) = response.signal {
println!("sccache: Compiler killed by signal {}", signal);
Ok(-2)
} else {
println!("sccache: Missing compiler exit status!");
Ok(-3)
}
}