@@ -1486,6 +1486,7 @@ fn maybe_download_rustfmt(builder: &Builder<'_>) -> Option<PathBuf> {
1486
1486
#[ derive( Deserialize ) ]
1487
1487
struct Stage0Metadata {
1488
1488
dist_server : String ,
1489
+ checksums_sha256 : HashMap < String , String > ,
1489
1490
rustfmt : Option < RustfmtMetadata > ,
1490
1491
}
1491
1492
#[ derive( Deserialize ) ]
@@ -1495,10 +1496,11 @@ fn maybe_download_rustfmt(builder: &Builder<'_>) -> Option<PathBuf> {
1495
1496
}
1496
1497
1497
1498
let stage0_json = builder. read ( & builder. src . join ( "src" ) . join ( "stage0.json" ) ) ;
1498
- let metadata = t ! ( serde_json:: from_str:: <Stage0Metadata >( & stage0_json) ) ;
1499
- let RustfmtMetadata { date, version } = metadata. rustfmt ?;
1499
+ let Stage0Metadata { dist_server, checksums_sha256, rustfmt } =
1500
+ t ! ( serde_json:: from_str:: <Stage0Metadata >( & stage0_json) ) ;
1501
+ let RustfmtMetadata { date, version } = rustfmt?;
1500
1502
let channel = format ! ( "{version}-{date}" ) ;
1501
- let mut dist_server = env:: var ( "RUSTUP_DIST_SERVER" ) . unwrap_or ( metadata . dist_server ) ;
1503
+ let mut dist_server = env:: var ( "RUSTUP_DIST_SERVER" ) . unwrap_or ( dist_server) ;
1502
1504
dist_server. push_str ( "/dist" ) ;
1503
1505
1504
1506
let host = builder. config . build ;
@@ -1510,8 +1512,15 @@ fn maybe_download_rustfmt(builder: &Builder<'_>) -> Option<PathBuf> {
1510
1512
}
1511
1513
1512
1514
let filename = format ! ( "rustfmt-{version}-{build}.tar.xz" , build = host. triple) ;
1513
- download_component ( builder, & dist_server, filename, "rustfmt-preview" , & date, "stage0" ) ;
1514
- assert ! ( rustfmt_path. exists( ) ) ;
1515
+ download_component (
1516
+ builder,
1517
+ & dist_server,
1518
+ filename,
1519
+ "rustfmt-preview" ,
1520
+ & date,
1521
+ "stage0" ,
1522
+ Some ( checksums_sha256) ,
1523
+ ) ;
1515
1524
1516
1525
builder. fix_bin_or_dylib ( & bin_root. join ( "bin" ) . join ( "rustfmt" ) ) ;
1517
1526
builder. fix_bin_or_dylib ( & bin_root. join ( "bin" ) . join ( "cargo-fmt" ) ) ;
@@ -1564,6 +1573,7 @@ fn download_ci_component(builder: &Builder<'_>, filename: String, prefix: &str,
1564
1573
prefix,
1565
1574
commit,
1566
1575
"ci-rustc" ,
1576
+ None ,
1567
1577
)
1568
1578
}
1569
1579
@@ -1574,17 +1584,55 @@ fn download_component(
1574
1584
prefix : & str ,
1575
1585
key : & str ,
1576
1586
destination : & str ,
1587
+ checksums : Option < HashMap < String , String > > ,
1577
1588
) {
1578
1589
let cache_dst = builder. out . join ( "cache" ) ;
1579
1590
let cache_dir = cache_dst. join ( key) ;
1580
1591
if !cache_dir. exists ( ) {
1581
1592
t ! ( fs:: create_dir_all( & cache_dir) ) ;
1582
1593
}
1583
1594
1595
+ let bin_root = builder. out . join ( builder. config . build . triple ) . join ( destination) ;
1584
1596
let tarball = cache_dir. join ( & filename) ;
1585
- if !tarball. exists ( ) {
1586
- builder. download_component ( base_url, & format ! ( "{key}/{filename}" ) , & tarball, "" ) ;
1597
+ let url = format ! ( "{key}/{filename}" ) ;
1598
+
1599
+ // For the beta compiler, put special effort into ensuring the checksums are valid.
1600
+ // FIXME: maybe we should do this for download-rustc as well? but it would be a pain to update
1601
+ // this on each and every nightly ...
1602
+ let checksum = if let Some ( checksums) = & checksums {
1603
+ let error = format ! (
1604
+ "src/stage0.json doesn't contain a checksum for {url}. \
1605
+ Pre-built artifacts might not be available for this \
1606
+ target at this time, see https://doc.rust-lang.org/nightly\
1607
+ /rustc/platform-support.html for more information."
1608
+ ) ;
1609
+ // TODO: add an enum { Commit, Published } so we don't have to hardcode `dist` in two places
1610
+ let sha256 = checksums. get ( & format ! ( "dist/{url}" ) ) . expect ( & error) ;
1611
+ if tarball. exists ( ) {
1612
+ if builder. verify ( & tarball, sha256) {
1613
+ builder. unpack ( & tarball, & bin_root, prefix) ;
1614
+ return ;
1615
+ } else {
1616
+ builder. verbose ( & format ! (
1617
+ "ignoring cached file {} due to failed verification" ,
1618
+ tarball. display( )
1619
+ ) ) ;
1620
+ builder. remove ( & tarball) ;
1621
+ }
1622
+ }
1623
+ Some ( sha256)
1624
+ } else if tarball. exists ( ) {
1625
+ return ;
1626
+ } else {
1627
+ None
1628
+ } ;
1629
+
1630
+ builder. download_component ( base_url, & url, & tarball, "" ) ;
1631
+ if let Some ( sha256) = checksum {
1632
+ if !builder. verify ( & tarball, sha256) {
1633
+ panic ! ( "failed to verify {}" , tarball. display( ) ) ;
1634
+ }
1587
1635
}
1588
- let bin_root = builder . out . join ( builder . config . build . triple ) . join ( destination ) ;
1589
- builder. unpack ( & tarball, & bin_root, prefix)
1636
+
1637
+ builder. unpack ( & tarball, & bin_root, prefix) ;
1590
1638
}
0 commit comments