From 58667cc91bfa3cb9b3573e2c3b20606d587cf361 Mon Sep 17 00:00:00 2001 From: karlhillx Date: Fri, 12 Jun 2026 21:39:04 -0400 Subject: [PATCH 1/3] deduplicate filenames from git ls-files during conflicts pre-commit run --all-files lists conflicted paths multiple times because git ls-files -z returns one entry per stage for unmerged files. De-duplicated with dict.fromkeys to preserve order. Existing in_merge_conflict fixture covers the test. Fixes #3706 --- pre_commit/git.py | 3 ++- tests/git_test.py | 7 +++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/pre_commit/git.py b/pre_commit/git.py index ec1928f37..1161be575 100644 --- a/pre_commit/git.py +++ b/pre_commit/git.py @@ -152,7 +152,8 @@ def intent_to_add_files() -> list[str]: def get_all_files() -> list[str]: - return zsplit(cmd_output('git', 'ls-files', '-z')[1]) + # git ls-files lists unmerged paths once per stage -- deduplicate (#3706) + return list(dict.fromkeys(zsplit(cmd_output('git', 'ls-files', '-z')[1]))) def get_changed_files(old: str, new: str) -> list[str]: diff --git a/tests/git_test.py b/tests/git_test.py index 02b6ce3ae..a6392203a 100644 --- a/tests/git_test.py +++ b/tests/git_test.py @@ -225,6 +225,13 @@ def test_all_files_non_ascii(non_ascii_repo): assert ret == ['интервью'] +def test_all_files_deduplicates_in_merge_conflict(in_merge_conflict): + # git ls-files lists each unmerged path once per stage; #3706 + ret = git.get_all_files() + assert ret == ['conflict_file'] + + + def test_staged_files_non_ascii(non_ascii_repo): non_ascii_repo.join('интервью').write('hi') cmd_output('git', 'add', '.') From 8e612fd6516e5ea1ed3df33f9123e5ce7fc24060 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sat, 13 Jun 2026 01:39:33 +0000 Subject: [PATCH 2/3] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- tests/git_test.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/git_test.py b/tests/git_test.py index a6392203a..3543ad53a 100644 --- a/tests/git_test.py +++ b/tests/git_test.py @@ -231,7 +231,6 @@ def test_all_files_deduplicates_in_merge_conflict(in_merge_conflict): assert ret == ['conflict_file'] - def test_staged_files_non_ascii(non_ascii_repo): non_ascii_repo.join('интервью').write('hi') cmd_output('git', 'add', '.') From 80aa14e37b58194fc99c03ef611fa5da152442fc Mon Sep 17 00:00:00 2001 From: karlhillx Date: Fri, 12 Jun 2026 21:44:26 -0400 Subject: [PATCH 3/3] test: assert dedup property instead of exact file list --- tests/git_test.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/git_test.py b/tests/git_test.py index 3543ad53a..6658c4e4f 100644 --- a/tests/git_test.py +++ b/tests/git_test.py @@ -228,7 +228,9 @@ def test_all_files_non_ascii(non_ascii_repo): def test_all_files_deduplicates_in_merge_conflict(in_merge_conflict): # git ls-files lists each unmerged path once per stage; #3706 ret = git.get_all_files() - assert ret == ['conflict_file'] + # The fixture contains multiple tracked files; the bug is duplication + assert ret.count('conflict_file') == 1 + assert len(ret) == len(set(ret)) def test_staged_files_non_ascii(non_ascii_repo):