From f4d251fbbe673ba5d68d6c165c146265c276f114 Mon Sep 17 00:00:00 2001 From: Anthony Sottile Date: Wed, 4 Feb 2015 18:50:52 -0800 Subject: [PATCH] Quote args in venv'd languages --- pre_commit/languages/helpers.py | 5 ++++- requirements-dev.txt | 1 + tests/repository_test.py | 20 +++++++++++++++++++- 3 files changed, 24 insertions(+), 2 deletions(-) diff --git a/pre_commit/languages/helpers.py b/pre_commit/languages/helpers.py index 4ce06404..e854d180 100644 --- a/pre_commit/languages/helpers.py +++ b/pre_commit/languages/helpers.py @@ -1,13 +1,16 @@ from __future__ import unicode_literals +import pipes + def file_args_to_stdin(file_args): return '\0'.join(list(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']] + hook['args']), + ' '.join(['xargs', '-0', hook['entry']] + quoted_args), stdin=file_args_to_stdin(file_args), retcode=None, ) diff --git a/requirements-dev.txt b/requirements-dev.txt index 27aa358b..17613a38 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -1,5 +1,6 @@ -e . +astroid<1.3.3 coverage flake8 mock diff --git a/tests/repository_test.py b/tests/repository_test.py index 2e4d89bc..42bdafe9 100644 --- a/tests/repository_test.py +++ b/tests/repository_test.py @@ -27,9 +27,10 @@ def _test_hook_repo( args, expected, expected_return_code=0, + config_kwargs=None ): path = make_repo(tmpdir_factory, repo_path) - config = make_config_from_repo(path) + config = make_config_from_repo(path, **(config_kwargs or {})) repo = Repository.create(config, store) hook_dict = [ hook for repo_hook_id, hook in repo.hooks if repo_hook_id == hook_id @@ -47,6 +48,23 @@ def test_python_hook(tmpdir_factory, store): ) +@pytest.mark.integration +def test_python_hook_args_with_spaces(tmpdir_factory, store): + _test_hook_repo( + tmpdir_factory, store, 'python_hooks_repo', + 'foo', + [], + "['i have spaces', 'and\"\\'quotes', '$and !this']\n" + 'Hello World\n', + config_kwargs={ + 'hooks': [{ + 'id': 'foo', + 'args': ['i have spaces', 'and"\'quotes', '$and !this'], + }] + }, + ) + + @pytest.mark.integration def test_versioned_python_hook(tmpdir_factory, store): _test_hook_repo(