@@ -2,7 +2,7 @@ use std::{
22 env,
33 ffi:: { OsStr , OsString } ,
44 fs:: { self , File } ,
5- io:: { BufRead , BufReader , BufWriter , ErrorKind , Write } ,
5+ io:: { BufRead , BufReader , BufWriter , ErrorKind , Read , Write } ,
66 path:: { Path , PathBuf } ,
77 process:: { Command , Stdio } ,
88} ;
@@ -324,21 +324,38 @@ impl Config {
324324 use sha2:: Digest ;
325325
326326 self . verbose ( & format ! ( "verifying {}" , path. display( ) ) ) ;
327+
328+ if self . dry_run ( ) {
329+ return false ;
330+ }
331+
327332 let mut hasher = sha2:: Sha256 :: new ( ) ;
328- // FIXME: this is ok for rustfmt (4.1 MB large at time of writing), but it seems memory-intensive for rustc and larger components.
329- // Consider using streaming IO instead?
330- let contents = if self . dry_run ( ) { vec ! [ ] } else { t ! ( fs:: read( path) ) } ;
331- hasher. update ( & contents) ;
332- let found = hex:: encode ( hasher. finalize ( ) . as_slice ( ) ) ;
333- let verified = found == expected;
334- if !verified && !self . dry_run ( ) {
333+
334+ let file = t ! ( File :: open( path) ) ;
335+ let mut reader = BufReader :: new ( file) ;
336+ let mut buffer = [ 0 ; 4096 ] ; // read in chunks of 4KB
337+
338+ loop {
339+ let read_len = t ! ( reader. read( & mut buffer) ) ;
340+ // break if EOF
341+ if read_len == 0 {
342+ break ;
343+ }
344+ hasher. update ( & buffer[ 0 ..read_len] ) ;
345+ }
346+
347+ let checksum = hex:: encode ( hasher. finalize ( ) . as_slice ( ) ) ;
348+ let verified = checksum == expected;
349+
350+ if !verified {
335351 println ! (
336352 "invalid checksum: \n \
337- found: {found }\n \
353+ found: {checksum }\n \
338354 expected: {expected}",
339355 ) ;
340356 }
341- return verified;
357+
358+ verified
342359 }
343360}
344361
0 commit comments