1 //! Runs rustfmt on the repository.
4 use std::process::Command;
5 use ignore::WalkBuilder;
9 fn rustfmt(build: &Build, path: &Path, check: bool) {
10 let rustfmt_path = build.config.initial_rustfmt.as_ref().unwrap_or_else(|| {
11 eprintln!("./x.py fmt is not supported on this channel");
12 std::process::exit(1);
15 let mut cmd = Command::new(&rustfmt_path);
16 // avoid the submodule config paths from coming into play,
17 // we only allow a single global config for the workspace for now
18 cmd.arg("--config-path").arg(&build.src.canonicalize().unwrap());
19 cmd.arg("--unstable-features");
20 cmd.arg("--skip-children");
25 let cmd_debug = format!("{:?}", cmd);
26 let status = cmd.status().expect("executing rustfmt");
27 assert!(status.success(), "running {} successful", cmd_debug);
30 #[derive(serde::Deserialize)]
31 struct RustfmtConfig {
35 pub fn format(build: &Build, check: bool) {
36 let mut builder = ignore::types::TypesBuilder::new();
37 builder.add_defaults();
38 builder.select("rust");
39 let matcher = builder.build().unwrap();
41 let rustfmt_config = t!(std::fs::read_to_string(build.src.join("rustfmt.toml")));
42 let rustfmt_config: RustfmtConfig = t!(toml::from_str(&rustfmt_config));
43 let mut ignore_fmt = ignore::overrides::OverrideBuilder::new(&build.src);
44 for ignore in rustfmt_config.ignore {
45 ignore_fmt.add(&format!("!{}", ignore)).expect(&ignore);
47 let ignore_fmt = ignore_fmt.build().unwrap();
49 let walker = WalkBuilder::new(&build.src)
51 .overrides(ignore_fmt)
54 let entry = t!(entry);
55 if entry.file_type().map_or(false, |t| t.is_file()) {
56 rustfmt(build, &entry.path(), check);