blob: f5ad3311ad03234159ec8a4a2b0f0cb58bfd9ba6 [file] [log] [blame]
Robert Iannucci2188fe92016-12-02 11:15:57 -08001#!/bin/bash -e
2
3# Copyright (c) 2016 The Chromium Authors. All rights reserved.
4# Use of this source code is governed by a BSD-style license that can be
5# found in the LICENSE file.
6
Dan Jacquese82c0de2017-07-05 18:10:23 -07007set -e -o pipefail
8
Vadim Shtayuraeebc3d82018-08-14 20:39:46 +00009CYGWIN=false
Vadim Shtayura5e5c2172018-08-15 21:11:10 +000010MYPATH=$(dirname "${BASH_SOURCE[0]}")
11
12: ${CIPD_CLIENT_VER:=`cat $MYPATH/cipd_client_version`}
13: ${CIPD_CLIENT_SRV:='https://chrome-infra-packages.appspot.com'}
Robert Iannucci2188fe92016-12-02 11:15:57 -080014
15UNAME=`uname -s | tr '[:upper:]' '[:lower:]'`
Vadim Shtayura5e5c2172018-08-15 21:11:10 +000016case $UNAME in
Robert Iannucci2188fe92016-12-02 11:15:57 -080017 linux)
Vadim Shtayura5e5c2172018-08-15 21:11:10 +000018 PLAT=linux
Robert Iannucci2188fe92016-12-02 11:15:57 -080019 ;;
Brian White361822c2018-04-04 15:21:45 -040020 cygwin*)
Vadim Shtayura5e5c2172018-08-15 21:11:10 +000021 PLAT=windows
Brian White361822c2018-04-04 15:21:45 -040022 CYGWIN=true
23 ;;
24 msys*|mingw*)
Vadim Shtayura5e5c2172018-08-15 21:11:10 +000025 PLAT=windows
Robert Iannucci2188fe92016-12-02 11:15:57 -080026 ;;
27 darwin)
Vadim Shtayura5e5c2172018-08-15 21:11:10 +000028 PLAT=mac
Robert Iannucci2188fe92016-12-02 11:15:57 -080029 ;;
30 *)
Vadim Shtayura5e5c2172018-08-15 21:11:10 +000031 echo "cipd not supported on $UNAME"
Robert Iannucci2188fe92016-12-02 11:15:57 -080032 exit 1
33esac
34
35UNAME=`uname -m | tr '[:upper:]' '[:lower:]'`
Vadim Shtayura5e5c2172018-08-15 21:11:10 +000036case $UNAME in
Robert Iannucci2188fe92016-12-02 11:15:57 -080037 x86_64|amd64)
38 ARCH=amd64
39 ;;
Robert Iannucciff2bf092017-09-11 16:27:26 -070040 s390x) # best-effort support for IBM s390x: crbug.com/764087
41 ARCH=s390x
42 ;;
Dan Jacques63421282017-10-16 15:05:59 -040043 ppc64) # best-effort support for 64-bit PowerPC: crbug.com/773857
44 ARCH=ppc64
45 ;;
Dan Jacques1e0b7a52017-10-17 11:19:18 -040046 ppc64le) # best-effort support for 64-bit PowerPC/LE: crbug.com/773857
Dan Jacques63421282017-10-16 15:05:59 -040047 ARCH=ppc64le
48 ;;
William Hesse6fd24842017-10-10 13:55:22 +020049 aarch64)
50 ARCH=arm64
51 ;;
Benjamin Pastenee346e412017-10-20 12:57:43 -070052 armv7l)
53 ARCH=armv6l
54 ;;
Robert Iannucci2188fe92016-12-02 11:15:57 -080055 arm*)
Vadim Shtayura5e5c2172018-08-15 21:11:10 +000056 ARCH=$UNAME
Robert Iannucci2188fe92016-12-02 11:15:57 -080057 ;;
58 *86)
59 ARCH=386
60 ;;
Wang Qing254538b2018-07-26 02:23:53 +000061 mips*)
Wang Qing82bb7562018-08-03 21:45:46 +000062 # detect mips64le vs mips64.
Vadim Shtayura5e5c2172018-08-15 21:11:10 +000063 ARCH=$UNAME
Wang Qing82bb7562018-08-03 21:45:46 +000064 if lscpu | grep -q "Little Endian"; then
65 ARCH+=le
66 fi
Wang Qing254538b2018-07-26 02:23:53 +000067 ;;
Robert Iannucci2188fe92016-12-02 11:15:57 -080068 *)
Vadim Shtayura5e5c2172018-08-15 21:11:10 +000069 echo "UNKNOWN Machine architecture: $UNAME"
Robert Iannucci2188fe92016-12-02 11:15:57 -080070 exit 1
71esac
72
Vadim Shtayura5e5c2172018-08-15 21:11:10 +000073URL="$CIPD_CLIENT_SRV/client?platform=${PLAT}-${ARCH}&version=$CIPD_CLIENT_VER"
74CLIENT="$MYPATH/.cipd_client"
Robert Iannucci2188fe92016-12-02 11:15:57 -080075
Vadim Shtayura5e5c2172018-08-15 21:11:10 +000076USER_AGENT="depot_tools/$(git -C $MYPATH rev-parse HEAD 2>/dev/null || echo "???")"
Robert Iannucci2188fe92016-12-02 11:15:57 -080077
Vadim Shtayura7e50ee32018-07-26 17:43:51 +000078# clean_bootstrap bootstraps the client from scratch using 'curl' or 'wget'.
79function clean_bootstrap() {
Vadim Shtayura5e5c2172018-08-15 21:11:10 +000080 echo "Bootstrapping cipd client for ${PLAT}-${ARCH} from ${URL}..."
Pawel Hajdan, Jr8c8a0a52017-09-06 19:40:18 +000081
Vadim Shtayura5e5c2172018-08-15 21:11:10 +000082 # Download the client into a temporary file, then move it into the final
83 # location atomically.
Pawel Hajdan, Jr8c8a0a52017-09-06 19:40:18 +000084 #
85 # This wonky tempdir method works on Linux and Mac.
Vadim Shtayura7e50ee32018-07-26 17:43:51 +000086 local CIPD_CLIENT_TMP=$(\
Vadim Shtayura5e5c2172018-08-15 21:11:10 +000087 mktemp -p "$MYPATH" 2>/dev/null || \
88 mktemp "$MYPATH/.cipd_client.XXXXXXX")
Pawel Hajdan, Jr8c8a0a52017-09-06 19:40:18 +000089
Robert Iannucci2188fe92016-12-02 11:15:57 -080090 if hash curl 2> /dev/null ; then
Vadim Shtayura5e5c2172018-08-15 21:11:10 +000091 curl "$URL" -s --show-error -f -A "$USER_AGENT" -L -o "$CIPD_CLIENT_TMP"
Pawel Hajdan, Jr8c8a0a52017-09-06 19:40:18 +000092 elif hash wget 2> /dev/null ; then
Vadim Shtayura5e5c2172018-08-15 21:11:10 +000093 wget "$URL" -q -U "${USER_AGENT}" -O "${CIPD_CLIENT_TMP}"
Robert Iannucci2188fe92016-12-02 11:15:57 -080094 else
Vadim Shtayura5e5c2172018-08-15 21:11:10 +000095 echo Your platform is missing a supported fetch command. Please use your package
96 echo manager to install one before continuing:
97 echo
98 echo curl
99 echo wget
100 echo
101 echo Alternately, manually download:
102 echo "$URL"
103 echo To $CLIENT, and then re-run this command.
Pawel Hajdan, Jr8c8a0a52017-09-06 19:40:18 +0000104 rm "${CIPD_CLIENT_TMP}"
Robert Iannucci2188fe92016-12-02 11:15:57 -0800105 exit 1
106 fi
Pawel Hajdan, Jr8c8a0a52017-09-06 19:40:18 +0000107
Vadim Shtayura5e5c2172018-08-15 21:11:10 +0000108 chmod +x "$CIPD_CLIENT_TMP"
Pawel Hajdan, Jr8c8a0a52017-09-06 19:40:18 +0000109
110 set +e
Vadim Shtayura5e5c2172018-08-15 21:11:10 +0000111 mv "$CIPD_CLIENT_TMP" "$CLIENT"
Pawel Hajdan, Jr8c8a0a52017-09-06 19:40:18 +0000112 set -e
Vadim Shtayura7e50ee32018-07-26 17:43:51 +0000113}
114
115function self_update() {
Vadim Shtayura5e5c2172018-08-15 21:11:10 +0000116 "$CLIENT" selfupdate -version "$CIPD_CLIENT_VER" -service-url "$CIPD_CLIENT_SRV"
Vadim Shtayura7e50ee32018-07-26 17:43:51 +0000117}
118
Vadim Shtayura5e5c2172018-08-15 21:11:10 +0000119if [ ! -x "$CLIENT" ]; then
Vadim Shtayura7e50ee32018-07-26 17:43:51 +0000120 clean_bootstrap
Robert Iannucci2188fe92016-12-02 11:15:57 -0800121fi
122
Vadim Shtayura5e5c2172018-08-15 21:11:10 +0000123export CIPD_HTTP_USER_AGENT_PREFIX=$USER_AGENT
124if ! self_update ; then
125 echo -n "CIPD selfupdate failed. " 1>&2
126 echo "Trying to bootstrap the CIPD client from scratch... " 1>&2
Vadim Shtayura7e50ee32018-07-26 17:43:51 +0000127 clean_bootstrap
128 if ! self_update ; then # need to run it again to setup .cipd_version file
Vadim Shtayura5e5c2172018-08-15 21:11:10 +0000129 echo -n "Bootstrap from scratch failed, something is seriously broken " 1>&2
130 echo "run \`CIPD_HTTP_USER_AGENT_PREFIX=$USER_AGENT/manual $CLIENT selfupdate -version '$CIPD_CLIENT_VER'\` to diagnose if this is repeating." 1>&2
131 echo "" 1>&2
Vadim Shtayura7e50ee32018-07-26 17:43:51 +0000132 fi
Robert Iannucci2188fe92016-12-02 11:15:57 -0800133fi
134
Brian White361822c2018-04-04 15:21:45 -0400135# CygWin requires changing absolute paths to Windows form. Relative paths
136# are typically okay as Windows generally accepts both forward and back
137# slashes. This could possibly be constrained to only /tmp/ and /cygdrive/.
Vadim Shtayura5e5c2172018-08-15 21:11:10 +0000138if $CYGWIN; then
Brian White361822c2018-04-04 15:21:45 -0400139 args=("$@")
140 for i in `seq 2 $#`; do
141 arg="${@:$i:1}"
142 if [ "${arg:0:1}" == "/" ]; then
143 last=$((i-1))
144 next=$((i+1))
145 set -- "${@:1:$last}" `cygpath -w "$arg"` "${@:$next}"
146 fi
147 done
Vadim Shtayura5e5c2172018-08-15 21:11:10 +0000148 echo "$CLIENT" "${@}"
Brian White361822c2018-04-04 15:21:45 -0400149fi
150
Vadim Shtayura5e5c2172018-08-15 21:11:10 +0000151exec "$CLIENT" "${@}"