@@ -12,8 +12,8 @@ use std::sync::mpsc::SyncSender;
1212
1313fn rustfmt ( src : & Path , rustfmt : & Path , paths : & [ PathBuf ] , check : bool ) -> impl FnMut ( bool ) -> bool {
1414 let mut cmd = Command :: new ( rustfmt) ;
15- // avoid the submodule config paths from coming into play,
16- // we only allow a single global config for the workspace for now
15+ // Avoid the submodule config paths from coming into play. We only allow a single global config
16+ // for the workspace for now.
1717 cmd. arg ( "--config-path" ) . arg ( & src. canonicalize ( ) . unwrap ( ) ) ;
1818 cmd. arg ( "--edition" ) . arg ( "2021" ) ;
1919 cmd. arg ( "--unstable-features" ) ;
@@ -24,7 +24,7 @@ fn rustfmt(src: &Path, rustfmt: &Path, paths: &[PathBuf], check: bool) -> impl F
2424 cmd. args ( paths) ;
2525 let cmd_debug = format ! ( "{cmd:?}" ) ;
2626 let mut cmd = cmd. spawn ( ) . expect ( "running rustfmt" ) ;
27- // poor man's async: return a closure that'll wait for rustfmt's completion
27+ // Poor man's async: return a closure that'll wait for rustfmt's completion.
2828 move |block : bool | -> bool {
2929 if !block {
3030 match cmd. try_wait ( ) {
@@ -72,7 +72,7 @@ fn verify_rustfmt_version(build: &Builder<'_>) -> bool {
7272 !program_out_of_date ( & stamp_file, & version)
7373}
7474
75- /// Updates the last rustfmt version used
75+ /// Updates the last rustfmt version used.
7676fn update_rustfmt_version ( build : & Builder < ' _ > ) {
7777 let Some ( ( version, stamp_file) ) = get_rustfmt_version ( build) else {
7878 return ;
@@ -115,8 +115,15 @@ pub fn format(build: &Builder<'_>, check: bool, paths: &[PathBuf]) {
115115 let rustfmt_config: RustfmtConfig = t ! ( toml:: from_str( & rustfmt_config) ) ;
116116 let mut fmt_override = ignore:: overrides:: OverrideBuilder :: new ( & build. src ) ;
117117 for ignore in rustfmt_config. ignore {
118- if let Some ( ignore) = ignore. strip_prefix ( '!' ) {
119- fmt_override. add ( ignore) . expect ( ignore) ;
118+ if ignore. starts_with ( '!' ) {
119+ // A `!`-prefixed entry could be added as a whitelisted entry in `fmt_override`, i.e.
120+ // strip the `!` prefix. But as soon as whitelisted entries are added, an
121+ // `OverrideBuilder` will only traverse those whitelisted entries, and won't traverse
122+ // any files that aren't explicitly mentioned. No bueno! Maybe there's a way to combine
123+ // explicit whitelisted entries and traversal of unmentioned files, but for now just
124+ // forbid such entries.
125+ eprintln ! ( "`!`-prefixed entries are not supported in rustfmt.toml, sorry" ) ;
126+ crate :: exit!( 1 ) ;
120127 } else {
121128 fmt_override. add ( & format ! ( "!{ignore}" ) ) . expect ( & ignore) ;
122129 }
@@ -168,9 +175,10 @@ pub fn format(build: &Builder<'_>, check: bool, paths: &[PathBuf]) {
168175 untracked_count += 1 ;
169176 fmt_override. add ( & format ! ( "!/{untracked_path}" ) ) . expect ( untracked_path) ;
170177 }
171- // Only check modified files locally to speed up runtime.
172- // We still check all files in CI to avoid bugs in `get_modified_rs_files` letting regressions slip through;
173- // we also care about CI time less since this is still very fast compared to building the compiler.
178+ // Only check modified files locally to speed up runtime. We still check all files in
179+ // CI to avoid bugs in `get_modified_rs_files` letting regressions slip through; we
180+ // also care about CI time less since this is still very fast compared to building the
181+ // compiler.
174182 if !CiEnv :: is_ci ( ) && paths. is_empty ( ) {
175183 match get_modified_rs_files ( build) {
176184 Ok ( Some ( files) ) => {
@@ -275,21 +283,23 @@ pub fn format(build: &Builder<'_>, check: bool, paths: &[PathBuf]) {
275283 . overrides ( fmt_override)
276284 . build_parallel ( ) ;
277285
278- // there is a lot of blocking involved in spawning a child process and reading files to format.
279- // spawn more processes than available concurrency to keep the CPU busy
286+ // There is a lot of blocking involved in spawning a child process and reading files to format.
287+ // Spawn more processes than available concurrency to keep the CPU busy.
280288 let max_processes = build. jobs ( ) as usize * 2 ;
281289
282- // spawn child processes on a separate thread so we can batch entries we have received from ignore
290+ // Spawn child processes on a separate thread so we can batch entries we have received from
291+ // ignore.
283292 let thread = std:: thread:: spawn ( move || {
284293 let mut children = VecDeque :: new ( ) ;
285294 while let Ok ( path) = rx. recv ( ) {
286- // try getting more paths from the channel to amortize the overhead of spawning processes
295+ // Try getting more paths from the channel to amortize the overhead of spawning
296+ // processes.
287297 let paths: Vec < _ > = rx. try_iter ( ) . take ( 63 ) . chain ( std:: iter:: once ( path) ) . collect ( ) ;
288298
289299 let child = rustfmt ( & src, & rustfmt_path, paths. as_slice ( ) , check) ;
290300 children. push_back ( child) ;
291301
292- // poll completion before waiting
302+ // Poll completion before waiting.
293303 for i in ( 0 ..children. len ( ) ) . rev ( ) {
294304 if children[ i] ( false ) {
295305 children. swap_remove_back ( i) ;
@@ -298,12 +308,12 @@ pub fn format(build: &Builder<'_>, check: bool, paths: &[PathBuf]) {
298308 }
299309
300310 if children. len ( ) >= max_processes {
301- // await oldest child
311+ // Await oldest child.
302312 children. pop_front ( ) . unwrap ( ) ( true ) ;
303313 }
304314 }
305315
306- // await remaining children
316+ // Await remaining children.
307317 for mut child in children {
308318 child ( true ) ;
309319 }
0 commit comments