On Sat, Jun 7, 2025 at 7:22 AM Branko Čibej <br...@apache.org> wrote:
> On 7. 6. 25 03:11, Jun Omae wrote: > > On 2025/06/07 1:22, Timofei Zhakov wrote: > > Yay! It makes sense. Thank you so much for pointing me out. > > Is it worthed to change the locale to utf8 for all tests? > > However, if not, I think I could temporarily modify it, and set it back to > C after the test body. The patch: > > [[[ > Index: subversion/tests/cmdline/basic_tests.py > =================================================================== > --- subversion/tests/cmdline/basic_tests.py (revision 1926036) > +++ subversion/tests/cmdline/basic_tests.py (working copy) > @@ -3349,37 +3349,42 @@ > def unicode_arguments_test(sbox: svntest.sandbox.Sandbox): > """test unicode arguments""" > > - UNICODE_TEST_STRING = '\U0001f449\U0001f448' > - sbox.build(read_only=False, empty=True) > + oldlocale = os.environ["LC_ALL"] > + os.environ["LC_ALL"] = "C.utf8" > > - unicode_item = sbox.ospath(UNICODE_TEST_STRING) > - test_item = sbox.ospath("test") > + try: > + UNICODE_TEST_STRING = '\U0001f449\U0001f448' > + sbox.build(read_only=False, empty=True) > > - svntest.actions.run_and_verify_svn2(None, [], 0, "mkdir", unicode_item) > - svntest.actions.run_and_verify_svn2(None, [], 0, "mkdir", test_item) > - svntest.actions.run_and_verify_svn2(None, [], 0, "propset", > - "name", UNICODE_TEST_STRING, > unicode_item) > - svntest.actions.run_and_verify_svn2(None, [], 0, "ci", sbox.wc_dir, > - "-m", UNICODE_TEST_STRING, > - "--with-revprop", > - "revprop=" + UNICODE_TEST_STRING) > + unicode_item = sbox.ospath(UNICODE_TEST_STRING) > + test_item = sbox.ospath("test") > > - expected_disk = wc.State("", { > - UNICODE_TEST_STRING: Item(props={ "name": UNICODE_TEST_STRING }), > - "test" : Item(), > - }) > + svntest.actions.run_and_verify_svn2(None, [], 0, "mkdir", > unicode_item) > + svntest.actions.run_and_verify_svn2(None, [], 0, "mkdir", test_item) > + svntest.actions.run_and_verify_svn2(None, [], 0, "propset", > + "name", UNICODE_TEST_STRING, > unicode_item) > + svntest.actions.run_and_verify_svn2(None, [], 0, "ci", sbox.wc_dir, > + "-m", UNICODE_TEST_STRING, > + "--with-revprop", > + "revprop=" + UNICODE_TEST_STRING) > > - svntest.actions.verify_disk(sbox.wc_dir, expected_disk, > check_props=True) > - os.chdir(sbox.wc_dir) > - svntest.actions.run_and_verify_log_xml( > - expected_revprops=[{ > - "svn:author": "jrandom", > - "svn:date": "", > - "svn:log": UNICODE_TEST_STRING, > - "revprop": UNICODE_TEST_STRING > - }], > - args=["-r1", "--with-all-revprops"]) > + expected_disk = wc.State("", { > + UNICODE_TEST_STRING: Item(props={ "name": UNICODE_TEST_STRING }), > + "test" : Item(), > + }) > > + svntest.actions.verify_disk(sbox.wc_dir, expected_disk, > check_props=True) > + os.chdir(sbox.wc_dir) > + svntest.actions.run_and_verify_log_xml( > + expected_revprops=[{ > + "svn:author": "jrandom", > + "svn:date": "", > + "svn:log": UNICODE_TEST_STRING, > + "revprop": UNICODE_TEST_STRING > + }], > + args=["-r1", "--with-all-revprops"]) > + finally: > + os.environ["LC_ALL"] = oldlocale > > ######################################################################## > # Run the tests > ]]] > > -- > Timofei Zhakov > > Sounds good. However, I think we could add a decorator to set UTF-8 locale > and restore original locale like the following patch. > > Also, C.UTF-8 (or en_US.UTF-8) locale is not available in all POSIX > environments. We should check the locale available before the using. The > unit test will be skipped if the locale unavailable in the proposed patch. > > [[[ > diff --git a/subversion/tests/cmdline/basic_tests.py > b/subversion/tests/cmdline/basic_tests.py > index 213c07d82..419f24ca3 100755 > --- a/subversion/tests/cmdline/basic_tests.py > +++ b/subversion/tests/cmdline/basic_tests.py > @@ -40,6 +40,7 @@ XFail = svntest.testcase.XFail_deco > Issues = svntest.testcase.Issues_deco > Issue = svntest.testcase.Issue_deco > Wimp = svntest.testcase.Wimp_deco > +Utf8LocaleTest = svntest.testcase.Utf8LocaleTest_deco > Item = wc.StateItem > > # Generic UUID-matching regular expression > @@ -3346,6 +3347,7 @@ def argv_with_best_fit_chars(sbox): > if count == 0: > raise svntest.Skip('No best fit characters in code page %r' % codepage) > > +@Utf8LocaleTest > def unicode_arguments_test(sbox: svntest.sandbox.Sandbox): > """test unicode arguments""" > > diff --git a/subversion/tests/cmdline/svntest/testcase.py > b/subversion/tests/cmdline/svntest/testcase.py > index 85deec4c6..aff866944 100644 > --- a/subversion/tests/cmdline/svntest/testcase.py > +++ b/subversion/tests/cmdline/svntest/testcase.py > @@ -349,3 +349,48 @@ def SkipDumpLoadCrossCheck_deco(cond_func = lambda: > True): > > # Create a singular alias, for linguistic correctness > Issue_deco = Issues_deco > + > + > +def _detect_utf8_locale(): > + import locale > + > + orig = None > + try: > + for name in ('C.UTF-8', 'en_US.UTF-8'): > + try: > + orig = locale.setlocale(locale.LC_ALL, name) > + except locale.Error: > + continue > + else: > + return name > + finally: > + if orig is not None: > + locale.setlocale(locale.LC_ALL, orig) > + > + return None # utf-8 locale unavailable > + > + > +_utf8_locale = _detect_utf8_locale() if os.name != 'nt' else False > + > + > +def Utf8LocaleTest_deco(f): > + > + import functools > + > + @functools.wraps(f) > + def wrapper(sbox: svntest.sandbox.Sandbox): > + if _utf8_locale is None: > + raise svntest.Skip > + if _utf8_locale is not False: > + orig = os.environ.get('LC_ALL') > + os.environ['LC_ALL'] = _utf8_locale > + try: > + return f(sbox) > + finally: > + if _utf8_locale is not False: > + if orig is None: > + del os.environ['LC_ALL'] > + else: > + os.environ['LC_ALL'] = orig > + > + return wrapper > ]]] > > -- > Jun Omae <jun6...@gmail.com> <jun6...@gmail.com> (大前 潤) > > > +1 for this solution with the decorator, I'd only prefer to call it > @RequireUtf8 – but that's a minor point. > > +1 from me as well. > Setting Python's global default encoding is a non-starter; not only > because Subversion runs on systems that don't support UTF-8, but also > because it would make the tests stop exercising our encoding conversion > functions. > Yeah. I agree. -- Timofei Zhakov