From: fmdkdd Date: Thu, 15 Dec 2016 23:05:58 +0000 (+0100) Subject: Fix `--message-format JSON` when rustc emits non-JSON warnings X-Git-Tag: archive/raspbian/0.35.0-2+rpi1~3^2^2^2^2^2^2^2~22^2~11^2~75^2~1 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=853db7431ad63fbf0fa58879dd179876d25e0997;p=cargo.git Fix `--message-format JSON` when rustc emits non-JSON warnings The `--message-format JSON` flag parses all the stderr output of rustc to JSON, but rustc can emit non-JSON lines to stderr (e.g., for warning about the unstable `-Z` flag on the stable channel), causing cargo to fail reporting compilation errors when using `--message-format JSON`. This commit adds a check to look for lines beginning with `{` to only parse these lines as JSON. Other lines from rustc are forwarded to the stderr of cargo. Fixes #3390. --- diff --git a/src/cargo/ops/cargo_rustc/mod.rs b/src/cargo/ops/cargo_rustc/mod.rs index 6c5991053..24f9deb0a 100644 --- a/src/cargo/ops/cargo_rustc/mod.rs +++ b/src/cargo/ops/cargo_rustc/mod.rs @@ -2,6 +2,7 @@ use std::collections::{HashMap, HashSet}; use std::env; use std::ffi::{OsStr, OsString}; use std::fs; +use std::io::{self, Write}; use std::path::{self, PathBuf}; use std::sync::Arc; @@ -297,15 +298,22 @@ fn rustc(cx: &mut Context, unit: &Unit) -> CargoResult { Ok(()) }, &mut |line| { - let compiler_message = json::Json::from_str(line).map_err(|_| { - internal(&format!("compiler produced invalid json: `{}`", line)) - })?; - - machine_message::emit(machine_message::FromCompiler { - package_id: &package_id, - target: &target, - message: compiler_message, - }); + // stderr from rustc can have a mix of JSON and non-JSON output + if line.starts_with("{") { + // Handle JSON lines + let compiler_message = json::Json::from_str(line).map_err(|_| { + internal(&format!("compiler produced invalid json: `{}`", line)) + })?; + + machine_message::emit(machine_message::FromCompiler { + package_id: &package_id, + target: &target, + message: compiler_message, + }); + } else { + // Forward non-JSON to stderr + writeln!(io::stderr(), "{}", line)?; + } Ok(()) }, ).map(|_| ())