Generalize file ensuring infrastructure

This commit is contained in:
Aleksey Kladov 2021-03-08 17:20:36 +03:00
parent 0f6f458cc1
commit b6ba0dec0c
2 changed files with 38 additions and 6 deletions

View file

@ -14,7 +14,7 @@ mod fixture;
use std::{
convert::{TryFrom, TryInto},
env, fs,
path::PathBuf,
path::{Path, PathBuf},
};
use profile::StopWatch;
@ -353,3 +353,36 @@ pub fn bench(label: &'static str) -> impl Drop {
Bencher { sw: StopWatch::start(), label }
}
/// Checks that the `file` has the specified `contents`. If that is not the
/// case, updates the file and then fails the test.
pub fn ensure_file_contents(file: &Path, contents: &str) {
if let Err(()) = try_ensure_file_contents(file, contents) {
panic!("Some files were not up-to-date");
}
}
/// Checks that the `file` has the specified `contents`. If that is not the
/// case, updates the file and return an Error.
pub fn try_ensure_file_contents(file: &Path, contents: &str) -> Result<(), ()> {
match std::fs::read_to_string(file) {
Ok(old_contents) if normalize_newlines(&old_contents) == normalize_newlines(contents) => {
return Ok(())
}
_ => (),
}
let display_path = file.strip_prefix(&project_dir()).unwrap_or(file);
eprintln!(
"\n\x1b[31;1merror\x1b[0m: {} was not up-to-date, updating\n",
display_path.display()
);
if let Some(parent) = file.parent() {
let _ = std::fs::create_dir_all(parent);
}
std::fs::write(file, contents).unwrap();
Err(())
}
fn normalize_newlines(s: &str) -> String {
s.replace("\r\n", "\n")
}