Windows: Large number of files causes `xargs: ... Bad file number`
Originally here: https://github.com/pre-commit/pre-commit-hooks/issues/41

diff --git a/pre_commit/languages/helpers.py b/pre_commit/languages/helpers.py
index e854d18..ff46acc 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 a245dfb..9cca610 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,
+        )
['tests/commands/run_test.py', 'pre_commit/languages/helpers.py']