1#!/bin/sh
2#
3# Copyright 2017 Google Inc. All Rights Reserved.
4#
5
6# <cloud-sdk-sh-preamble>
7#
8#  CLOUDSDK_ROOT_DIR            (a)  installation root dir
9#  CLOUDSDK_PYTHON              (u)  python interpreter path
10#  CLOUDSDK_GSUTIL_PYTHON       (u)  python interpreter path for gsutil
11#  CLOUDSDK_PYTHON_ARGS         (u)  python interpreter arguments
12#  CLOUDSDK_PYTHON_SITEPACKAGES (u)  use python site packages
13#  CLOUDSDK_BQ_PYTHON           (u)  python interpreter for bq
14#
15# (a) always defined by the preamble
16# (u) user definition overrides preamble
17
18# Wrapper around 'which' and 'command -v', tries which first, then falls back
19# to command -v
20_cloudsdk_which() {
21  which "$1" 2>/dev/null || command -v "$1" 2>/dev/null
22}
23
24# Check whether passed in python command reports major version 3.
25_is_python3() {
26  echo "$("$1" -V 2>&1)" | grep -E "Python 3" > /dev/null
27}
28
29# For Python 3, gsutil requires Python 3.5+.
30_py3_interpreter_compat_with_gsutil () {
31  # Some environments (e.g. macOS) don't support grep -P, so we use grep -E.
32  echo "$("$1" -V 2>&1)" | grep -E "Python 3[.]([5-9]|[1-9][0-9])" > /dev/null
33}
34
35order_python() {
36  selected_version=""
37  for python_version in "$@"
38  do
39    if [ -z "$selected_version" ]; then
40      if _cloudsdk_which $python_version > /dev/null && "$python_version" -c "import sys; print(sys.version)" > /dev/null; then
41        selected_version=$python_version
42      fi
43    fi
44  done
45  if [ -z "$selected_version" ]; then
46    selected_version=python
47  fi
48  echo $selected_version
49}
50
51# Determines the real cloud sdk root dir given the script path.
52# Would be easier with a portable "readlink -f".
53_cloudsdk_root_dir() {
54  case $1 in
55  /*)   _cloudsdk_path=$1
56        ;;
57  */*)  _cloudsdk_path=$PWD/$1
58        ;;
59  *)    _cloudsdk_path=$(_cloudsdk_which $1)
60        case $_cloudsdk_path in
61        /*) ;;
62        *)  _cloudsdk_path=$PWD/$_cloudsdk_path ;;
63        esac
64        ;;
65  esac
66  _cloudsdk_dir=0
67  while :
68  do
69    while _cloudsdk_link=$(readlink "$_cloudsdk_path")
70    do
71      case $_cloudsdk_link in
72      /*) _cloudsdk_path=$_cloudsdk_link ;;
73      *)  _cloudsdk_path=$(dirname "$_cloudsdk_path")/$_cloudsdk_link ;;
74      esac
75    done
76    case $_cloudsdk_dir in
77    1)  break ;;
78    esac
79    if [ -d "${_cloudsdk_path}" ]; then
80      break
81    fi
82    _cloudsdk_dir=1
83    _cloudsdk_path=$(dirname "$_cloudsdk_path")
84  done
85  while :
86  do  case $_cloudsdk_path in
87      */)     _cloudsdk_path=$(dirname "$_cloudsdk_path/.")
88              ;;
89      */.)    _cloudsdk_path=$(dirname "$_cloudsdk_path")
90              ;;
91      */bin)  dirname "$_cloudsdk_path"
92              break
93              ;;
94      *)      echo "$_cloudsdk_path"
95              break
96              ;;
97      esac
98  done
99}
100CLOUDSDK_ROOT_DIR=$(_cloudsdk_root_dir "$0")
101
102setup_cloudsdk_python() {
103  # if $CLOUDSDK_PYTHON is not set, look for bundled python else
104  # prefer python3 over python2
105  if [ -z "$CLOUDSDK_PYTHON" ]; then
106    # Is bundled python present?
107    if [ -x "$CLOUDSDK_ROOT_DIR/platform/bundledpythonunix/bin/python3" ];
108    then
109      CLOUDSDK_PYTHON="$CLOUDSDK_ROOT_DIR/platform/bundledpythonunix/bin/python3"
110      CLOUDSDK_PYTHON_SITEPACKAGES=1
111    else
112      CLOUDSDK_PYTHON=$(order_python python3 python2 /usr/local/bin/python3.8 python)
113    fi
114  fi
115}
116
117setup_cloudsdk_python
118
119# $PYTHONHOME can interfere with gcloud. Users should use
120# CLOUDSDK_PYTHON to configure which python gcloud uses.
121unset PYTHONHOME
122
123# if CLOUDSDK_PYTHON_SITEPACKAGES and VIRTUAL_ENV are empty
124case :$CLOUDSDK_PYTHON_SITEPACKAGES:$VIRTUAL_ENV: in
125:::)  # add -S to CLOUDSDK_PYTHON_ARGS if not already there
126      case " $CLOUDSDK_PYTHON_ARGS " in
127      *" -S "*) ;;
128      "  ")     CLOUDSDK_PYTHON_ARGS="-S"
129                ;;
130      *)        CLOUDSDK_PYTHON_ARGS="$CLOUDSDK_PYTHON_ARGS -S"
131                ;;
132      esac
133      unset CLOUDSDK_PYTHON_SITEPACKAGES
134      ;;
135*)    # remove -S from CLOUDSDK_PYTHON_ARGS if already there
136      while :; do
137        case " $CLOUDSDK_PYTHON_ARGS " in
138        *" -S "*) CLOUDSDK_PYTHON_ARGS=${CLOUDSDK_PYTHON_ARGS%%-S*}' '${CLOUDSDK_PYTHON_ARGS#*-S} ;;
139        *) break ;;
140        esac
141      done
142      # if CLOUDSDK_PYTHON_SITEPACKAGES is empty
143      [ -z "$CLOUDSDK_PYTHON_SITEPACKAGES" ] &&
144        CLOUDSDK_PYTHON_SITEPACKAGES=1
145      export CLOUDSDK_PYTHON_SITEPACKAGES
146      ;;
147esac
148
149# Allow users to set the Python interpreter used to launch gsutil, falling
150# back to the CLOUDSDK_PYTHON interpreter otherwise.
151if [ -z "$CLOUDSDK_GSUTIL_PYTHON" ]; then
152  CLOUDSDK_GSUTIL_PYTHON="$CLOUDSDK_PYTHON"
153fi
154
155if [ -z "$CLOUDSDK_BQ_PYTHON" ]; then
156  CLOUDSDK_BQ_PYTHON="$CLOUDSDK_PYTHON"
157fi
158
159export CLOUDSDK_ROOT_DIR
160export CLOUDSDK_PYTHON_ARGS
161export CLOUDSDK_GSUTIL_PYTHON
162export CLOUDSDK_BQ_PYTHON
163
164case $HOSTNAME in
165  *.corp.google.com|*.c.googlers.com) export CLOUDSDK_GOOGLE_AUTH_IS_GOOGLE_DOMAIN=true;;
166esac
167
168# </cloud-sdk-sh-preamble>
169
170export CLOUDSDK_COMPONENT_MANAGER_DISABLE_UPDATE_CHECK=1
171
172"${CLOUDSDK_ROOT_DIR}/bin/gcloud" auth docker-helper "$@"
173