enter_chroot: restore auto locale generation

First let's add a chroot upgrade hook that'll declare a small list of
locales to speed up glibc upgrades.

The other blocker was that `cros_sdk --enter` took an inordinate amount
of time to execute (`locale-gen -u` specifically) when the number of
existing locales is huge.  This seems to be a bug in the bash/glibc
stack which is resolved in newer versions, but we can workaround the
issue by forcing locale-gen to run in a C locale.  The tool itself does
not care about its locale and we silence its output.

BUG=chromium-os:20378
TEST=`cros_sdk --enter`; see no locales in /etc/locale.gen; run `./build_packages` and see upgrade hook work
TEST=generate all 400 locales; `cros_sdk --enter`; see that it was quick

Change-Id: I8fcc5e26bd8e1bcfd52b6a6c7ef3cacf0a252081
Reviewed-on: http://gerrit.chromium.org/gerrit/7806
Reviewed-by: David James <davidjames@chromium.org>
Reviewed-by: Zdenek Behan <zbehan@chromium.org>
Commit-Ready: Mike Frysinger <vapier@chromium.org>
Tested-by: Mike Frysinger <vapier@chromium.org>
diff --git a/sdk_lib/enter_chroot.sh b/sdk_lib/enter_chroot.sh
index a9d12c3..67e9592 100755
--- a/sdk_lib/enter_chroot.sh
+++ b/sdk_lib/enter_chroot.sh
@@ -336,13 +336,14 @@
       esac
       gen_locales=("${gen_locales[@]}" "${l} ${enc}")
     done
-    # TODO(raymes): Something broke this with the new
-    # glibc. Need to uncomment this as soon as it's fixed.
-    # http://code.google.com/p/chromium-os/issues/detail?id=20378
-    #if [[ ${#gen_locales[@]} -gt 0 ]] ; then
-    #  sudo -- chroot "$FLAGS_chroot" locale-gen -q -u \
-    #    -G "$(printf '%s\n' "${gen_locales[@]}")"
-    #fi
+    if [[ ${#gen_locales[@]} -gt 0 ]] ; then
+      # Force LC_ALL=C to workaround slow string parsing in bash
+      # with long multibyte strings.  Newer setups have this fixed,
+      # but locale-gen doesn't need to be run in any locale in the
+      # first place, so just go with C to keep it fast.
+      sudo -- chroot "$FLAGS_chroot" env LC_ALL=C locale-gen -q -u \
+        -G "$(printf '%s\n' "${gen_locales[@]}")"
+    fi
 
     # Fix permissions on shared memory to allow non-root users access to POSIX
     # semaphores.