commit:     a4dbd5aa801fbe5510a7bc10af1027b6ce19061b
Author:     Kerin Millar <kfm <AT> plushkava <DOT> net>
AuthorDate: Fri Oct 31 19:44:55 2025 +0000
Commit:     Kerin Millar <kfm <AT> plushkava <DOT> net>
CommitDate: Fri Oct 31 19:55:59 2025 +0000
URL:        https://gitweb.gentoo.org/proj/locale-gen.git/commit/?id=a4dbd5aa

Suppress bash warnings regarding setlocale(3) failures

Presently, there are five instances in which sh(1) will be executed by
locale-gen(8). Consequently, irritating warnings will be raised where
both of the following conditions hold true.

- bash(1) is the effective /bin/sh implementation
- the LC_ALL environment variable is set as an unavailable locale

For example:

$ LC_ALL=unavailable bash -c ''
bash: warning: setlocale: LC_ALL: cannot change locale (unavailable): No
such file or directory

This occurs because bash chooses to report setlocale(3) failures. While
there is nothing wrong in doing so, to encounter such warnings while
executing locale-gen(8) is tantamount to noise. Address this annoyance
by having Perl ensure that the execve(2) call responsible for launching
sh(1) specifies LC_ALL as 'C'.

See-also: 04c08067b15933d195d8500eefdc363cb46c1b32
Signed-off-by: Kerin Millar <kfm <AT> plushkava.net>

 locale-gen | 32 +++++++++++++++++++++++---------
 1 file changed, 23 insertions(+), 9 deletions(-)

diff --git a/locale-gen b/locale-gen
index 3f825b4..a65b99a 100644
--- a/locale-gen
+++ b/locale-gen
@@ -138,7 +138,10 @@ umask 0022;
 }
 
 sub get_locale_dir () {
-       my $stdout = qx{ LC_ALL=C localedef --help 2>/dev/null };
+       my $stdout = do {
+               local $ENV{'LC_ALL'} = 'C';
+               qx{ localedef --help 2>/dev/null };
+       };
        if ($? == 0 && $stdout =~ m/\hlocale path\h*:\s+(\/[^:]+)/) {
                return canonpath($1);
        } elsif (($? & 0x7F) == 0) {
@@ -415,7 +418,10 @@ sub check_archive_dir ($prefix, $locale_dir) {
        my $archive_dir = local $ENV{'DIR'} = catdir($prefix, $locale_dir);
 
        # Quietly attempt to create the directory if it does not already exist.
-       system q{ mkdir -p -- "$DIR" 2>/dev/null };
+       {
+               local $ENV{'LC_ALL'} = 'C';
+               system q{ mkdir -p -- "$DIR" 2>/dev/null };
+       }
 
        # Check whether the directory exists and can be modified by the EUID.
        if (! utime undef, undef, $archive_dir) {
@@ -609,8 +615,10 @@ sub check_effective_locale ($supported_by) {
 }
 
 sub copy_security_context ($src_path, $dst_path) {
-       local @ENV{'SRC_PATH', 'DST_PATH'} = ($src_path, $dst_path);
-       my $stderr = qx{ LC_ALL=C chcon --reference="\$SRC_PATH" -- 
"\$DST_PATH" 2>&1 >/dev/null };
+       my $stderr = do {
+               local @ENV{'LC_ALL', 'SRC_PATH', 'DST_PATH'} = ('C', $src_path, 
$dst_path);
+               qx{ chcon --reference="\$SRC_PATH" -- "\$DST_PATH" 2>&1 
>/dev/null };
+       };
        # Throw exceptions for any errors that are not a consequence of ENOTSUP.
        if ($? != 0 && $stderr !~ m/: Operation not supported$/m) {
                if (length $stderr) {
@@ -631,7 +639,11 @@ sub fopen ($path) {
 }
 
 sub get_nprocs () {
-       chomp(my $nproc = qx{ { nproc || getconf _NPROCESSORS_CONF; } 
2>/dev/null });
+       my $nproc = do {
+               local $ENV{'LC_ALL'} = 'C';
+               qx{ { nproc || getconf _NPROCESSORS_CONF; } 2>/dev/null };
+       };
+       chomp $nproc;
        return $nproc;
 }
 
@@ -693,10 +705,12 @@ sub dirname ($path) {
 sub has_mount_option ($target, $option) {
        # Per bug 962817, / may not necessarily exist as a mountpoint. Assuming
        # it does not, ignore the case that findmnt(8) exits with a status of 1.
-       local $ENV{'TARGET'} = $target;
-       my $stdout = qx{
-               findmnt -no options -T "\$TARGET"
-               case \$? in 1) ! mountpoint -q / ;; *) exit "\$?" ;; esac
+       my $stdout = do {
+               local @ENV{'LC_ALL', 'TARGET'} = ('C', $target);
+               qx{
+                       findmnt -no options -T "\$TARGET"
+                       case \$? in 1) ! mountpoint -q / ;; *) exit "\$?" ;; 
esac
+               };
        };
        throw_child_error('findmnt');
        chomp $stdout;

Reply via email to