aboutsummaryrefslogtreecommitdiff
path: root/src/workspace/git/config_tests.rs
diff options
context:
space:
mode:
authorJJ Liebig <jonathan.liebig@gmail.com>2026-08-12 03:14:59 +0200
committerGitHub <noreply@github.com>2026-08-12 04:14:59 +0300
commit5600197f00e871764465d4e3d9ba5e6aa6fd9547 (patch)
tree26fd7ddb5f784f39aa4bec98735c316331cef211 /src/workspace/git/config_tests.rs
parent3f752a72fdd073d875cf941e3049f9860e30d841 (diff)
perf: avoid repeated Git config reads (#2688)
refs #2643 Co-authored-by: Can Celik <ogulcancelik@gmail.com>
Diffstat (limited to 'src/workspace/git/config_tests.rs')
-rw-r--r--src/workspace/git/config_tests.rs55
1 files changed, 50 insertions, 5 deletions
diff --git a/src/workspace/git/config_tests.rs b/src/workspace/git/config_tests.rs
index e789e1db..d098f664 100644
--- a/src/workspace/git/config_tests.rs
+++ b/src/workspace/git/config_tests.rs
@@ -5,6 +5,41 @@ use crate::workspace::git::{
test_support::{temp_test_dir, write_fake_tracked_repo},
};
+#[cfg(unix)]
+#[test]
+fn config_symlink_retarget_invalidates_context() {
+ use std::os::unix::fs::symlink;
+
+ let root = temp_test_dir("config-symlink-retarget");
+ write_fake_tracked_repo(&root);
+ let alias = root.join("branch.cfg");
+ let first = root.join("first.cfg");
+ let second = root.join("second.cfg");
+ std::fs::write(&first, "").unwrap();
+ std::fs::write(&second, "").unwrap();
+ symlink(&first, &alias).unwrap();
+ let context = read_config_with_user_paths(
+ &git_worktree_info(&root).unwrap(),
+ "main",
+ vec![alias.clone()],
+ );
+ std::fs::remove_file(&alias).unwrap();
+ symlink(&second, &alias).unwrap();
+
+ assert!(!deps_current(&context.2));
+ std::fs::remove_dir_all(root).unwrap();
+}
+
+#[test]
+fn config_read_error_retries_next_refresh() {
+ let root = temp_test_dir("config-read-error");
+ write_fake_tracked_repo(&root);
+ std::fs::write(root.join(".git/config"), [0xff]).unwrap();
+ let context = read_config(&git_worktree_info(&root).unwrap(), "main");
+ assert!(!deps_current(&context.2));
+ std::fs::remove_dir_all(root).unwrap();
+}
+
#[test]
fn git_status_fingerprint_honors_remote_fetch_refspec() {
let root = temp_test_dir("custom-fetch-refspec");
@@ -74,7 +109,9 @@ fn git_status_branch_config_reads_user_config_before_repo_config() {
.unwrap();
let info = git_worktree_info(&root).unwrap();
- let config = read_branch_config_with_user_paths(&info, "main", vec![user_config]).unwrap();
+ let config = read_config_with_user_paths(&info, "main", vec![user_config])
+ .1
+ .unwrap();
assert_eq!(config.remote, "global");
assert_eq!(
@@ -97,7 +134,9 @@ fn git_status_branch_config_repo_config_overrides_user_config() {
.unwrap();
let info = git_worktree_info(&root).unwrap();
- let config = read_branch_config_with_user_paths(&info, "main", vec![user_config]).unwrap();
+ let config = read_config_with_user_paths(&info, "main", vec![user_config])
+ .1
+ .unwrap();
assert_eq!(config.remote, "origin");
assert_eq!(
@@ -475,7 +514,9 @@ fn git_status_fingerprint_matches_user_hasconfig_against_repo_remote_url() {
.unwrap();
let info = git_worktree_info(&root).unwrap();
- let config = read_branch_config_with_user_paths(&info, "main", vec![user_config]).unwrap();
+ let config = read_config_with_user_paths(&info, "main", vec![user_config])
+ .1
+ .unwrap();
assert_eq!(config.remote, "included");
assert_eq!(config.merge_ref, "refs/heads/main");
@@ -511,7 +552,9 @@ fn git_status_fingerprint_skips_hasconfig_include_that_defines_remote_url() {
.unwrap();
let info = git_worktree_info(&root).unwrap();
- let config = read_branch_config_with_user_paths(&info, "main", vec![user_config]).unwrap();
+ let config = read_config_with_user_paths(&info, "main", vec![user_config])
+ .1
+ .unwrap();
assert_eq!(config.remote, "origin");
assert_eq!(config.merge_ref, "refs/heads/main");
@@ -552,7 +595,9 @@ fn git_status_fingerprint_skips_hasconfig_include_chain_that_defines_remote_url(
.unwrap();
let info = git_worktree_info(&root).unwrap();
- let config = read_branch_config_with_user_paths(&info, "main", vec![user_config]).unwrap();
+ let config = read_config_with_user_paths(&info, "main", vec![user_config])
+ .1
+ .unwrap();
assert_eq!(config.remote, "origin");
assert_eq!(config.merge_ref, "refs/heads/main");