From: CaselIT Date: Tue, 11 May 2021 18:17:00 +0000 (+0200) Subject: Fixed a bug where paths defined in post-write hook options X-Git-Tag: rel_1_6_3~5 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b729cbbce1fc643557e7d68b31b77090dab082a5;p=thirdparty%2Fsqlalchemy%2Falembic.git Fixed a bug where paths defined in post-write hook options would be wrongly escaped in non posix environment (Windows). Fixes: #841 Change-Id: Ife74d9291523378da113c259e3c173a8bc054e47 --- diff --git a/alembic/script/write_hooks.py b/alembic/script/write_hooks.py index 133bf046..c69ce5a4 100644 --- a/alembic/script/write_hooks.py +++ b/alembic/script/write_hooks.py @@ -99,7 +99,9 @@ def _parse_cmdline_options(cmdline_options_str, path): """ if REVISION_SCRIPT_TOKEN not in cmdline_options_str: cmdline_options_str = REVISION_SCRIPT_TOKEN + " " + cmdline_options_str - cmdline_options_list = shlex.split(cmdline_options_str) + cmdline_options_list = shlex.split( + cmdline_options_str, posix=compat.is_posix + ) cmdline_options_list = [ option.replace(REVISION_SCRIPT_TOKEN, path) for option in cmdline_options_list diff --git a/alembic/util/compat.py b/alembic/util/compat.py index c8919b62..a4433d0b 100644 --- a/alembic/util/compat.py +++ b/alembic/util/compat.py @@ -1,11 +1,13 @@ import collections import inspect import io +import os import sys py2k = sys.version_info.major < 3 py3k = sys.version_info.major >= 3 py36 = sys.version_info >= (3, 6) +is_posix = os.name == "posix" ArgSpec = collections.namedtuple( diff --git a/docs/build/unreleased/841.rst b/docs/build/unreleased/841.rst new file mode 100644 index 00000000..294e5430 --- /dev/null +++ b/docs/build/unreleased/841.rst @@ -0,0 +1,6 @@ +.. change:: + :tags: bug, autogenerate + :tickets: 839 + + Fixed a bug where paths defined in post-write hook options + would be wrongly escaped in non posix environment (Windows). \ No newline at end of file diff --git a/tests/test_post_write.py b/tests/test_post_write.py index 9beb1f6a..18c1d82c 100644 --- a/tests/test_post_write.py +++ b/tests/test_post_write.py @@ -1,15 +1,19 @@ +import os import sys from alembic import command from alembic import util from alembic.script import write_hooks from alembic.testing import assert_raises_message +from alembic.testing import combinations from alembic.testing import eq_ from alembic.testing import mock from alembic.testing import TestBase +from alembic.testing.env import _get_staging_directory from alembic.testing.env import _no_sql_testing_config from alembic.testing.env import clear_staging_env from alembic.testing.env import staging_env +from alembic.util import compat class HookTest(TestBase): @@ -171,7 +175,9 @@ black.options = -l 79 input_config, expected_additional_arguments_fn ) - def test_filename_interpolation(self): + @combinations(True, False) + def test_filename_interpolation(self, posix): + input_config = """ [post_write_hooks] hooks = black @@ -182,7 +188,43 @@ black.options = arg1 REVISION_SCRIPT_FILENAME 'multi-word arg' \ """ def expected_additional_arguments_fn(rev_path): - return ["arg1", rev_path, "multi-word arg", "--flag1=" + rev_path] + if compat.is_posix: + return [ + "arg1", + rev_path, + "multi-word arg", + "--flag1=" + rev_path, + ] + else: + return [ + "arg1", + rev_path, + "'multi-word arg'", + "--flag1='%s'" % rev_path, + ] + + with mock.patch("alembic.util.compat.is_posix", posix): + self._run_black_with_config( + input_config, expected_additional_arguments_fn + ) + + def test_path_in_config(self): + + input_config = """ +[post_write_hooks] +hooks = black +black.type = console_scripts +black.entrypoint = black +black.options = arg1 REVISION_SCRIPT_FILENAME --config %(here)s/pyproject.toml + """ + + def expected_additional_arguments_fn(rev_path): + return [ + "arg1", + rev_path, + "--config", + os.path.abspath(_get_staging_directory()) + "/pyproject.toml", + ] self._run_black_with_config( input_config, expected_additional_arguments_fn