mirror of
https://github.com/rust-lang/cargo.git
synced 2025-10-01 11:30:39 +00:00
Add support for rustc's -Z terminal-width
.
This commit adds support for rustc's `-Z terminal-width` flag, which is used to trim diagnostic output to fit within the current terminal. Co-authored-by: David Wood <david@davidtw.co> Signed-off-by: David Wood <david@davidtw.co>
This commit is contained in:
parent
729e5676a0
commit
c46b9a70bd
@ -47,6 +47,7 @@ pub use self::lto::Lto;
|
|||||||
use self::output_depinfo::output_depinfo;
|
use self::output_depinfo::output_depinfo;
|
||||||
use self::unit_graph::UnitDep;
|
use self::unit_graph::UnitDep;
|
||||||
pub use crate::core::compiler::unit::{Unit, UnitInterner};
|
pub use crate::core::compiler::unit::{Unit, UnitInterner};
|
||||||
|
use crate::core::features::nightly_features_allowed;
|
||||||
use crate::core::manifest::TargetSourcePath;
|
use crate::core::manifest::TargetSourcePath;
|
||||||
use crate::core::profiles::{PanicStrategy, Profile, Strip};
|
use crate::core::profiles::{PanicStrategy, Profile, Strip};
|
||||||
use crate::core::{Edition, Feature, PackageId, Target};
|
use crate::core::{Edition, Feature, PackageId, Target};
|
||||||
@ -709,6 +710,7 @@ fn add_error_format_and_color(
|
|||||||
// to emit a message that cargo will intercept.
|
// to emit a message that cargo will intercept.
|
||||||
json.push_str(",artifacts");
|
json.push_str(",artifacts");
|
||||||
}
|
}
|
||||||
|
|
||||||
match cx.bcx.build_config.message_format {
|
match cx.bcx.build_config.message_format {
|
||||||
MessageFormat::Short | MessageFormat::Json { short: true, .. } => {
|
MessageFormat::Short | MessageFormat::Json { short: true, .. } => {
|
||||||
json.push_str(",diagnostic-short");
|
json.push_str(",diagnostic-short");
|
||||||
@ -716,6 +718,16 @@ fn add_error_format_and_color(
|
|||||||
_ => {}
|
_ => {}
|
||||||
}
|
}
|
||||||
cmd.arg(json);
|
cmd.arg(json);
|
||||||
|
|
||||||
|
if nightly_features_allowed() {
|
||||||
|
if let (Some(width), _) | (_, Some(width)) = (
|
||||||
|
cx.bcx.config.cli_unstable().terminal_width,
|
||||||
|
cx.bcx.config.shell().accurate_err_width(),
|
||||||
|
) {
|
||||||
|
cmd.arg(format!("-Zterminal-width={}", width));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -357,6 +357,7 @@ pub struct CliUnstable {
|
|||||||
pub separate_nightlies: bool,
|
pub separate_nightlies: bool,
|
||||||
pub multitarget: bool,
|
pub multitarget: bool,
|
||||||
pub rustdoc_map: bool,
|
pub rustdoc_map: bool,
|
||||||
|
pub terminal_width: Option<usize>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl CliUnstable {
|
impl CliUnstable {
|
||||||
@ -411,6 +412,16 @@ impl CliUnstable {
|
|||||||
Ok(true)
|
Ok(true)
|
||||||
};
|
};
|
||||||
|
|
||||||
|
fn parse_usize_opt(value: Option<&str>) -> CargoResult<Option<usize>> {
|
||||||
|
Ok(match value {
|
||||||
|
Some(value) => match value.parse::<usize>() {
|
||||||
|
Ok(value) => Some(value),
|
||||||
|
Err(e) => bail!("expected a number, found: {}", e),
|
||||||
|
},
|
||||||
|
None => None,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
match k {
|
match k {
|
||||||
"print-im-a-teapot" => self.print_im_a_teapot = parse_bool(k, v)?,
|
"print-im-a-teapot" => self.print_im_a_teapot = parse_bool(k, v)?,
|
||||||
"unstable-options" => self.unstable_options = parse_empty(k, v)?,
|
"unstable-options" => self.unstable_options = parse_empty(k, v)?,
|
||||||
@ -437,6 +448,7 @@ impl CliUnstable {
|
|||||||
"separate-nightlies" => self.separate_nightlies = parse_empty(k, v)?,
|
"separate-nightlies" => self.separate_nightlies = parse_empty(k, v)?,
|
||||||
"multitarget" => self.multitarget = parse_empty(k, v)?,
|
"multitarget" => self.multitarget = parse_empty(k, v)?,
|
||||||
"rustdoc-map" => self.rustdoc_map = parse_empty(k, v)?,
|
"rustdoc-map" => self.rustdoc_map = parse_empty(k, v)?,
|
||||||
|
"terminal-width" => self.terminal_width = parse_usize_opt(v)?,
|
||||||
_ => bail!("unknown `-Z` flag specified: {}", k),
|
_ => bail!("unknown `-Z` flag specified: {}", k),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -134,6 +134,15 @@ impl Shell {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Returns the width of the terminal in spaces, if any. Always `None` in Windows.
|
||||||
|
pub fn accurate_err_width(&self) -> Option<usize> {
|
||||||
|
if self.is_err_tty() {
|
||||||
|
imp::accurate_stderr_width()
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Returns `true` if stderr is a tty.
|
/// Returns `true` if stderr is a tty.
|
||||||
pub fn is_err_tty(&self) -> bool {
|
pub fn is_err_tty(&self) -> bool {
|
||||||
match self.output {
|
match self.output {
|
||||||
@ -411,6 +420,10 @@ mod imp {
|
|||||||
use super::Shell;
|
use super::Shell;
|
||||||
use std::mem;
|
use std::mem;
|
||||||
|
|
||||||
|
pub fn accurate_stderr_width() -> Option<usize> {
|
||||||
|
stderr_width()
|
||||||
|
}
|
||||||
|
|
||||||
pub fn stderr_width() -> Option<usize> {
|
pub fn stderr_width() -> Option<usize> {
|
||||||
unsafe {
|
unsafe {
|
||||||
let mut winsize: libc::winsize = mem::zeroed();
|
let mut winsize: libc::winsize = mem::zeroed();
|
||||||
@ -447,6 +460,10 @@ mod imp {
|
|||||||
|
|
||||||
pub(super) use super::default_err_erase_line as err_erase_line;
|
pub(super) use super::default_err_erase_line as err_erase_line;
|
||||||
|
|
||||||
|
pub fn accurate_stderr_width() -> Option<usize> {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
|
||||||
pub fn stderr_width() -> Option<usize> {
|
pub fn stderr_width() -> Option<usize> {
|
||||||
unsafe {
|
unsafe {
|
||||||
let stdout = GetStdHandle(STD_ERROR_HANDLE);
|
let stdout = GetStdHandle(STD_ERROR_HANDLE);
|
||||||
|
@ -7,8 +7,8 @@ use cargo::{
|
|||||||
use cargo_test_support::paths::{root, CargoPathExt};
|
use cargo_test_support::paths::{root, CargoPathExt};
|
||||||
use cargo_test_support::registry::Package;
|
use cargo_test_support::registry::Package;
|
||||||
use cargo_test_support::{
|
use cargo_test_support::{
|
||||||
basic_bin_manifest, basic_lib_manifest, basic_manifest, lines_match, main_file, project,
|
basic_bin_manifest, basic_lib_manifest, basic_manifest, is_nightly, lines_match, main_file,
|
||||||
rustc_host, sleep_ms, symlink_supported, t, Execs, ProjectBuilder,
|
project, rustc_host, sleep_ms, symlink_supported, t, Execs, ProjectBuilder,
|
||||||
};
|
};
|
||||||
use std::env;
|
use std::env;
|
||||||
use std::fs;
|
use std::fs;
|
||||||
@ -5103,3 +5103,27 @@ fn target_directory_backup_exclusion() {
|
|||||||
p.cargo("build").run();
|
p.cargo("build").run();
|
||||||
assert!(!&cachedir_tag.is_file());
|
assert!(!&cachedir_tag.is_file());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cargo_test]
|
||||||
|
fn simple_terminal_width() {
|
||||||
|
if !is_nightly() {
|
||||||
|
// --terminal-width is unstable
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
let p = project()
|
||||||
|
.file(
|
||||||
|
"src/lib.rs",
|
||||||
|
r#"
|
||||||
|
fn main() {
|
||||||
|
let _: () = 42;
|
||||||
|
}
|
||||||
|
"#,
|
||||||
|
)
|
||||||
|
.build();
|
||||||
|
|
||||||
|
p.cargo("build -Zterminal-width=20")
|
||||||
|
.masquerade_as_nightly_cargo()
|
||||||
|
.with_status(101)
|
||||||
|
.with_stderr_contains("3 | ..._: () = 42;")
|
||||||
|
.run();
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user