-
Notifications
You must be signed in to change notification settings - Fork 1.8k
fix: ensure rustfmt
runs when configured with ./
#15600
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 1 commit
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -4,6 +4,7 @@ | |
use std::{ | ||
fs, | ||
io::Write as _, | ||
path::PathBuf, | ||
process::{self, Stdio}, | ||
}; | ||
|
||
|
@@ -1995,14 +1996,52 @@ fn run_rustfmt( | |
cmd | ||
} | ||
RustfmtConfig::CustomCommand { command, args } => { | ||
let mut cmd = process::Command::new(command); | ||
let cmd = PathBuf::from(&command); | ||
let mut components = cmd.components(); | ||
|
||
// to support rustc's suggested, default configuration | ||
let mut cmd = match components.next() { | ||
Some(std::path::Component::CurDir) => { | ||
let rest = components.as_path(); | ||
|
||
let roots = snap | ||
.workspaces | ||
.iter() | ||
.flat_map(|ws| ws.workspace_definition_path()) | ||
.collect::<Vec<&AbsPath>>(); | ||
|
||
let abs: Option<AbsPathBuf> = roots.into_iter().find_map(|base| { | ||
let abs = base.join(rest); | ||
std::fs::metadata(&abs).ok().map(|_| abs) | ||
}); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I'm not a fan of this approach, but I can't find a better way to determine what workspace a There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Take a look at |
||
|
||
let command = match abs { | ||
Some(cmd) => cmd, | ||
None => { | ||
tracing::error!( | ||
rustfmt = ?command, | ||
"Unable to make the format command an absolute path" | ||
); | ||
anyhow::bail!( | ||
"Unable to make the format command an absolute path: {}", | ||
command | ||
); | ||
} | ||
}; | ||
|
||
process::Command::new(&command.as_os_str()) | ||
} | ||
_ => process::Command::new(command), | ||
}; | ||
|
||
cmd.envs(snap.config.extra_env()); | ||
cmd.args(args); | ||
cmd | ||
} | ||
}; | ||
|
||
tracing::debug!(?command, "created format command"); | ||
|
||
// try to chdir to the file so we can respect `rustfmt.toml` | ||
// FIXME: use `rustfmt --config-path` once | ||
// https://github.com/rust-lang/rustfmt/issues/4660 gets fixed | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This should probably work with
build/host/rustfmt
as well; special-casing the leading./
sounds very fragile.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ye, we can just Path::join the rustfmt path onto the base here. If the path is absolute it'll replace the base, otherwise it"ll append which is exactly the semantics we want to have here.