use std::os::unix::process::ExitStatusExt;
use std::path::Path;
use super::{WorktreeRemoval, remove_registered_worktree};
use crate::session_manager::worktree_git_fixture::GitWorktreeFixture;
use crate::session_manager::worktree_removal_integrity::content_count;
use crate::session_manager::worktree_safety::DirtyWorktreePolicy;
#[test]
fn a_git_failure_after_a_partial_delete_is_reported_as_partially_removed() {
let fx = GitWorktreeFixture::new();
let wt = fx.add_worktree("partial-8782");
for name in ["a.rs", "b.rs", "c.rs"] {
std::fs::write(wt.join(name), "// work\n").expect("write");
}
let before = content_count(&wt);
let stub = |_root: &Path| {
std::fs::remove_file(wt.join("a.rs")).expect("stub delete a.rs");
std::fs::remove_file(wt.join("b.rs")).expect("stub delete b.rs");
Ok(std::process::Output {
status: std::process::ExitStatus::from_raw(128 << 8),
stdout: Vec::new(),
stderr: b"error: failed to delete 'c.rs': Permission denied".to_vec(),
})
};
let outcome = remove_registered_worktree(&wt, DirtyWorktreePolicy::Skip, before, &stub);
let WorktreeRemoval::PartiallyRemoved(report) = &outcome else {
panic!("a partial delete was reported as {outcome:?}");
};
assert!(report.contains("partially removed"), "{report}");
assert!(
report.contains("failed to delete 'c.rs'"),
"git's error: {report}"
);
for word in ["kept", "preserved", "declined"] {
assert!(!report.contains(word), "reads as kept ({word}): {report}");
}
assert!(
wt.join("c.rs").exists(),
"nothing more is deleted after git fails"
);
}