From patchwork Fri Jun 26 08:35:01 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Subject: [stable] curses: do not initialize LC_ALL to user settings (issue6358) From: Manuel Jacob X-Patchwork-Id: 46577 Message-Id: <36dcc87c0c15d8757ef0.1593160501@tmp> To: mercurial-devel@mercurial-scm.org Date: Fri, 26 Jun 2020 10:35:01 +0200 # HG changeset patch # User Manuel Jacob # Date 1593157054 -7200 # Fri Jun 26 09:37:34 2020 +0200 # Branch stable # Node ID 36dcc87c0c15d8757ef0322c820861b1d10350c1 # Parent 9bb2fc4ac22b0b986d56fd13be4e6b524af7b648 # EXP-Topic init_locale curses: do not initialize LC_ALL to user settings (issue6358) 701341f57ceb moved the setlocale() call to right before curses was used. This didn’t fully solve the problem it was supposed to solve (locale-dependent functions, like date formatting/parsing), but only postponed it. Initializing LC_CTYPE seems to be sufficient for curses to work correctly. Luckily this is already done at interpreter startup on modern Python versions and, since recently, by Mercurial in the pycompat module in all other cases. diff --git a/hgext/histedit.py b/hgext/histedit.py --- a/hgext/histedit.py +++ b/hgext/histedit.py @@ -201,7 +201,6 @@ termios = None import functools -import locale import os import struct @@ -1710,10 +1709,6 @@ ctxs = [] for i, r in enumerate(revs): ctxs.append(histeditrule(ui, repo[r], i)) - # Curses requires setting the locale or it will default to the C - # locale. This sets the locale to the user's default system - # locale. - locale.setlocale(locale.LC_ALL, '') rc = curses.wrapper(functools.partial(_chisteditmain, repo, ctxs)) curses.echo() curses.endwin() diff --git a/mercurial/crecord.py b/mercurial/crecord.py --- a/mercurial/crecord.py +++ b/mercurial/crecord.py @@ -10,7 +10,6 @@ from __future__ import absolute_import -import locale import os import re import signal @@ -574,9 +573,6 @@ """ ui.write(_(b'starting interactive selection\n')) chunkselector = curseschunkselector(headerlist, ui, operation) - # This is required for ncurses to display non-ASCII characters in - # default user locale encoding correctly. --immerrr - locale.setlocale(locale.LC_ALL, '') origsigtstp = sentinel = object() if util.safehasattr(signal, b'SIGTSTP'): origsigtstp = signal.getsignal(signal.SIGTSTP)