[PATCH] guile-launcher: Avoid the “C” locale and try “C.UTF-8”.

  • Done
  • quality assurance status badge
Details
One participant
  • Ludovic Courtès
Owner
unassigned
Submitted by
Ludovic Courtès
Severity
normal
L
L
Ludovic Courtès wrote on 21 Dec 2024 11:44
[PATCH] guile-launcher: Avoid the “C ” locale and try “C.UTF-8”.
(address . guix-patches@gnu.org)(name . Ludovic Courtès)(address . ludo@gnu.org)
24813952576725c0d7f6478543eec8e2747d525d.1734777730.git.ludo@gnu.org
This is a followup to ed0cd12a82b429bc5058f693a0f75f2ba0ee47c4, which
adds the C.UTF-8 locale to the glibc package, and
ee4e79f871bc2f848ce4b4a176bb725ab71e3cd6, which changed the default to
“C.UTF-8” for ‘guix’ commands.

Fixes a bug whereby starting ‘guix’ in an environment where the LC_*
variables are unset would start it in the “C” locale:

echo '(pk (setlocale LC_ALL))' | guix shell -CW coreutils -- guix repl

This would lead to breakage for commands such as ‘guix substitute’ that
need to run in a UTF-8 locale.

* gnu/packages/aux-files/guile-launcher.c (main): Try “C.UTF-8” before
“en_US.UTF-8”. Do that also when the current locale is “C”.
* guix/ui.scm (install-locale): Likewise.

Change-Id: I36da4db8f898f1083b33760e1ab46c3a257de811
---
gnu/packages/aux-files/guile-launcher.c | 16 +++++++++++-----
guix/ui.scm | 4 +++-
2 files changed, 14 insertions(+), 6 deletions(-)

Hi!

Until now, ‘guix’ wouldn’t mind running in the C locale, but that’s not
good for ‘guix substitute’ and other commands started by ‘guix-daemon’.

This is something colleagues and I noticed while running ‘guix-daemon’
in a GitLab-CI container where LC_* were unset.

Thoughts?

Ludo’.

Toggle diff (46 lines)
diff --git a/gnu/packages/aux-files/guile-launcher.c b/gnu/packages/aux-files/guile-launcher.c
index c205477f64..44f7e1f432 100644
--- a/gnu/packages/aux-files/guile-launcher.c
+++ b/gnu/packages/aux-files/guile-launcher.c
@@ -84,11 +84,17 @@ int
main (int argc, char **argv)
{
/* Try to install the current locale; remain silent if it fails. */
- if (setlocale (LC_ALL, "") == NULL)
- /* The 'guix pull'-provided 'guix' includes at least en_US.utf8 so use
- that. That gives us UTF-8 support for 'scm_to_locale_string', etc.,
- which is always preferable over the C locale. */
- setlocale (LC_ALL, "en_US.utf8");
+ char *locale = setlocale (LC_ALL, "");
+ if (locale == NULL || strcmp (locale, "C") == 0)
+ {
+ /* The 'guix pull'-provided 'guix' includes at least C.UTF-8 (which is
+ baked into glibc, except when cross-compiling) so use that, and fall
+ back to en_US.UTF-8. That gives us UTF-8 support for
+ 'scm_to_locale_string', etc., which is always preferable over the C
+ locale. */
+ if (setlocale (LC_ALL, "C.UTF-8") == NULL)
+ setlocale (LC_ALL, "en_US.utf8");
+ }
const char *str;
str = getenv ("GUILE_LOAD_PATH");
diff --git a/guix/ui.scm b/guix/ui.scm
index eba12c8616..14d6874795 100644
--- a/guix/ui.scm
+++ b/guix/ui.scm
@@ -521,7 +521,9 @@ (define (install-locale)
"Install the current locale settings."
(catch 'system-error
(lambda _
- (setlocale LC_ALL ""))
+ (when (string=? (setlocale LC_ALL "") "C")
+ ;; If the current locale is "C", prefer "C.UTF-8".
+ (setlocale LC_ALL "C.UTF-8")))
(lambda args
(display-hint (G_ "Consider installing the @code{glibc-locales} package
and defining @code{GUIX_LOCPATH}, along these lines:

base-commit: 777fde8299d5b0050cae661d403374a7dd87f6ab
--
2.46.0
L
L
Ludovic Courtès wrote on 4 Jan 23:38 +0100
Re: [bug#75007] [PATCH] guile-launcher: Avoid the “ C” locale and try “C.UTF-8”.
(address . 75007-done@debbugs.gnu.org)
87h66enr0g.fsf@gnu.org
Ludovic Courtès <ludo@gnu.org> skribis:

Toggle quote (19 lines)
> This is a followup to ed0cd12a82b429bc5058f693a0f75f2ba0ee47c4, which
> adds the C.UTF-8 locale to the glibc package, and
> ee4e79f871bc2f848ce4b4a176bb725ab71e3cd6, which changed the default to
> “C.UTF-8” for ‘guix’ commands.
>
> Fixes a bug whereby starting ‘guix’ in an environment where the LC_*
> variables are unset would start it in the “C” locale:
>
> echo '(pk (setlocale LC_ALL))' | guix shell -CW coreutils -- guix repl
>
> This would lead to breakage for commands such as ‘guix substitute’ that
> need to run in a UTF-8 locale.
>
> * gnu/packages/aux-files/guile-launcher.c (main): Try “C.UTF-8” before
> “en_US.UTF-8”. Do that also when the current locale is “C”.
> * guix/ui.scm (install-locale): Likewise.
>
> Change-Id: I36da4db8f898f1083b33760e1ab46c3a257de811

Pushed as d7c8a5ff3c76461d469364e920ec4f09f9e3c126.
Closed
?
Your comment

This issue is archived.

To comment on this conversation send an email to 75007@debbugs.gnu.org

To respond to this issue using the mumi CLI, first switch to it
mumi current 75007
Then, you may apply the latest patchset in this issue (with sign off)
mumi am -- -s
Or, compose a reply to this issue
mumi compose
Or, send patches to this issue
mumi send-email *.patch