Mount gclient cache dir for chrome root when entering chroot

BUG=chromium:747349
TEST=Manual. about:version should have correct revision.

Change-Id: Id06e12b8acc071a4d3b84e561b035427fb80df66
Reviewed-on: https://chromium-review.googlesource.com/984273
Commit-Ready: Xiyuan Xia <xiyuan@chromium.org>
Tested-by: Xiyuan Xia <xiyuan@chromium.org>
Reviewed-by: Mike Frysinger <vapier@chromium.org>
diff --git a/sdk_lib/enter_chroot.sh b/sdk_lib/enter_chroot.sh
index fddbc03..fd63be0 100755
--- a/sdk_lib/enter_chroot.sh
+++ b/sdk_lib/enter_chroot.sh
@@ -272,6 +272,29 @@
   chown ${SUDO_UID}:${SUDO_GID} "${chroot_gitconfig}"
 }
 
+setup_gclient_cache_dir_mount() {
+  # Mount "cache_dir" if a glient checkout depends on it.
+  # Otherwise, git command inside chroot fails. See https://crbug.com/747349
+  local checkout_root="$1"
+
+  if [[ ! -e "${checkout_root}/.gclient" ]]; then
+    return 0
+  fi
+
+  local cache_dir=$(sed -n -E "s/^ *cache_dir *= *'(.*)'/\1/p" \
+                    "${checkout_root}/.gclient")
+  if [[ -z "${cache_dir}" ]]; then
+    return 0
+  fi
+
+  if [[ ! -d "${cache_dir}" ]]; then
+    warn "Gclient cache dir \"${cache_dir}\" is not a directory."
+    return 0
+  fi
+
+  setup_mount "${cache_dir}" "--bind" "${cache_dir}"
+}
+
 setup_env() {
   (
     flock 200
@@ -496,6 +519,7 @@
         debug "Mounting chrome source at: $INNER_CHROME_ROOT"
         echo $CHROME_ROOT > "${FLAGS_chroot}${CHROME_ROOT_CONFIG}"
         setup_mount "$CHROME_ROOT" --bind "$INNER_CHROME_ROOT"
+        setup_gclient_cache_dir_mount "$CHROME_ROOT"
       fi
     fi