#![forbid(unsafe_code)]
use std::path::PathBuf;
use crate::fsck::{FsckOptions, fsck};
#[derive(Debug, Clone, clap::Args)]
pub struct FsckArgs {
#[arg(value_name = "STORE")]
pub store: PathBuf,
#[arg(long)]
pub repair: bool,
}
#[derive(Debug, Clone, clap::Args)]
pub struct ScrubArgs {
#[arg(value_name = "STORE")]
pub store: PathBuf,
#[arg(long)]
pub repair: bool,
}
pub fn run_fsck(args: &FsckArgs) -> Result<(), String> {
crate::fsck::ensure_unmounted(&args.store)?;
let options = FsckOptions {
repair_torn_tails: args.repair,
..Default::default()
};
let report = fsck(&args.store, &options).map_err(|e| e.to_string())?;
print!("{}", report.render());
if report.is_clean() {
println!("fsck: OK");
Ok(())
} else {
println!(
"fsck: {} errors, {} warnings",
report.error_count(),
report.warning_count()
);
Err("fsck found issues".into())
}
}
pub fn run_scrub(args: &ScrubArgs) -> Result<(), String> {
crate::fsck::ensure_unmounted(&args.store)?;
let options = FsckOptions {
verify_materialized: true,
repair_torn_tails: args.repair,
..Default::default()
};
let report = fsck(&args.store, &options).map_err(|e| e.to_string())?;
print!("{}", report.render());
if report.is_clean() {
println!("scrub: OK");
Ok(())
} else {
println!(
"scrub: {} errors, {} warnings",
report.error_count(),
report.warning_count()
);
Err("scrub found issues".into())
}
}