Skip to content

Commit

Permalink
Add --no-textconv to git diff calls
Browse files Browse the repository at this point in the history
  • Loading branch information
adamchainz committed Feb 2, 2023
1 parent e846829 commit adf2223
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 5 deletions.
6 changes: 3 additions & 3 deletions pre_commit/commands/run.py
Expand Up @@ -272,7 +272,8 @@ def _all_filenames(args: argparse.Namespace) -> Collection[str]:

def _get_diff() -> bytes:
_, out, _ = cmd_output_b(
'git', 'diff', '--no-ext-diff', '--ignore-submodules', check=False,
'git', 'diff', '--no-ext-diff', '--no-textconv', '--ignore-submodules',
check=False,
)
return out

Expand Down Expand Up @@ -326,8 +327,7 @@ def _has_unmerged_paths() -> bool:

def _has_unstaged_config(config_file: str) -> bool:
retcode, _, _ = cmd_output_b(
'git', 'diff', '--no-ext-diff', '--exit-code', config_file,
check=False,
'git', 'diff', '--quiet', '--no-ext-diff', config_file, check=False,
)
# be explicit, other git errors don't mean it has an unstaged config.
return retcode == 1
Expand Down
4 changes: 2 additions & 2 deletions pre_commit/staged_files_only.py
Expand Up @@ -51,8 +51,8 @@ def _unstaged_changes_cleared(patch_dir: str) -> Generator[None, None, None]:
tree = cmd_output('git', 'write-tree')[1].strip()
retcode, diff_stdout_binary, _ = cmd_output_b(
'git', 'diff-index', '--ignore-submodules', '--binary',
'--exit-code', '--no-color', '--no-ext-diff', tree, '--',
check=False,
'--exit-code', '--no-color', '--no-ext-diff', '--no-textconv', tree,
'--', check=False,
)
if retcode and diff_stdout_binary.strip():
patch_filename = f'patch{int(time.time())}-{os.getpid()}'
Expand Down
41 changes: 41 additions & 0 deletions tests/commands/run_test.py
Expand Up @@ -766,6 +766,47 @@ def test_lots_of_files(store, tempdir_factory):
)


def test_no_textconv(cap_out, store, repo_with_passing_hook):
# git textconv filters can hide changes from hooks
with open('.gitattributes', 'w') as fp:
fp.write('*.jpeg diff=empty\n')

with open('.git/config', 'a') as fp:
fp.write('[diff "empty"]\n')
fp.write('textconv = "python -c print()"\n')

config = {
'repo': 'local',
'hooks': [
{
'id': 'extend-jpeg',
'name': 'extend-jpeg',
'language': 'system',
'entry': (
'python -c "import sys; '
'open(sys.argv[1], \'ab\').write(b\'\\x00\')"'
),
'types': ['jpeg'],
},
],
}
add_config_to_repo(repo_with_passing_hook, config)

stage_a_file('example.jpeg')

_test_run(
cap_out,
store,
repo_with_passing_hook,
{},
(
b'Failed',
),
expected_ret=1,
stage=False,
)


def test_stages(cap_out, store, repo_with_passing_hook):
config = {
'repo': 'local',
Expand Down

0 comments on commit adf2223

Please sign in to comment.