Skip to content

Commit 3e03316

Browse files
Nemo157syphar
authored andcommitted
Don't cache the detected rustc-version, it's cheap enough to requery
1 parent 75f9ea8 commit 3e03316

File tree

1 file changed

+26
-19
lines changed

1 file changed

+26
-19
lines changed

src/docbuilder/rustwide_builder.rs

+26-19
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)