}
}
-fn check_if_browser_ui_test_is_installed_global(npm: &Path, global: bool) -> bool {
+fn get_browser_ui_test_version_inner(npm: &Path, global: bool) -> Option<String> {
let mut command = Command::new(&npm);
- command.arg("list").arg("--depth=0");
+ command.arg("list").arg("--parseable").arg("--long").arg("--depth=0");
if global {
command.arg("--global");
}
.output()
.map(|output| String::from_utf8_lossy(&output.stdout).into_owned())
.unwrap_or(String::new());
- lines.contains(&" browser-ui-test@")
+ lines.lines().find_map(|l| l.split(":browser-ui-test@").skip(1).next()).map(|v| v.to_owned())
}
-fn check_if_browser_ui_test_is_installed(npm: &Path) -> bool {
- check_if_browser_ui_test_is_installed_global(npm, false)
- || check_if_browser_ui_test_is_installed_global(npm, true)
+fn get_browser_ui_test_version(npm: &Path) -> Option<String> {
+ get_browser_ui_test_version_inner(npm, false)
+ .or_else(|| get_browser_ui_test_version_inner(npm, true))
+}
+
+fn compare_browser_ui_test_version(installed_version: &str, src: &Path) {
+ match fs::read_to_string(
+ src.join("src/ci/docker/host-x86_64/x86_64-gnu-tools/browser-ui-test.version"),
+ ) {
+ Ok(v) => {
+ if v.trim() != installed_version {
+ eprintln!(
+ "⚠️ Installed version of browser-ui-test (`{}`) is different than the \
+ one used in the CI (`{}`)",
+ installed_version, v
+ );
+ }
+ }
+ Err(e) => eprintln!("Couldn't find the CI browser-ui-test version: {:?}", e),
+ }
}
#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]
.config
.npm
.as_ref()
- .map(|p| check_if_browser_ui_test_is_installed(p))
+ .map(|p| get_browser_ui_test_version(p).is_some())
.unwrap_or(false)
}))
}
// The goal here is to check if the necessary packages are installed, and if not, we
// panic.
- if !check_if_browser_ui_test_is_installed(&npm) {
- eprintln!(
- "error: rustdoc-gui test suite cannot be run because npm `browser-ui-test` \
- dependency is missing",
- );
- eprintln!(
- "If you want to install the `{0}` dependency, run `npm install {0}`",
- "browser-ui-test",
- );
- panic!("Cannot run rustdoc-gui tests");
+ match get_browser_ui_test_version(&npm) {
+ Some(version) => {
+ // We also check the version currently used in CI and emit a warning if it's not the
+ // same one.
+ compare_browser_ui_test_version(&version, &builder.build.src);
+ }
+ None => {
+ eprintln!(
+ "error: rustdoc-gui test suite cannot be run because npm `browser-ui-test` \
+ dependency is missing",
+ );
+ eprintln!(
+ "If you want to install the `{0}` dependency, run `npm install {0}`",
+ "browser-ui-test",
+ );
+ panic!("Cannot run rustdoc-gui tests");
+ }
}
let out_dir = builder.test_out(self.target).join("rustdoc-gui");
}
}
+/// Rustdoc is special in various ways, which is why this step is different from `Crate`.
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
pub struct CrateRustdoc {
host: TargetSelection,
let test_kind = self.test_kind;
let target = self.host;
- // Use the previous stage compiler to reuse the artifacts that are
- // created when running compiletest for src/test/rustdoc. If this used
- // `compiler`, then it would cause rustdoc to be built *again*, which
- // isn't really necessary.
- let compiler = builder.compiler_for(builder.top_stage, target, target);
+ let compiler = if builder.config.download_rustc {
+ builder.compiler(builder.top_stage, target)
+ } else {
+ // Use the previous stage compiler to reuse the artifacts that are
+ // created when running compiletest for src/test/rustdoc. If this used
+ // `compiler`, then it would cause rustdoc to be built *again*, which
+ // isn't really necessary.
+ builder.compiler_for(builder.top_stage, target, target)
+ };
builder.ensure(compile::Rustc { compiler, target });
let mut cargo = tool::prepare_tool_cargo(
// sets up the dylib path for the *host* (stage1/lib), which is the
// wrong directory.
//
+ // Recall that we special-cased `compiler_for(top_stage)` above, so we always use stage1.
+ //
// It should be considered to just stop running doctests on
// librustdoc. There is only one test, and it doesn't look too
// important. There might be other ways to avoid this, but it seems
// See also https://github.com/rust-lang/rust/issues/13983 where the
// host vs target dylibs for rustdoc are consistently tricky to deal
// with.
+ //
+ // Note that this set the host libdir for `download_rustc`, which uses a normal rust distribution.
+ let libdir = if builder.config.download_rustc {
+ builder.rustc_libdir(compiler)
+ } else {
+ builder.sysroot_libdir(compiler, target).to_path_buf()
+ };
let mut dylib_path = dylib_path();
- dylib_path.insert(0, PathBuf::from(&*builder.sysroot_libdir(compiler, target)));
+ dylib_path.insert(0, PathBuf::from(&*libdir));
cargo.env(dylib_path_var(), env::join_paths(&dylib_path).unwrap());
if !builder.config.verbose_tests {