@@ -2,7 +2,7 @@ use std::{
2
2
env,
3
3
ffi:: { OsStr , OsString } ,
4
4
fs:: { self , File } ,
5
- io:: { BufRead , BufReader , BufWriter , ErrorKind , Write } ,
5
+ io:: { BufRead , BufReader , BufWriter , ErrorKind , Read , Write } ,
6
6
path:: { Path , PathBuf } ,
7
7
process:: { Command , Stdio } ,
8
8
} ;
@@ -324,21 +324,38 @@ impl Config {
324
324
use sha2:: Digest ;
325
325
326
326
self . verbose ( & format ! ( "verifying {}" , path. display( ) ) ) ;
327
+
328
+ if self . dry_run ( ) {
329
+ return false ;
330
+ }
331
+
327
332
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 {
335
351
println ! (
336
352
"invalid checksum: \n \
337
- found: {found }\n \
353
+ found: {checksum }\n \
338
354
expected: {expected}",
339
355
) ;
340
356
}
341
- return verified;
357
+
358
+ verified
342
359
}
343
360
}
344
361
0 commit comments