1 use crate::recursive::{deserialize_line, serialize_line, DriverInfo};
3 use std::io::{self, BufReader, Write};
4 use std::net::TcpStream;
5 use std::process::{self, Command, Stdio};
8 /// 1. Sends [`DriverInfo`] to the [`crate::recursive::LintcheckServer`] running on `addr`
9 /// 2. Receives [bool] from the server, if `false` returns `None`
10 /// 3. Otherwise sends the stderr of running `clippy-driver` to the server
11 fn run_clippy(addr: &str) -> Option<i32> {
12 let driver_info = DriverInfo {
13 package_name: env::var("CARGO_PKG_NAME").ok()?,
14 crate_name: env::var("CARGO_CRATE_NAME").ok()?,
15 version: env::var("CARGO_PKG_VERSION").ok()?,
18 let mut stream = BufReader::new(TcpStream::connect(addr).unwrap());
20 serialize_line(&driver_info, stream.get_mut());
22 let should_run = deserialize_line::<bool, _>(&mut stream);
27 // Remove --cap-lints allow so that clippy runs and lints are emitted
28 let mut include_next = true;
29 let args = env::args().skip(1).filter(|arg| match arg.as_str() {
30 "--cap-lints=allow" => false,
35 _ => mem::replace(&mut include_next, true),
38 let output = Command::new(env::var("CLIPPY_DRIVER").expect("missing env CLIPPY_DRIVER"))
40 .stdout(Stdio::inherit())
42 .expect("failed to run clippy-driver");
46 .write_all(&output.stderr)
47 .unwrap_or_else(|e| panic!("{e:?} in {driver_info:?}"));
49 match output.status.code() {
52 io::stderr().write_all(&output.stderr).unwrap();
53 Some(code.expect("killed by signal"))
58 pub fn drive(addr: &str) {
59 process::exit(run_clippy(addr).unwrap_or_else(|| {
61 .args(env::args_os().skip(2))