@@ -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,23 @@ 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
+ Ok ( 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
+ }
235
+
228
236
/// Return a string containing the output of `rustc --version`. Only valid
229
237
/// for dist toolchains. Will error if run with a CI toolchain.
230
238
fn detect_rustc_version ( & self ) -> Result < String > {
@@ -243,8 +251,8 @@ impl RustwideBuilder {
243
251
}
244
252
245
253
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 ) ?;
254
+ let rustc_version = self . rustc_version ( ) ?;
255
+ let parsed_rustc_version = parse_rustc_version ( & rustc_version) ?;
248
256
249
257
info ! ( "building a dummy crate to get essential files" ) ;
250
258
@@ -266,7 +274,7 @@ impl RustwideBuilder {
266
274
267
275
let mut build_dir = self
268
276
. workspace
269
- . build_dir ( & format ! ( "essential-files-{rustc_version }" ) ) ;
277
+ . build_dir ( & format ! ( "essential-files-{parsed_rustc_version }" ) ) ;
270
278
271
279
// This is an empty library crate that is supposed to always build.
272
280
let krate = Crate :: crates_io ( DUMMY_CRATE_NAME , DUMMY_CRATE_VERSION ) ;
@@ -281,10 +289,10 @@ impl RustwideBuilder {
281
289
let res =
282
290
self . execute_build ( HOST_TARGET , true , build, & limits, & metadata, true ) ?;
283
291
if !res. result . successful {
284
- bail ! ( "failed to build dummy crate for {}" , self . rustc_version) ;
292
+ bail ! ( "failed to build dummy crate for {}" , rustc_version) ;
285
293
}
286
294
287
- info ! ( "copying essential files for {}" , self . rustc_version) ;
295
+ info ! ( "copying essential files for {}" , rustc_version) ;
288
296
assert ! ( !metadata. proc_macro) ;
289
297
let source = build. host_target_dir ( ) . join ( HOST_TARGET ) . join ( "doc" ) ;
290
298
let dest = tempfile:: Builder :: new ( )
@@ -310,11 +318,7 @@ impl RustwideBuilder {
310
318
) ?;
311
319
}
312
320
313
- set_config (
314
- & mut conn,
315
- ConfigName :: RustcVersion ,
316
- self . rustc_version . clone ( ) ,
317
- ) ?;
321
+ set_config ( & mut conn, ConfigName :: RustcVersion , rustc_version) ?;
318
322
Ok ( ( ) )
319
323
} ) ( )
320
324
. map_err ( |e| failure:: Error :: from_boxed_compat ( e. into ( ) ) )
@@ -691,7 +695,7 @@ impl RustwideBuilder {
691
695
. to_string( ) ] ;
692
696
rustdoc_flags. extend ( vec ! [
693
697
"--resource-suffix" . to_string( ) ,
694
- format!( "-{}" , parse_rustc_version( & self . rustc_version) ?) ,
698
+ format!( "-{}" , parse_rustc_version( self . rustc_version( ) ? ) ?) ,
695
699
] ) ;
696
700
697
701
let mut storage = LogStorage :: new ( log:: LevelFilter :: Info ) ;
@@ -734,7 +738,7 @@ impl RustwideBuilder {
734
738
735
739
Ok ( FullBuildResult {
736
740
result : BuildResult {
737
- rustc_version : self . rustc_version . clone ( ) ,
741
+ rustc_version : self . rustc_version ( ) ? ,
738
742
docsrs_version : format ! ( "docsrs {}" , crate :: BUILD_VERSION ) ,
739
743
successful,
740
744
} ,
@@ -1336,6 +1340,7 @@ mod tests {
1336
1340
wrapper ( |env : & TestEnvironment | {
1337
1341
let mut builder = RustwideBuilder :: init ( env) ?;
1338
1342
builder. update_toolchain ( ) ?;
1343
+ let old_version = builder. rustc_version ( ) ?;
1339
1344
drop ( builder) ;
1340
1345
1341
1346
// new builder should detect the existing rustc version from the previous builder
@@ -1346,6 +1351,7 @@ mod tests {
1346
1351
DUMMY_CRATE_VERSION ,
1347
1352
PackageKind :: CratesIo
1348
1353
) ?) ;
1354
+ assert_eq ! ( old_version, builder. rustc_version( ) ?) ;
1349
1355
1350
1356
Ok ( ( ) )
1351
1357
} )
0 commit comments