Ignore configured hooks in git helpers (#22843)

## What
- Internal Git helper commands now ignore configured hook directories
during repository bookkeeping.

## Why
- These helper flows should stay consistent even when a repository has
hook-directory configuration of its own.

## How
- Pass a command-local `core.hooksPath` override in the shared helper
path and the Git-info helper path.
- Add regressions for the baseline index rewrite flow and the metadata
status flow.

## Validation
- `cargo fmt --manifest-path
/Users/bookholt/code/codex/codex-rs/Cargo.toml --all --check`
- `cargo test --manifest-path
/Users/bookholt/code/codex/codex-rs/Cargo.toml -p codex-git-utils`
- `cargo test --manifest-path
/Users/bookholt/code/codex/codex-rs/Cargo.toml -p codex-core
test_get_has_changes_`
This commit is contained in:
Chris Bookholt
2026-05-15 10:07:54 -07:00
committed by GitHub
Unverified
parent 7fa0007ea8
commit 9facdccb37
4 changed files with 100 additions and 1 deletions
+44
View File
@@ -379,6 +379,50 @@ async fn test_get_has_changes_ignores_repo_fsmonitor_config() {
);
}
#[cfg(unix)]
#[tokio::test]
async fn test_get_has_changes_ignores_configured_hooks_path() {
let temp_dir = TempDir::new().expect("Failed to create temp dir");
let repo_path = create_test_git_repo(&temp_dir).await;
let hooks_dir = repo_path.join(".git/hooks-path-test");
let hook_path = hooks_dir.join("post-index-change");
let marker_path = repo_path.join("hook-ran");
fs::create_dir_all(&hooks_dir).expect("create hook dir");
fs::write(
&hook_path,
format!(
"#!/bin/sh\nprintf ran > \"{}\"\n",
marker_path.to_string_lossy()
),
)
.expect("write post-index-change hook");
let mut permissions = fs::metadata(&hook_path)
.expect("read hook metadata")
.permissions();
permissions.set_mode(0o755);
fs::set_permissions(&hook_path, permissions).expect("mark hook executable");
Command::new("git")
.args([
"config",
"core.hooksPath",
hooks_dir.to_string_lossy().as_ref(),
])
.current_dir(&repo_path)
.output()
.await
.expect("configure hooks path");
fs::write(repo_path.join("test.txt"), "test content").expect("refresh tracked file");
assert_eq!(get_has_changes(&repo_path).await, Some(false));
assert!(
!marker_path.exists(),
"metadata collection should not invoke configured hook directories"
);
}
#[tokio::test]
async fn test_get_git_working_tree_state_clean_repo() {
let temp_dir = TempDir::new().expect("Failed to create temp dir");