Skip to content

Commit 267f234

Browse files
committed
support telemetry with lots of output
fixes rust-lang#639
1 parent abe9859 commit 267f234

File tree

4 files changed

+38
-3
lines changed

4 files changed

+38
-3
lines changed

Cargo.lock

Lines changed: 13 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ term = "0.4.4"
4040
itertools = "0.4.1"
4141
time = "0.1.34"
4242
tempdir = "0.3.4"
43+
tempfile = "2.1.4"
4344
libc = "0.2.0"
4445
rand = "0.3.11"
4546
scopeguard = "0.1.2"

src/rustup/command.rs

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
use std::env;
22
use std::ffi::OsStr;
3-
use std::io::{self, Write, BufRead, BufReader};
3+
use std::fs::File;
4+
use std::io::{self, Write, BufRead, BufReader, Seek, SeekFrom};
45
use std::path::PathBuf;
56
use std::process::{self, Command, Stdio};
67
use std::time::Instant;
78
use regex::Regex;
9+
use tempfile::tempfile;
810

911
use Cfg;
1012
use errors::*;
@@ -29,6 +31,18 @@ pub fn run_command_for_dir<S: AsRef<OsStr>>(cmd: Command,
2931
}
3032

3133
fn telemetry_rustc<S: AsRef<OsStr>>(mut cmd: Command, args: &[S], cfg: &Cfg) -> Result<()> {
34+
#[cfg(unix)]
35+
fn file_as_stdio(file: &File) -> Stdio {
36+
use std::os::unix::io::{AsRawFd, FromRawFd};
37+
unsafe { Stdio::from_raw_fd(file.as_raw_fd()) }
38+
}
39+
40+
#[cfg(windows)]
41+
fn file_as_stdio(file: &File) -> Stdio {
42+
use std::os::windows::io::{AsRawHandle, FromRawHandle};
43+
unsafe { Stdio::from_raw_handle(file.as_raw_handle()) }
44+
}
45+
3246
let now = Instant::now();
3347

3448
cmd.args(&args[1..]);
@@ -44,15 +58,17 @@ fn telemetry_rustc<S: AsRef<OsStr>>(mut cmd: Command, args: &[S], cfg: &Cfg) ->
4458
cmd.arg("always");
4559
}
4660

61+
let mut cmd_err_file = tempfile().unwrap();
62+
let cmd_err_stdio = file_as_stdio(&cmd_err_file);
63+
4764
// FIXME rust-lang/rust#32254. It's not clear to me
4865
// when and why this is needed.
4966
let mut cmd = cmd.stdin(Stdio::inherit())
5067
.stdout(Stdio::inherit())
51-
.stderr(Stdio::piped())
68+
.stderr(cmd_err_stdio)
5269
.spawn()
5370
.unwrap();
5471

55-
let mut buffered_stderr = BufReader::new(cmd.stderr.take().unwrap());
5672
let status = cmd.wait();
5773

5874
let duration = now.elapsed();
@@ -75,6 +91,10 @@ fn telemetry_rustc<S: AsRef<OsStr>>(mut cmd: Command, args: &[S], cfg: &Cfg) ->
7591
let stderr = io::stderr();
7692
let mut handle = stderr.lock();
7793

94+
cmd_err_file.seek(SeekFrom::Start(0)).unwrap();
95+
96+
let mut buffered_stderr = BufReader::new(cmd_err_file);
97+
7898
while buffered_stderr.read_line(&mut buffer).unwrap() > 0 {
7999
let b = buffer.to_owned();
80100
buffer.clear();

src/rustup/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ extern crate url;
99
extern crate regex;
1010
extern crate itertools;
1111
extern crate rustc_serialize;
12+
extern crate tempfile;
1213
extern crate time;
1314
extern crate toml;
1415
#[cfg(unix)]

0 commit comments

Comments
 (0)