use crate::bare::GitBare; use crate::error::GitResult; use crate::pb::{FsckRequest, FsckResponse}; impl GitBare { pub fn fsck(&self, request: FsckRequest) -> GitResult { let mut args = vec![ "--git-dir".to_string(), self.bare_dir.to_string_lossy().into_owned(), "fsck".to_string(), ]; if request.strict { args.push("--strict".into()); } if request.connectivity_only { args.push("--connectivity-only".into()); } let result = duct::cmd("git", &args) .stdout_capture() .stderr_capture() .unchecked() .run()?; let stdout = String::from_utf8_lossy(&result.stdout); let stderr = String::from_utf8_lossy(&result.stderr); let ok = result.status.success(); let mut errors = Vec::new(); let mut warnings = Vec::new(); for line in stdout.lines().chain(stderr.lines()) { if line.contains("error:") || line.contains("fatal:") { errors.push( line.trim_start_matches("error: ") .trim_start_matches("fatal: ") .to_string(), ); } else if line.contains("warning:") { warnings.push(line.trim_start_matches("warning: ").to_string()); } } Ok(FsckResponse { ok, errors, warnings, }) } }