Avoid loading files for cached format results (#8134)

This commit is contained in:
Micha Reiser 2023-10-23 20:29:13 +09:00 committed by GitHub
parent 08519e22e4
commit 6199590072
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 31 additions and 25 deletions

View file

@ -131,18 +131,6 @@ pub(crate) fn format(
return None;
}
// Extract the sources from the file.
let unformatted = match SourceKind::from_path(path, source_type) {
Ok(Some(source_kind)) => source_kind,
Ok(None) => return None,
Err(err) => {
return Some(Err(FormatCommandError::Read(
Some(path.to_path_buf()),
err,
)));
}
};
let package = path
.parent()
.and_then(|parent| package_roots.get(parent).copied())
@ -155,7 +143,6 @@ pub(crate) fn format(
format_path(
path,
&resolved_settings.formatter,
&unformatted,
source_type,
mode,
cache,
@ -163,7 +150,6 @@ pub(crate) fn format(
}) {
Ok(inner) => inner.map(|result| FormatPathResult {
path: resolved_file.path().to_path_buf(),
unformatted,
result,
}),
Err(error) => Err(FormatCommandError::Panic(
@ -260,7 +246,6 @@ pub(crate) fn format(
pub(crate) fn format_path(
path: &Path,
settings: &FormatterSettings,
unformatted: &SourceKind,
source_type: PySourceType,
mode: FormatMode,
cache: Option<&Cache>,
@ -277,8 +262,18 @@ pub(crate) fn format_path(
}
}
// Extract the sources from the file.
let unformatted = match SourceKind::from_path(path, source_type) {
Ok(Some(source_kind)) => source_kind,
// Non Python Jupyter notebook
Ok(None) => return Ok(FormatResult::Skipped),
Err(err) => {
return Err(FormatCommandError::Read(Some(path.to_path_buf()), err));
}
};
// Format the source.
let format_result = match format_source(unformatted, source_type, Some(path), settings)? {
let format_result = match format_source(&unformatted, source_type, Some(path), settings)? {
FormattedSource::Formatted(formatted) => match mode {
FormatMode::Write => {
let mut writer = File::create(path).map_err(|err| {
@ -300,7 +295,10 @@ pub(crate) fn format_path(
FormatResult::Formatted
}
FormatMode::Check => FormatResult::Formatted,
FormatMode::Diff => FormatResult::Diff(formatted),
FormatMode::Diff => FormatResult::Diff {
unformatted,
formatted,
},
},
FormattedSource::Unchanged => {
if let Some(cache) = cache {
@ -432,16 +430,21 @@ pub(crate) enum FormatResult {
/// The file was formatted.
Formatted,
/// The file was formatted, [`SourceKind`] contains the formatted code
Diff(SourceKind),
Diff {
unformatted: SourceKind,
formatted: SourceKind,
},
/// The file was unchanged, as the formatted contents matched the existing contents.
Unchanged,
/// Skipped formatting because its an unformatted file format
Skipped,
}
/// The coupling of a [`FormatResult`] with the path of the file that was analyzed.
#[derive(Debug)]
struct FormatPathResult {
path: PathBuf,
unformatted: SourceKind,
result: FormatResult,
}
@ -463,15 +466,19 @@ impl<'a> FormatResults<'a> {
fn any_formatted(&self) -> bool {
self.results.iter().any(|result| match result.result {
FormatResult::Formatted | FormatResult::Diff { .. } => true,
FormatResult::Unchanged => false,
FormatResult::Unchanged | FormatResult::Skipped => false,
})
}
fn write_diff(&self, f: &mut impl Write) -> io::Result<()> {
for result in self.results {
if let FormatResult::Diff(formatted) = &result.result {
if let FormatResult::Diff {
unformatted,
formatted,
} = &result.result
{
let text_diff =
TextDiff::from_lines(result.unformatted.source_code(), formatted.source_code());
TextDiff::from_lines(unformatted.source_code(), formatted.source_code());
let mut unified_diff = text_diff.unified_diff();
unified_diff.header(
&fs::relativize_path(&result.path),
@ -502,9 +509,10 @@ impl<'a> FormatResults<'a> {
changed += 1;
}
FormatResult::Unchanged => unchanged += 1,
FormatResult::Diff(_) => {
FormatResult::Diff { .. } => {
changed += 1;
}
FormatResult::Skipped => {}
}
}