@@ -88,7 +88,6 @@ pub struct RustwideBuilder {
8888 storage : Arc < Storage > ,
8989 metrics : Arc < InstanceMetrics > ,
9090 registry_api : Arc < RegistryApi > ,
91- rustc_version : String ,
9291 repository_stats_updater : Arc < RepositoryStatsUpdater > ,
9392 workspace_initialize_time : Instant ,
9493}
@@ -106,7 +105,6 @@ impl RustwideBuilder {
106105 storage : context. storage ( ) ?,
107106 metrics : context. instance_metrics ( ) ?,
108107 registry_api : context. registry_api ( ) ?,
109- rustc_version : String :: new ( ) ,
110108 repository_stats_updater : context. repository_stats_updater ( ) ?,
111109 workspace_initialize_time : Instant :: now ( ) ,
112110 } )
@@ -151,11 +149,10 @@ impl RustwideBuilder {
151149 // +channel argument, but the +channel argument doesn't work for CI builds. So
152150 // we fake the rustc version and install from scratch every time since we can't detect
153151 // the already-installed rustc version.
154- if let Some ( ci ) = self . toolchain . as_ci ( ) {
152+ if self . toolchain . as_ci ( ) . is_some ( ) {
155153 self . toolchain
156154 . install ( & self . workspace )
157155 . map_err ( FailureError :: compat) ?;
158- self . rustc_version = format ! ( "rustc 1.9999.0-nightly ({} 2999-12-29)" , ci. sha( ) ) ;
159156 self . add_essential_files ( ) ?;
160157 return Ok ( true ) ;
161158 }
@@ -219,12 +216,24 @@ impl RustwideBuilder {
219216 }
220217 }
221218
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 ( ) ?) ;
225220 Ok ( has_changed)
226221 }
227222
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+
228237 /// Return a string containing the output of `rustc --version`. Only valid
229238 /// for dist toolchains. Will error if run with a CI toolchain.
230239 fn detect_rustc_version ( & self ) -> Result < String > {
@@ -243,8 +252,8 @@ impl RustwideBuilder {
243252 }
244253
245254 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) ?;
248257
249258 info ! ( "building a dummy crate to get essential files" ) ;
250259
@@ -266,7 +275,7 @@ impl RustwideBuilder {
266275
267276 let mut build_dir = self
268277 . workspace
269- . build_dir ( & format ! ( "essential-files-{rustc_version }" ) ) ;
278+ . build_dir ( & format ! ( "essential-files-{parsed_rustc_version }" ) ) ;
270279
271280 // This is an empty library crate that is supposed to always build.
272281 let krate = Crate :: crates_io ( DUMMY_CRATE_NAME , DUMMY_CRATE_VERSION ) ;
@@ -281,10 +290,10 @@ impl RustwideBuilder {
281290 let res =
282291 self . execute_build ( HOST_TARGET , true , build, & limits, & metadata, true ) ?;
283292 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) ;
285294 }
286295
287- info ! ( "copying essential files for {}" , self . rustc_version) ;
296+ info ! ( "copying essential files for {}" , rustc_version) ;
288297 assert ! ( !metadata. proc_macro) ;
289298 let source = build. host_target_dir ( ) . join ( HOST_TARGET ) . join ( "doc" ) ;
290299 let dest = tempfile:: Builder :: new ( )
@@ -310,11 +319,7 @@ impl RustwideBuilder {
310319 ) ?;
311320 }
312321
313- set_config (
314- & mut conn,
315- ConfigName :: RustcVersion ,
316- self . rustc_version . clone ( ) ,
317- ) ?;
322+ set_config ( & mut conn, ConfigName :: RustcVersion , rustc_version) ?;
318323 Ok ( ( ) )
319324 } ) ( )
320325 . map_err ( |e| failure:: Error :: from_boxed_compat ( e. into ( ) ) )
@@ -691,7 +696,7 @@ impl RustwideBuilder {
691696 . to_string( ) ] ;
692697 rustdoc_flags. extend ( vec ! [
693698 "--resource-suffix" . to_string( ) ,
694- format!( "-{}" , parse_rustc_version( & self . rustc_version) ?) ,
699+ format!( "-{}" , parse_rustc_version( self . rustc_version( ) ? ) ?) ,
695700 ] ) ;
696701
697702 let mut storage = LogStorage :: new ( log:: LevelFilter :: Info ) ;
@@ -734,7 +739,7 @@ impl RustwideBuilder {
734739
735740 Ok ( FullBuildResult {
736741 result : BuildResult {
737- rustc_version : self . rustc_version . clone ( ) ,
742+ rustc_version : self . rustc_version ( ) ? ,
738743 docsrs_version : format ! ( "docsrs {}" , crate :: BUILD_VERSION ) ,
739744 successful,
740745 } ,
@@ -1336,6 +1341,7 @@ mod tests {
13361341 wrapper ( |env : & TestEnvironment | {
13371342 let mut builder = RustwideBuilder :: init ( env) ?;
13381343 builder. update_toolchain ( ) ?;
1344+ let old_version = builder. rustc_version ( ) ?;
13391345 drop ( builder) ;
13401346
13411347 // new builder should detect the existing rustc version from the previous builder
@@ -1346,6 +1352,7 @@ mod tests {
13461352 DUMMY_CRATE_VERSION ,
13471353 PackageKind :: CratesIo
13481354 ) ?) ;
1355+ assert_eq ! ( old_version, builder. rustc_version( ) ?) ;
13491356
13501357 Ok ( ( ) )
13511358 } )
0 commit comments