1
1
use std:: env;
2
2
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 } ;
4
5
use std:: path:: PathBuf ;
5
6
use std:: process:: { self , Command , Stdio } ;
6
7
use std:: time:: Instant ;
7
8
use regex:: Regex ;
9
+ use tempfile:: tempfile;
8
10
9
11
use Cfg ;
10
12
use errors:: * ;
@@ -29,6 +31,18 @@ pub fn run_command_for_dir<S: AsRef<OsStr>>(cmd: Command,
29
31
}
30
32
31
33
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
+
32
46
let now = Instant :: now ( ) ;
33
47
34
48
cmd. args ( & args[ 1 ..] ) ;
@@ -44,15 +58,17 @@ fn telemetry_rustc<S: AsRef<OsStr>>(mut cmd: Command, args: &[S], cfg: &Cfg) ->
44
58
cmd. arg ( "always" ) ;
45
59
}
46
60
61
+ let mut cmd_err_file = tempfile ( ) . unwrap ( ) ;
62
+ let cmd_err_stdio = file_as_stdio ( & cmd_err_file) ;
63
+
47
64
// FIXME rust-lang/rust#32254. It's not clear to me
48
65
// when and why this is needed.
49
66
let mut cmd = cmd. stdin ( Stdio :: inherit ( ) )
50
67
. stdout ( Stdio :: inherit ( ) )
51
- . stderr ( Stdio :: piped ( ) )
68
+ . stderr ( cmd_err_stdio )
52
69
. spawn ( )
53
70
. unwrap ( ) ;
54
71
55
- let mut buffered_stderr = BufReader :: new ( cmd. stderr . take ( ) . unwrap ( ) ) ;
56
72
let status = cmd. wait ( ) ;
57
73
58
74
let duration = now. elapsed ( ) ;
@@ -75,6 +91,10 @@ fn telemetry_rustc<S: AsRef<OsStr>>(mut cmd: Command, args: &[S], cfg: &Cfg) ->
75
91
let stderr = io:: stderr ( ) ;
76
92
let mut handle = stderr. lock ( ) ;
77
93
94
+ cmd_err_file. seek ( SeekFrom :: Start ( 0 ) ) . unwrap ( ) ;
95
+
96
+ let mut buffered_stderr = BufReader :: new ( cmd_err_file) ;
97
+
78
98
while buffered_stderr. read_line ( & mut buffer) . unwrap ( ) > 0 {
79
99
let b = buffer. to_owned ( ) ;
80
100
buffer. clear ( ) ;
0 commit comments