@@ -4,11 +4,12 @@ use indexmap::IndexMap;
4
4
use std:: collections:: HashMap ;
5
5
use std:: convert:: TryInto ;
6
6
7
- const DIST_SERVER : & str = "https://static.rust-lang.org " ;
7
+ const PATH : & str = "src/stage0.json " ;
8
8
const COMPILER_COMPONENTS : & [ & str ] = & [ "rustc" , "rust-std" , "cargo" ] ;
9
9
const RUSTFMT_COMPONENTS : & [ & str ] = & [ "rustfmt-preview" ] ;
10
10
11
11
struct Tool {
12
+ config : Config ,
12
13
channel : Channel ,
13
14
version : [ u16 ; 3 ] ,
14
15
checksums : IndexMap < String , String > ,
@@ -32,26 +33,29 @@ impl Tool {
32
33
. try_into ( )
33
34
. map_err ( |_| anyhow:: anyhow!( "failed to parse version" ) ) ?;
34
35
35
- Ok ( Self { channel, version, checksums : IndexMap :: new ( ) } )
36
+ let existing: Stage0 = serde_json:: from_slice ( & std:: fs:: read ( PATH ) ?) ?;
37
+
38
+ Ok ( Self { channel, version, config : existing. config , checksums : IndexMap :: new ( ) } )
36
39
}
37
40
38
41
fn update_json ( mut self ) -> Result < ( ) , Error > {
39
42
std:: fs:: write (
40
- "src/stage0.json" ,
43
+ PATH ,
41
44
format ! (
42
45
"{}\n " ,
43
46
serde_json:: to_string_pretty( & Stage0 {
44
47
comment: "Generated by `./x.py run src/tools/bump-stage0`. \
45
- Run that command again to update the bootstrap compiler.",
46
- dist_server : DIST_SERVER . into( ) ,
48
+ Run that command again to update the bootstrap compiler."
49
+ . into( ) ,
47
50
compiler: self . detect_compiler( ) ?,
48
51
rustfmt: self . detect_rustfmt( ) ?,
49
52
checksums_sha256: {
50
53
// Keys are sorted here instead of beforehand because values in this map
51
54
// are added while filling the other struct fields just above this block.
52
55
self . checksums. sort_keys( ) ;
53
56
self . checksums
54
- }
57
+ } ,
58
+ config: self . config,
55
59
} ) ?
56
60
) ,
57
61
) ?;
@@ -74,7 +78,7 @@ impl Tool {
74
78
Channel :: Nightly => "beta" . to_string ( ) ,
75
79
} ;
76
80
77
- let manifest = fetch_manifest ( & channel) ?;
81
+ let manifest = fetch_manifest ( & self . config , & channel) ?;
78
82
self . collect_checksums ( & manifest, COMPILER_COMPONENTS ) ?;
79
83
Ok ( Stage0Toolchain {
80
84
date : manifest. date ,
@@ -100,13 +104,13 @@ impl Tool {
100
104
return Ok ( None ) ;
101
105
}
102
106
103
- let manifest = fetch_manifest ( "nightly" ) ?;
107
+ let manifest = fetch_manifest ( & self . config , "nightly" ) ?;
104
108
self . collect_checksums ( & manifest, RUSTFMT_COMPONENTS ) ?;
105
109
Ok ( Some ( Stage0Toolchain { date : manifest. date , version : "nightly" . into ( ) } ) )
106
110
}
107
111
108
112
fn collect_checksums ( & mut self , manifest : & Manifest , components : & [ & str ] ) -> Result < ( ) , Error > {
109
- let prefix = format ! ( "{}/" , DIST_SERVER ) ;
113
+ let prefix = format ! ( "{}/" , self . config . dist_server ) ;
110
114
for component in components {
111
115
let pkg = manifest
112
116
. pkg
@@ -136,10 +140,10 @@ fn main() -> Result<(), Error> {
136
140
Ok ( ( ) )
137
141
}
138
142
139
- fn fetch_manifest ( channel : & str ) -> Result < Manifest , Error > {
143
+ fn fetch_manifest ( config : & Config , channel : & str ) -> Result < Manifest , Error > {
140
144
Ok ( toml:: from_slice ( & http_get ( & format ! (
141
145
"{}/dist/channel-rust-{}.toml" ,
142
- DIST_SERVER , channel
146
+ config . dist_server , channel
143
147
) ) ?) ?)
144
148
}
145
149
@@ -166,35 +170,40 @@ enum Channel {
166
170
Nightly ,
167
171
}
168
172
169
- #[ derive( Debug , serde:: Serialize ) ]
173
+ #[ derive( Debug , serde:: Serialize , serde :: Deserialize ) ]
170
174
struct Stage0 {
171
175
#[ serde( rename = "__comment" ) ]
172
- comment : & ' static str ,
173
- dist_server : String ,
176
+ comment : String ,
177
+ config : Config ,
174
178
compiler : Stage0Toolchain ,
175
179
rustfmt : Option < Stage0Toolchain > ,
176
180
checksums_sha256 : IndexMap < String , String > ,
177
181
}
178
182
179
- #[ derive( Debug , serde:: Serialize ) ]
183
+ #[ derive( Debug , serde:: Serialize , serde:: Deserialize ) ]
184
+ struct Config {
185
+ dist_server : String ,
186
+ }
187
+
188
+ #[ derive( Debug , serde:: Serialize , serde:: Deserialize ) ]
180
189
struct Stage0Toolchain {
181
190
date : String ,
182
191
version : String ,
183
192
}
184
193
185
- #[ derive( Debug , serde:: Deserialize ) ]
194
+ #[ derive( Debug , serde:: Serialize , serde :: Deserialize ) ]
186
195
struct Manifest {
187
196
date : String ,
188
197
pkg : HashMap < String , ManifestPackage > ,
189
198
}
190
199
191
- #[ derive( Debug , serde:: Deserialize ) ]
200
+ #[ derive( Debug , serde:: Serialize , serde :: Deserialize ) ]
192
201
struct ManifestPackage {
193
202
version : String ,
194
203
target : HashMap < String , ManifestTargetPackage > ,
195
204
}
196
205
197
- #[ derive( Debug , serde:: Deserialize ) ]
206
+ #[ derive( Debug , serde:: Serialize , serde :: Deserialize ) ]
198
207
struct ManifestTargetPackage {
199
208
url : Option < String > ,
200
209
hash : Option < String > ,
0 commit comments