Skip to content

Commit 4254f64

Browse files
committed
ci cleanup: rustdoc-gui-test now installs browser-ui-test
this removes the need for --unsafe-perm in the Dockerfile.
1 parent bfc046a commit 4254f64

File tree

5 files changed

+50
-79
lines changed

5 files changed

+50
-79
lines changed

src/build_helper/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ pub mod drop_bomb;
55
pub mod fs;
66
pub mod git;
77
pub mod metrics;
8+
pub mod npm;
89
pub mod stage0_parser;
910
pub mod targets;
1011
pub mod util;

src/build_helper/src/npm.rs

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
use std::error::Error;
2+
use std::path::{Path, PathBuf};
3+
use std::process::Command;
4+
use std::{fs, io};
5+
6+
/// Install an exact package version, and return the path of `node_modules`.
7+
pub fn install_one(
8+
out_dir: &Path,
9+
pkg_name: &str,
10+
pkg_version: &str,
11+
) -> Result<PathBuf, io::Error> {
12+
let nm_path = out_dir.join("node_modules");
13+
let _ = fs::create_dir(&nm_path);
14+
let mut child = Command::new("npm")
15+
.arg("install")
16+
.arg("--audit=false")
17+
.arg("--fund=false")
18+
.arg(format!("{pkg_name}@{pkg_version}"))
19+
.current_dir(out_dir)
20+
.spawn()?;
21+
let exit_status = child.wait()?;
22+
if !exit_status.success() {
23+
eprintln!("npm install did not exit successfully");
24+
return Err(io::Error::other(Box::<dyn Error + Send + Sync>::from(format!(
25+
"npm install returned exit code {exit_status}"
26+
))));
27+
}
28+
Ok(nm_path)
29+
}

src/ci/docker/host-x86_64/x86_64-gnu-tools/Dockerfile

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,5 @@ COPY scripts/shared.sh /scripts/
100100
# The `browser-ui-test.version` file is also used by bootstrap to emit warnings in case
101101
# the local version of the package is different than the one used by the CI.
102102
ENV SCRIPT /tmp/checktools.sh ../x.py && \
103-
npm install browser-ui-test@$(head -n 1 /tmp/browser-ui-test.version) --unsafe-perm=true && \
104103
python3 ../x.py check compiletest --set build.compiletest-use-stage0-libtest=true && \
105104
python3 ../x.py test tests/rustdoc-gui --stage 2 --test-args "'--jobs 1'"

src/tools/rustdoc-gui-test/src/config.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ use getopts::Options;
55

66
pub(crate) struct Config {
77
pub(crate) nodejs: PathBuf,
8-
pub(crate) npm: PathBuf,
98
pub(crate) rust_src: PathBuf,
109
pub(crate) out_dir: PathBuf,
1110
pub(crate) initial_cargo: PathBuf,

src/tools/rustdoc-gui-test/src/main.rs

Lines changed: 20 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -1,61 +1,19 @@
11
use std::path::{Path, PathBuf};
22
use std::process::Command;
33
use std::sync::Arc;
4-
use std::{env, fs};
4+
use std::{env, fs, io};
55

6+
use build_helper::npm;
67
use build_helper::util::try_run;
78
use compiletest::directives::TestProps;
89
use config::Config;
910

1011
mod config;
1112

12-
fn get_browser_ui_test_version_inner(npm: &Path, global: bool) -> Option<String> {
13-
let mut command = Command::new(&npm);
14-
command.arg("list").arg("--parseable").arg("--long").arg("--depth=0");
15-
if global {
16-
command.arg("--global");
17-
}
18-
let lines = match command.output() {
19-
Ok(output) => String::from_utf8_lossy(&output.stdout).into_owned(),
20-
Err(e) => {
21-
eprintln!(
22-
"path to npm can be wrong, provided path: {npm:?}. Try to set npm path \
23-
in bootstrap.toml in [build.npm]",
24-
);
25-
panic!("{:?}", e)
26-
}
27-
};
28-
lines
29-
.lines()
30-
.find_map(|l| l.rsplit(':').next()?.strip_prefix("browser-ui-test@"))
31-
.map(|v| v.to_owned())
32-
}
33-
34-
fn get_browser_ui_test_version(npm: &Path) -> Option<String> {
35-
get_browser_ui_test_version_inner(npm, false)
36-
.or_else(|| get_browser_ui_test_version_inner(npm, true))
37-
}
38-
39-
fn compare_browser_ui_test_version(installed_version: &str, src: &Path) {
40-
match fs::read_to_string(
13+
fn get_desired_browser_ui_test_version(src: &Path) -> Result<String, io::Error> {
14+
fs::read_to_string(
4115
src.join("src/ci/docker/host-x86_64/x86_64-gnu-tools/browser-ui-test.version"),
42-
) {
43-
Ok(v) => {
44-
if v.trim() != installed_version {
45-
eprintln!(
46-
"⚠️ Installed version of browser-ui-test (`{}`) is different than the \
47-
one used in the CI (`{}`)",
48-
installed_version, v
49-
);
50-
eprintln!(
51-
"You can install this version using `npm update browser-ui-test` or by using \
52-
`npm install browser-ui-test@{}`",
53-
v,
54-
);
55-
}
56-
}
57-
Err(e) => eprintln!("Couldn't find the CI browser-ui-test version: {:?}", e),
58-
}
16+
)
5917
}
6018

6119
fn find_librs<P: AsRef<Path>>(path: P) -> Option<PathBuf> {
@@ -71,27 +29,6 @@ fn find_librs<P: AsRef<Path>>(path: P) -> Option<PathBuf> {
7129
fn main() -> Result<(), ()> {
7230
let config = Arc::new(Config::from_args(env::args().collect()));
7331

74-
// The goal here is to check if the necessary packages are installed, and if not, we
75-
// panic.
76-
match get_browser_ui_test_version(&config.npm) {
77-
Some(version) => {
78-
// We also check the version currently used in CI and emit a warning if it's not the
79-
// same one.
80-
compare_browser_ui_test_version(&version, &config.rust_src);
81-
}
82-
None => {
83-
eprintln!(
84-
r#"
85-
error: rustdoc-gui test suite cannot be run because npm `browser-ui-test` dependency is missing.
86-
87-
If you want to install the `browser-ui-test` dependency, run `npm install browser-ui-test`
88-
"#,
89-
);
90-
91-
panic!("Cannot run rustdoc-gui tests");
92-
}
93-
}
94-
9532
let src_path = config.rust_src.join("tests/rustdoc-gui/src");
9633
for entry in src_path.read_dir().expect("read_dir call failed") {
9734
if let Ok(entry) = entry {
@@ -138,16 +75,16 @@ If you want to install the `browser-ui-test` dependency, run `npm install browse
13875
}
13976
}
14077

141-
let mut command = Command::new(&config.nodejs);
78+
let local_node_modules = npm::install_one(
79+
&config.out_dir,
80+
"browser-ui-test",
81+
&get_desired_browser_ui_test_version(&config.rust_src)
82+
.expect("unable to get desired version for browser-ui-test")
83+
.trim(),
84+
)
85+
.expect("unable to install browser-ui-test");
14286

143-
if let Ok(current_dir) = env::current_dir() {
144-
let local_node_modules = current_dir.join("node_modules");
145-
if local_node_modules.exists() {
146-
// Link the local node_modules if exists.
147-
// This is useful when we run rustdoc-gui-test from outside of the source root.
148-
env::set_var("NODE_PATH", local_node_modules);
149-
}
150-
}
87+
let mut command = Command::new(&config.nodejs);
15188

15289
command
15390
.arg(config.rust_src.join("src/tools/rustdoc-gui/tester.js"))
@@ -158,6 +95,12 @@ If you want to install the `browser-ui-test` dependency, run `npm install browse
15895
.arg("--tests-folder")
15996
.arg(config.rust_src.join("tests/rustdoc-gui"));
16097

98+
if local_node_modules.exists() {
99+
// Link the local node_modules if exists.
100+
// This is useful when we run rustdoc-gui-test from outside of the source root.
101+
command.env("NODE_PATH", local_node_modules);
102+
}
103+
161104
for file in &config.goml_files {
162105
command.arg("--file").arg(file);
163106
}

0 commit comments

Comments
 (0)