From d7c8a5ff3c76461d469364e920ec4f09f9e3c126 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludovic=20Court=C3=A8s?= Date: Fri, 20 Dec 2024 10:50:45 +0100 Subject: [PATCH] =?UTF-8?q?guile-launcher:=20Avoid=20the=20=E2=80=9CC?= =?UTF-8?q?=E2=80=9D=20locale=20and=20try=20=E2=80=9CC.UTF-8=E2=80=9D.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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(-) diff --git a/gnu/packages/aux-files/guile-launcher.c b/gnu/packages/aux-files/guile-launcher.c index c205477f649..44f7e1f432a 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 eba12c86163..14d6874795a 100644 --- a/guix/ui.scm +++ b/guix/ui.scm @@ -521,7 +521,9 @@ part." "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: