Submitter | Manuel Jacob |
---|---|
Date | June 27, 2020, 8:58 p.m. |
Message ID | <52c536124224ca4e87ae.1593291493@tmp> |
Download | mbox | patch |
Permalink | /patch/46581/ |
State | Superseded |
Headers | show |
Comments
On Sat, 27 Jun 2020 22:58:13 +0200, Manuel Jacob wrote: > # HG changeset patch > # User Manuel Jacob <me@manueljacob.de> > # Date 1593284746 -7200 > # Sat Jun 27 21:05:46 2020 +0200 > # Node ID 52c536124224ca4e87aee09cdff7ded520d6d40d > # Parent 94987aadb22cee1d7da52f365b3f532a94bbd4a6 > # EXP-Topic with_lc_type > pycompat: stop setting LC_CTYPE unconditionally > --- a/mercurial/pycompat.py > +++ b/mercurial/pycompat.py > @@ -10,6 +10,7 @@ > > from __future__ import absolute_import > > +import contextlib > import getopt > import inspect > import json > @@ -105,13 +106,22 @@ > # initialized. Since CPython commit 177d921c8c03d30daa32994362023f777624b10d, > # LC_CTYPE is always initialized. If we require Python 3.8+, we should re-check > # if we can remove this code. > -if locale.setlocale(locale.LC_CTYPE, None) == 'C': > - try: > - locale.setlocale(locale.LC_CTYPE, '') > - except locale.Error: > - # The likely case is that the locale from the environment variables is > - # unknown. > - pass > +@contextlib.contextmanager > +def with_lc_ctype(): > + oldloc = locale.setlocale(locale.LC_CTYPE, None) > + if oldloc == 'C': > + try: > + try: > + locale.setlocale(locale.LC_CTYPE, '') > + except locale.Error: > + # The likely case is that the locale from the environment > + # variables is unknown. > + pass > + yield > + finally: > + locale.setlocale(locale.LC_CTYPE, oldloc) > + else: > + yield Let's move this function to util.py. Other than that, the patch looks good to me.
Patch
diff --git a/hgext/histedit.py b/hgext/histedit.py --- a/hgext/histedit.py +++ b/hgext/histedit.py @@ -1710,7 +1710,8 @@ ctxs = [] for i, r in enumerate(revs): ctxs.append(histeditrule(ui, repo[r], i)) - rc = curses.wrapper(functools.partial(_chisteditmain, repo, ctxs)) + with pycompat.with_lc_ctype(): + rc = curses.wrapper(functools.partial(_chisteditmain, repo, ctxs)) curses.echo() curses.endwin() if rc is False: diff --git a/mercurial/crecord.py b/mercurial/crecord.py --- a/mercurial/crecord.py +++ b/mercurial/crecord.py @@ -569,7 +569,8 @@ if util.safehasattr(signal, b'SIGTSTP'): origsigtstp = signal.getsignal(signal.SIGTSTP) try: - curses.wrapper(chunkselector.main) + with pycompat.with_lc_ctype(): + curses.wrapper(chunkselector.main) if chunkselector.initexc is not None: raise chunkselector.initexc # ncurses does not restore signal handler for SIGTSTP diff --git a/mercurial/pycompat.py b/mercurial/pycompat.py --- a/mercurial/pycompat.py +++ b/mercurial/pycompat.py @@ -10,6 +10,7 @@ from __future__ import absolute_import +import contextlib import getopt import inspect import json @@ -105,13 +106,22 @@ # initialized. Since CPython commit 177d921c8c03d30daa32994362023f777624b10d, # LC_CTYPE is always initialized. If we require Python 3.8+, we should re-check # if we can remove this code. -if locale.setlocale(locale.LC_CTYPE, None) == 'C': - try: - locale.setlocale(locale.LC_CTYPE, '') - except locale.Error: - # The likely case is that the locale from the environment variables is - # unknown. - pass +@contextlib.contextmanager +def with_lc_ctype(): + oldloc = locale.setlocale(locale.LC_CTYPE, None) + if oldloc == 'C': + try: + try: + locale.setlocale(locale.LC_CTYPE, '') + except locale.Error: + # The likely case is that the locale from the environment + # variables is unknown. + pass + yield + finally: + locale.setlocale(locale.LC_CTYPE, oldloc) + else: + yield if ispy3: