Limit xargs line length. Resolves #205.

This commit is contained in:
Anthony Sottile
2015-02-27 15:13:22 -08:00
parent 52c2d9c35a
commit 3bf852f46a
2 changed files with 32 additions and 1 deletions

View File

@@ -10,7 +10,9 @@ def file_args_to_stdin(file_args):
def run_hook(env, hook, file_args):
quoted_args = [pipes.quote(arg) for arg in hook['args']]
return env.run(
' '.join(['xargs', '-0', hook['entry']] + quoted_args),
# Use -s 4000 (slightly less than posix mandated minimum)
# This is to prevent "xargs: ... Bad file number" on windows
' '.join(['xargs', '-0', '-s4000', hook['entry']] + quoted_args),
stdin=file_args_to_stdin(file_args),
retcode=None,
)

View File

@@ -305,3 +305,32 @@ def test_get_changed_files():
'3387edbb1288a580b37fe25225aa0b856b18ad1a',
)
assert files == ['CHANGELOG.md', 'setup.py']
def test_lots_of_files(mock_out_store_directory, tmpdir_factory):
# windows xargs seems to have a bug, here's a regression test for
# our workaround
git_path = make_consuming_repo(tmpdir_factory, 'python_hooks_repo')
with cwd(git_path):
# Override files so we run against them
with io.open(
'.pre-commit-config.yaml', 'a+',
) as config_file:
config_file.write(' files: ""\n')
# Write a crap ton of files
for i in range(400):
filename = '{0}{1}'.format('a' * 100, i)
open(filename, 'w').close()
cmd_output('bash', '-c', 'git add .')
install(Runner(git_path))
# Don't want to write to home directory
env = dict(os.environ, **{'PRE_COMMIT_HOME': tmpdir_factory.get()})
cmd_output(
'git', 'commit', '-m', 'Commit!',
# git commit puts pre-commit to stderr
stderr=subprocess.STDOUT,
env=env,
)