Files
@ b5b91e854308
Branch filter:
Location: kallithea/conftest.py - annotation
b5b91e854308
1.2 KiB
text/x-python
ssh: set a valid locale in the ssh-serve process
In the SSH client configuration, the setting 'SendEnv' could contain variables
like 'LANG', 'LC_ALL', and others. This causes these environment variables
(with their values at the client-side) to be set in the server. However, not
every locale setting valid in the client, is also valid on the server.
This could lead to the error:
'locale.Error: unsupported locale setting'
when 'from mercurial import archival, merge as hg_merge, patch, ui' is
called.
Fix this problem by providing an ini setting 'ssh_locale' that the user can
set correctly, and which will be used to set LC_ALL and LANGUAGE in the
'kallithea-cli ssh-serve' process.
If an environment variable LC_ALL is set, it takes precedence over all other
'LC_xxx' variables, as well as over LANG. So, setting LC_ALL ensures that no
user setting of 'LC_xxx' or 'LANG' could influence ssh-serve badly.
There is one environment variable that might overrule LC_ALL, specifically
for showing messages: 'LANGUAGE'. GNU gettext lets it take precedence over
LC_ALL [1]:
"GNU gettext gives preference to LANGUAGE over LC_ALL and LANG for the
purpose of message handling"
So, also set LANGUAGE to the same value as we set LC_ALL to.
The principle of setting a specific locale in the server process to fix this
error, was first proposed by Dominik Ruf.
[1] https://www.gnu.org/software/gettext/manual/html_node/The-LANGUAGE-variable.html#The-LANGUAGE-variable
In the SSH client configuration, the setting 'SendEnv' could contain variables
like 'LANG', 'LC_ALL', and others. This causes these environment variables
(with their values at the client-side) to be set in the server. However, not
every locale setting valid in the client, is also valid on the server.
This could lead to the error:
'locale.Error: unsupported locale setting'
when 'from mercurial import archival, merge as hg_merge, patch, ui' is
called.
Fix this problem by providing an ini setting 'ssh_locale' that the user can
set correctly, and which will be used to set LC_ALL and LANGUAGE in the
'kallithea-cli ssh-serve' process.
If an environment variable LC_ALL is set, it takes precedence over all other
'LC_xxx' variables, as well as over LANG. So, setting LC_ALL ensures that no
user setting of 'LC_xxx' or 'LANG' could influence ssh-serve badly.
There is one environment variable that might overrule LC_ALL, specifically
for showing messages: 'LANGUAGE'. GNU gettext lets it take precedence over
LC_ALL [1]:
"GNU gettext gives preference to LANGUAGE over LC_ALL and LANG for the
purpose of message handling"
So, also set LANGUAGE to the same value as we set LC_ALL to.
The principle of setting a specific locale in the server process to fix this
error, was first proposed by Dominik Ruf.
[1] https://www.gnu.org/software/gettext/manual/html_node/The-LANGUAGE-variable.html#The-LANGUAGE-variable
afa5e0bdb76f afa5e0bdb76f afa5e0bdb76f afa5e0bdb76f afa5e0bdb76f afa5e0bdb76f afa5e0bdb76f afa5e0bdb76f afa5e0bdb76f afa5e0bdb76f afa5e0bdb76f afa5e0bdb76f afa5e0bdb76f afa5e0bdb76f afa5e0bdb76f afa5e0bdb76f afa5e0bdb76f afa5e0bdb76f afa5e0bdb76f afa5e0bdb76f afa5e0bdb76f afa5e0bdb76f afa5e0bdb76f afa5e0bdb76f 3929ff3f21c6 3929ff3f21c6 3929ff3f21c6 3929ff3f21c6 3929ff3f21c6 3929ff3f21c6 3929ff3f21c6 3929ff3f21c6 3929ff3f21c6 3929ff3f21c6 3929ff3f21c6 3929ff3f21c6 3929ff3f21c6 | import mock
import os
import pytest
import sys
here = os.path.dirname(__file__)
def pytest_ignore_collect(path):
# ignore all files outside the 'kallithea' directory
if not str(path).startswith(os.path.join(here, 'kallithea')):
return True
# during doctest verification, normally all python files will be imported.
# Thus, files that cannot be imported normally should be ignored.
# Files that generate ImportErrors are ignored via
# '--doctest-ignore-import-errors' (pytest.ini)
kallithea_ignore_paths = (
# AttributeError: 'module' object has no attribute 'config'
'/kallithea/alembic/env.py',
# collection of the following file messes up the rest of test execution
'/kallithea/tests/scripts/manual_test_concurrency.py',
)
if str(path).endswith(kallithea_ignore_paths):
return True
@pytest.fixture()
def doctest_mock_ugettext(request):
"""Mock ugettext ('_') in the module using this fixture.
Intended to be used for doctests.
In a doctest, enable this fixture using:
>>> getfixture('doctest_mock_ugettext')
"""
m = __import__(request.module.__name__, globals(), locals(), [None], 0)
with mock.patch.object(m, '_', lambda s: s):
yield
|