@@ -88,7 +88,6 @@ pub struct RustwideBuilder {
88
88
storage : Arc < Storage > ,
89
89
metrics : Arc < InstanceMetrics > ,
90
90
registry_api : Arc < RegistryApi > ,
91
- rustc_version : String ,
92
91
repository_stats_updater : Arc < RepositoryStatsUpdater > ,
93
92
workspace_initialize_time : Instant ,
94
93
}
@@ -106,7 +105,6 @@ impl RustwideBuilder {
106
105
storage : context. storage ( ) ?,
107
106
metrics : context. instance_metrics ( ) ?,
108
107
registry_api : context. registry_api ( ) ?,
109
- rustc_version : String :: new ( ) ,
110
108
repository_stats_updater : context. repository_stats_updater ( ) ?,
111
109
workspace_initialize_time : Instant :: now ( ) ,
112
110
} )
@@ -151,11 +149,10 @@ impl RustwideBuilder {
151
149
// +channel argument, but the +channel argument doesn't work for CI builds. So
152
150
// we fake the rustc version and install from scratch every time since we can't detect
153
151
// the already-installed rustc version.
154
- if let Some ( ci ) = self . toolchain . as_ci ( ) {
152
+ if self . toolchain . as_ci ( ) . is_some ( ) {
155
153
self . toolchain
156
154
. install ( & self . workspace )
157
155
. map_err ( FailureError :: compat) ?;
158
- self . rustc_version = format ! ( "rustc 1.9999.0-nightly ({} 2999-12-29)" , ci. sha( ) ) ;
159
156
self . add_essential_files ( ) ?;
160
157
return Ok ( true ) ;
161
158
}
@@ -219,12 +216,24 @@ impl RustwideBuilder {
219
216
}
220
217
}
221
218
222
- self . rustc_version = self . detect_rustc_version ( ) ?;
223
-
224
- let has_changed = old_version. as_deref ( ) != Some ( & self . rustc_version ) ;
219
+ let has_changed = old_version != Some ( self . rustc_version ( ) ?) ;
225
220
Ok ( has_changed)
226
221
}
227
222
223
+ fn rustc_version ( & self ) -> Result < String > {
224
+ let version = self
225
+ . toolchain
226
+ . as_ci ( )
227
+ . map ( |ci| {
228
+ // Detecting the rustc version relies on calling rustc through rustup with the
229
+ // +channel argument, but the +channel argument doesn't work for CI builds. So
230
+ // we fake the rustc version.
231
+ Ok ( format ! ( "rustc 1.9999.0-nightly ({} 2999-12-29)" , ci. sha( ) ) )
232
+ } )
233
+ . unwrap_or_else ( || self . detect_rustc_version ( ) ) ?;
234
+ Ok ( version)
235
+ }
236
+
228
237
/// Return a string containing the output of `rustc --version`. Only valid
229
238
/// for dist toolchains. Will error if run with a CI toolchain.
230
239
fn detect_rustc_version ( & self ) -> Result < String > {
@@ -243,8 +252,8 @@ impl RustwideBuilder {
243
252
}
244
253
245
254
pub fn add_essential_files ( & mut self ) -> Result < ( ) > {
246
- self . rustc_version = self . detect_rustc_version ( ) ?;
247
- let rustc_version = parse_rustc_version ( & self . rustc_version ) ?;
255
+ let rustc_version = self . rustc_version ( ) ?;
256
+ let parsed_rustc_version = parse_rustc_version ( & rustc_version) ?;
248
257
249
258
info ! ( "building a dummy crate to get essential files" ) ;
250
259
@@ -266,7 +275,7 @@ impl RustwideBuilder {
266
275
267
276
let mut build_dir = self
268
277
. workspace
269
- . build_dir ( & format ! ( "essential-files-{rustc_version }" ) ) ;
278
+ . build_dir ( & format ! ( "essential-files-{parsed_rustc_version }" ) ) ;
270
279
271
280
// This is an empty library crate that is supposed to always build.
272
281
let krate = Crate :: crates_io ( DUMMY_CRATE_NAME , DUMMY_CRATE_VERSION ) ;
@@ -281,10 +290,10 @@ impl RustwideBuilder {
281
290
let res =
282
291
self . execute_build ( HOST_TARGET , true , build, & limits, & metadata, true ) ?;
283
292
if !res. result . successful {
284
- bail ! ( "failed to build dummy crate for {}" , self . rustc_version) ;
293
+ bail ! ( "failed to build dummy crate for {}" , rustc_version) ;
285
294
}
286
295
287
- info ! ( "copying essential files for {}" , self . rustc_version) ;
296
+ info ! ( "copying essential files for {}" , rustc_version) ;
288
297
assert ! ( !metadata. proc_macro) ;
289
298
let source = build. host_target_dir ( ) . join ( HOST_TARGET ) . join ( "doc" ) ;
290
299
let dest = tempfile:: Builder :: new ( )
@@ -310,11 +319,7 @@ impl RustwideBuilder {
310
319
) ?;
311
320
}
312
321
313
- set_config (
314
- & mut conn,
315
- ConfigName :: RustcVersion ,
316
- self . rustc_version . clone ( ) ,
317
- ) ?;
322
+ set_config ( & mut conn, ConfigName :: RustcVersion , rustc_version) ?;
318
323
Ok ( ( ) )
319
324
} ) ( )
320
325
. map_err ( |e| failure:: Error :: from_boxed_compat ( e. into ( ) ) )
@@ -691,7 +696,7 @@ impl RustwideBuilder {
691
696
. to_string( ) ] ;
692
697
rustdoc_flags. extend ( vec ! [
693
698
"--resource-suffix" . to_string( ) ,
694
- format!( "-{}" , parse_rustc_version( & self . rustc_version) ?) ,
699
+ format!( "-{}" , parse_rustc_version( self . rustc_version( ) ? ) ?) ,
695
700
] ) ;
696
701
697
702
let mut storage = LogStorage :: new ( log:: LevelFilter :: Info ) ;
@@ -734,7 +739,7 @@ impl RustwideBuilder {
734
739
735
740
Ok ( FullBuildResult {
736
741
result : BuildResult {
737
- rustc_version : self . rustc_version . clone ( ) ,
742
+ rustc_version : self . rustc_version ( ) ? ,
738
743
docsrs_version : format ! ( "docsrs {}" , crate :: BUILD_VERSION ) ,
739
744
successful,
740
745
} ,
@@ -1336,6 +1341,7 @@ mod tests {
1336
1341
wrapper ( |env : & TestEnvironment | {
1337
1342
let mut builder = RustwideBuilder :: init ( env) ?;
1338
1343
builder. update_toolchain ( ) ?;
1344
+ let old_version = builder. rustc_version ( ) ?;
1339
1345
drop ( builder) ;
1340
1346
1341
1347
// new builder should detect the existing rustc version from the previous builder
@@ -1346,6 +1352,7 @@ mod tests {
1346
1352
DUMMY_CRATE_VERSION ,
1347
1353
PackageKind :: CratesIo
1348
1354
) ?) ;
1355
+ assert_eq ! ( old_version, builder. rustc_version( ) ?) ;
1349
1356
1350
1357
Ok ( ( ) )
1351
1358
} )
0 commit comments