From 3bf852f46a7c65d484d7c2b989cbedefe75213ad Mon Sep 17 00:00:00 2001 From: Anthony Sottile Date: Fri, 27 Feb 2015 15:13:22 -0800 Subject: [PATCH] Limit xargs line length. Resolves #205. --- pre_commit/languages/helpers.py | 4 +++- tests/commands/run_test.py | 29 +++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/pre_commit/languages/helpers.py b/pre_commit/languages/helpers.py index e854d180..ff46acc4 100644 --- a/pre_commit/languages/helpers.py +++ b/pre_commit/languages/helpers.py @@ -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, ) diff --git a/tests/commands/run_test.py b/tests/commands/run_test.py index a245dfb3..9cca610a 100644 --- a/tests/commands/run_test.py +++ b/tests/commands/run_test.py @@ -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, + )