# HG changeset patch # User Yuya Nishihara # Date 2019-07-25 12:28:29 # Node ID 701341f57ceb1ac03b697f6201845b6594d6d3ce # Parent 7fae3b0bd893b75e0fb65ad3032b7532089e2341 curses: do not setlocale() at import time (issue5261) setlocale() can break date formatting/parsing functions because they are locale dependent. We should avoid doing setlocale() as possible. This patch moves setlocale() just before curses.wrapper(), which function is documented to "initialize curses." I don't know the details about the curses initialization, but I *think* this would work as well. Maybe we can extract a curses setup function later. https://www.mercurial-scm.org/pipermail/mercurial-devel/2019-February/128788.html diff --git a/hgext/histedit.py b/hgext/histedit.py --- a/hgext/histedit.py +++ b/hgext/histedit.py @@ -201,6 +201,7 @@ except ImportError: termios = None import functools +import locale import os import struct @@ -947,12 +948,6 @@ def findoutgoing(ui, repo, remote=None, # Curses Support try: import curses - - # Curses requires setting the locale or it will default to the C - # locale. This sets the locale to the user's default system - # locale. - import locale - locale.setlocale(locale.LC_ALL, r'') except ImportError: curses = None @@ -1538,6 +1533,10 @@ def _chistedit(ui, repo, *freeargs, **op ctxs = [] for i, r in enumerate(revs): ctxs.append(histeditrule(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, r'') rc = curses.wrapper(functools.partial(_chisteditmain, repo, ctxs)) curses.echo() curses.endwin() @@ -2323,4 +2322,3 @@ def extsetup(ui): cmdutil.summaryhooks.add('histedit', summaryhook) statemod.addunfinished('histedit', fname='histedit-state', allowcommit=True, continueflag=True, abortfunc=hgaborthistedit) - diff --git a/mercurial/crecord.py b/mercurial/crecord.py --- a/mercurial/crecord.py +++ b/mercurial/crecord.py @@ -29,10 +29,6 @@ from .utils import ( ) stringio = util.stringio -# This is required for ncurses to display non-ASCII characters in default user -# locale encoding correctly. --immerrr -locale.setlocale(locale.LC_ALL, r'') - # patch comments based on the git one diffhelptext = _("""# To remove '-' lines, make them ' ' lines (context). # To remove '+' lines, delete them. @@ -530,6 +526,9 @@ def chunkselector(ui, headerlist, operat """ ui.write(_('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, r'') origsigtstp = sentinel = object() if util.safehasattr(signal, 'SIGTSTP'): origsigtstp = signal.getsignal(signal.SIGTSTP)