[PATCH STABLE] curses: do not setlocale() at import time (issue5261)

Augie Fackler raf at durin42.com
Fri Jul 26 19:15:13 EDT 2019


queued for stable, thanks

> On Jul 25, 2019, at 8:42 AM, Yuya Nishihara <yuya at tcha.org> wrote:
> 
> # HG changeset patch
> # User Yuya Nishihara <yuya at tcha.org>
> # Date 1564057709 -32400
> #      Thu Jul 25 21:28:29 2019 +0900
> # Branch stable
> # Node ID 315e0c8b8e63addcbfebedfa4e832cf265cca203
> # 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)
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel at mercurial-scm.org
> https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel



More information about the Mercurial-devel mailing list