From 380d6ebd62bda95a3d9edda512fb62bfc81ed32c Mon Sep 17 00:00:00 2001 From: Chris Bookholt Date: Fri, 3 Jul 2026 19:53:49 -0700 Subject: [PATCH] test(git): respect Windows repository handle pinning --- codex-rs/git-utils/src/git_command_tests.rs | 24 ++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/codex-rs/git-utils/src/git_command_tests.rs b/codex-rs/git-utils/src/git_command_tests.rs index 8f161e12be..8113d2478e 100644 --- a/codex-rs/git-utils/src/git_command_tests.rs +++ b/codex-rs/git-utils/src/git_command_tests.rs @@ -1514,7 +1514,7 @@ fn active_commondir_route_is_revalidated_before_every_child() { ); } -#[cfg(any(unix, windows))] +#[cfg(unix)] #[test] fn active_worktree_identity_is_revalidated_before_every_child() { let fixture = tempfile::tempdir().expect("fixture"); @@ -1554,6 +1554,28 @@ fn active_worktree_identity_is_revalidated_before_every_child() { ); } +#[cfg(windows)] +#[test] +fn active_worktree_identity_pins_repository_for_runner_lifetime() { + let fixture = tempfile::tempdir().expect("fixture"); + let root = fixture.path().join("repo"); + let moved_root = fixture.path().join("repo-moved"); + std::fs::create_dir_all(&root).expect("create repository"); + run_git(&root, &["init", "-q"]); + let runner = GitRunner::for_cwd(&root).expect("runner for original repository"); + + let error = std::fs::rename(&root, &moved_root) + .expect_err("live repository identity handle must block replacement"); + assert_eq!(error.kind(), io::ErrorKind::PermissionDenied, "{error}"); + assert!(root.join(".git").is_dir()); + assert!(!moved_root.exists()); + + drop(runner); + std::fs::rename(&root, &moved_root).expect("released identity handle must allow move"); + assert!(!root.exists()); + assert!(moved_root.join(".git").is_dir()); +} + #[cfg(unix)] #[test] fn direct_external_separate_git_dir_absolute_and_relative_routes_execute_git() {