Skip to content

Commit c1453bc

Browse files
committed
Don't cache the detected rustc-version, it's cheap enough to requery
1 parent 7c007fc commit c1453bc

File tree

1 file changed

+25
-19
lines changed

1 file changed

+25
-19
lines changed

src/docbuilder/rustwide_builder.rs

+25-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,23 @@ 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+
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+
228236
/// Return a string containing the output of `rustc --version`. Only valid
229237
/// for dist toolchains. Will error if run with a CI toolchain.
230238
fn detect_rustc_version(&self) -> Result<String> {
@@ -243,8 +251,8 @@ impl RustwideBuilder {
243251
}
244252

245253
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)?;
248256

249257
info!("building a dummy crate to get essential files");
250258

@@ -266,7 +274,7 @@ impl RustwideBuilder {
266274

267275
let mut build_dir = self
268276
.workspace
269-
.build_dir(&format!("essential-files-{rustc_version}"));
277+
.build_dir(&format!("essential-files-{parsed_rustc_version}"));
270278

271279
// This is an empty library crate that is supposed to always build.
272280
let krate = Crate::crates_io(DUMMY_CRATE_NAME, DUMMY_CRATE_VERSION);
@@ -281,10 +289,10 @@ impl RustwideBuilder {
281289
let res =
282290
self.execute_build(HOST_TARGET, true, build, &limits, &metadata, true)?;
283291
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);
285293
}
286294

287-
info!("copying essential files for {}", self.rustc_version);
295+
info!("copying essential files for {}", rustc_version);
288296
assert!(!metadata.proc_macro);
289297
let source = build.host_target_dir().join(HOST_TARGET).join("doc");
290298
let dest = tempfile::Builder::new()
@@ -310,11 +318,7 @@ impl RustwideBuilder {
310318
)?;
311319
}
312320

313-
set_config(
314-
&mut conn,
315-
ConfigName::RustcVersion,
316-
self.rustc_version.clone(),
317-
)?;
321+
set_config(&mut conn, ConfigName::RustcVersion, rustc_version)?;
318322
Ok(())
319323
})()
320324
.map_err(|e| failure::Error::from_boxed_compat(e.into()))
@@ -691,7 +695,7 @@ impl RustwideBuilder {
691695
.to_string()];
692696
rustdoc_flags.extend(vec![
693697
"--resource-suffix".to_string(),
694-
format!("-{}", parse_rustc_version(&self.rustc_version)?),
698+
format!("-{}", parse_rustc_version(self.rustc_version()?)?),
695699
]);
696700

697701
let mut storage = LogStorage::new(log::LevelFilter::Info);
@@ -734,7 +738,7 @@ impl RustwideBuilder {
734738

735739
Ok(FullBuildResult {
736740
result: BuildResult {
737-
rustc_version: self.rustc_version.clone(),
741+
rustc_version: self.rustc_version()?,
738742
docsrs_version: format!("docsrs {}", crate::BUILD_VERSION),
739743
successful,
740744
},
@@ -1336,6 +1340,7 @@ mod tests {
13361340
wrapper(|env: &TestEnvironment| {
13371341
let mut builder = RustwideBuilder::init(env)?;
13381342
builder.update_toolchain()?;
1343+
let old_version = builder.rustc_version()?;
13391344
drop(builder);
13401345

13411346
// new builder should detect the existing rustc version from the previous builder
@@ -1346,6 +1351,7 @@ mod tests {
13461351
DUMMY_CRATE_VERSION,
13471352
PackageKind::CratesIo
13481353
)?);
1354+
assert_eq!(old_version, builder.rustc_version()?);
13491355

13501356
Ok(())
13511357
})

0 commit comments

Comments
 (0)