Skip to content

Commit

Permalink
Merge pull request #2743 from adamchainz/issue_2742
Browse files Browse the repository at this point in the history
Add `--no-textconv` to `git diff` calls
  • Loading branch information
asottile committed Feb 3, 2023
2 parents e846829 + 7783a3e commit cc7bf96
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 3 deletions.
6 changes: 3 additions & 3 deletions pre_commit/commands/run.py
Original file line number Diff line number Diff line change
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
41 changes: 41 additions & 0 deletions tests/commands/run_test.py
Original file line number Diff line number Diff line change
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 = "true"\n')

config = {
'repo': 'local',
'hooks': [
{
'id': 'extend-jpeg',
'name': 'extend-jpeg',
'language': 'system',
'entry': (
f'{shlex.quote(sys.executable)} -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 cc7bf96

Please sign in to comment.