@@ -6,13 +6,14 @@ use std::{
6
6
path:: { Path , PathBuf } ,
7
7
process:: { Command , Stdio } ,
8
8
sync:: OnceLock ,
9
+ time:: SystemTime ,
9
10
} ;
10
11
11
12
use build_helper:: ci:: CiEnv ;
12
13
use xz2:: bufread:: XzDecoder ;
13
14
14
15
use crate :: core:: config:: RustfmtMetadata ;
15
- use crate :: utils:: helpers:: { check_run, exe, program_out_of_date} ;
16
+ use crate :: utils:: helpers:: { check_run, exe, program_out_of_date, try_output } ;
16
17
use crate :: { core:: build_steps:: llvm:: detect_llvm_sha, utils:: helpers:: hex_encode} ;
17
18
use crate :: { t, Config } ;
18
19
@@ -194,7 +195,7 @@ impl Config {
194
195
let _ = try_run ( self , patchelf. arg ( fname) ) ;
195
196
}
196
197
197
- fn download_file ( & self , url : & str , dest_path : & Path , help_on_error : & str ) {
198
+ fn download_file ( & self , url : & str , dest_path : & Path , help_on_error : & str , commit : & str ) {
198
199
self . verbose ( || println ! ( "download {url}" ) ) ;
199
200
// Use a temporary file in case we crash while downloading, to avoid a corrupt download in cache/.
200
201
let tempfile = self . tempdir ( ) . join ( dest_path. file_name ( ) . unwrap ( ) ) ;
@@ -203,7 +204,7 @@ impl Config {
203
204
// protocols without worrying about merge conflicts if we change the HTTP implementation.
204
205
match url. split_once ( "://" ) . map ( |( proto, _) | proto) {
205
206
Some ( "http" ) | Some ( "https" ) => {
206
- self . download_http_with_retries ( & tempfile, url, help_on_error)
207
+ self . download_http_with_retries ( & tempfile, url, help_on_error, commit )
207
208
}
208
209
Some ( other) => panic ! ( "unsupported protocol {other} in {url}" ) ,
209
210
None => panic ! ( "no protocol in {url}" ) ,
@@ -214,7 +215,13 @@ impl Config {
214
215
) ;
215
216
}
216
217
217
- fn download_http_with_retries ( & self , tempfile : & Path , url : & str , help_on_error : & str ) {
218
+ fn download_http_with_retries (
219
+ & self ,
220
+ tempfile : & Path ,
221
+ url : & str ,
222
+ help_on_error : & str ,
223
+ commit : & str ,
224
+ ) {
218
225
println ! ( "downloading {url}" ) ;
219
226
// Try curl. If that fails and we are on windows, fallback to PowerShell.
220
227
let mut curl = Command :: new ( "curl" ) ;
@@ -250,19 +257,52 @@ impl Config {
250
257
"(New-Object System.Net.WebClient).DownloadFile('{}', '{}')" ,
251
258
url, tempfile. to_str( ) . expect( "invalid UTF-8 not supported with powershell downloads" ) ,
252
259
) ,
253
- ] ) ) . is_err ( ) {
260
+ ] ) ) . is_ok ( ) {
254
261
return ;
255
262
}
256
263
eprintln ! ( "\n spurious failure, trying again" ) ;
257
264
}
258
265
}
259
266
if !help_on_error. is_empty ( ) {
260
267
eprintln ! ( "{help_on_error}" ) ;
268
+ Self :: check_outdated ( commit) ;
261
269
}
262
270
crate :: exit!( 1 ) ;
263
271
}
264
272
}
265
273
274
+ fn check_outdated ( commit : & str ) {
275
+ let build_date: String = try_output (
276
+ Command :: new ( "git" )
277
+ . arg ( "show" )
278
+ . arg ( "-s" )
279
+ . arg ( "--format=%ct" ) // Commit date in unix timestamp
280
+ . arg ( commit) ,
281
+ ) ;
282
+ match SystemTime :: now ( ) . duration_since ( SystemTime :: UNIX_EPOCH ) {
283
+ Ok ( n) => {
284
+ let replaced = build_date. trim ( ) ;
285
+ let diff = n. as_secs ( ) - replaced. parse :: < u64 > ( ) . unwrap ( ) ;
286
+ if diff >= 165 * 24 * 60 * 60 {
287
+ let build_date: String = try_output (
288
+ Command :: new ( "git" )
289
+ . arg ( "show" )
290
+ . arg ( "-s" )
291
+ . arg ( "--format=%cr" ) // Commit date in `x days ago` format
292
+ . arg ( commit) ,
293
+ ) ;
294
+ eprintln ! (
295
+ "NOTE: tried to download builds for {} (from {}), CI builds are only retained for 168 days" ,
296
+ commit, build_date
297
+ ) ;
298
+ eprintln ! ( "HELP: Consider updating your copy of the rust sources" ) ;
299
+ return ;
300
+ }
301
+ }
302
+ Err ( _) => panic ! ( "SystemTime before UNIX EPOCH!" ) ,
303
+ }
304
+ }
305
+
266
306
fn unpack ( & self , tarball : & Path , dst : & Path , pattern : & str ) {
267
307
eprintln ! ( "extracting {} to {}" , tarball. display( ) , dst. display( ) ) ;
268
308
if !dst. exists ( ) {
@@ -495,7 +535,7 @@ impl Config {
495
535
let extra_components = [ "cargo" ] ;
496
536
497
537
let download_beta_component = |config : & Config , filename, prefix : & _ , date : & _ | {
498
- config. download_component ( DownloadSource :: Dist , filename, prefix, date, "stage0" )
538
+ config. download_component ( DownloadSource :: Dist , filename, prefix, date, "stage0" ) ;
499
539
} ;
500
540
501
541
self . download_toolchain (
@@ -573,7 +613,7 @@ impl Config {
573
613
mode : DownloadSource ,
574
614
filename : String ,
575
615
prefix : & str ,
576
- key : & str ,
616
+ commit : & str ,
577
617
destination : & str ,
578
618
) {
579
619
if self . dry_run ( ) {
@@ -583,7 +623,7 @@ impl Config {
583
623
let cache_dst =
584
624
self . bootstrap_cache_path . as_ref ( ) . cloned ( ) . unwrap_or_else ( || self . out . join ( "cache" ) ) ;
585
625
586
- let cache_dir = cache_dst. join ( key ) ;
626
+ let cache_dir = cache_dst. join ( commit ) ;
587
627
if !cache_dir. exists ( ) {
588
628
t ! ( fs:: create_dir_all( & cache_dir) ) ;
589
629
}
@@ -599,15 +639,15 @@ impl Config {
599
639
} ;
600
640
let url = format ! (
601
641
"{}/{filename}" ,
602
- key . strip_suffix( & format!( "-{}" , self . llvm_assertions) ) . unwrap( )
642
+ commit . strip_suffix( & format!( "-{}" , self . llvm_assertions) ) . unwrap( )
603
643
) ;
604
644
( dist_server, url, false )
605
645
}
606
646
DownloadSource :: Dist => {
607
647
let dist_server = env:: var ( "RUSTUP_DIST_SERVER" )
608
648
. unwrap_or ( self . stage0_metadata . config . dist_server . to_string ( ) ) ;
609
649
// NOTE: make `dist` part of the URL because that's how it's stored in src/stage0.json
610
- ( dist_server, format ! ( "dist/{key }/{filename}" ) , true )
650
+ ( dist_server, format ! ( "dist/{commit }/{filename}" ) , true )
611
651
}
612
652
} ;
613
653
@@ -655,7 +695,7 @@ HELP: if trying to compile an old commit of rustc, disable `download-rustc` in c
655
695
download-rustc = false
656
696
" ;
657
697
}
658
- self . download_file ( & format ! ( "{base_url}/{url}" ) , & tarball, help_on_error) ;
698
+ self . download_file ( & format ! ( "{base_url}/{url}" ) , & tarball, help_on_error, & commit ) ;
659
699
if let Some ( sha256) = checksum {
660
700
if !self . verify ( & tarball, sha256) {
661
701
panic ! ( "failed to verify {}" , tarball. display( ) ) ;
@@ -737,7 +777,12 @@ download-rustc = false
737
777
[llvm]
738
778
download-ci-llvm = false
739
779
" ;
740
- self . download_file ( & format ! ( "{base}/{llvm_sha}/{filename}" ) , & tarball, help_on_error) ;
780
+ self . download_file (
781
+ & format ! ( "{base}/{llvm_sha}/{filename}" ) ,
782
+ & tarball,
783
+ help_on_error,
784
+ & llvm_sha,
785
+ ) ;
741
786
}
742
787
let llvm_root = self . ci_llvm_root ( ) ;
743
788
self . unpack ( & tarball, & llvm_root, "rust-dev" ) ;
0 commit comments