1*9712c20fSFrederick Mayle# Copyright 2012 Google LLC 2*9712c20fSFrederick Mayle# 3*9712c20fSFrederick Mayle# Redistribution and use in source and binary forms, with or without 4*9712c20fSFrederick Mayle# modification, are permitted provided that the following conditions are 5*9712c20fSFrederick Mayle# met: 6*9712c20fSFrederick Mayle# 7*9712c20fSFrederick Mayle# * Redistributions of source code must retain the above copyright 8*9712c20fSFrederick Mayle# notice, this list of conditions and the following disclaimer. 9*9712c20fSFrederick Mayle# * Redistributions in binary form must reproduce the above 10*9712c20fSFrederick Mayle# copyright notice, this list of conditions and the following disclaimer 11*9712c20fSFrederick Mayle# in the documentation and/or other materials provided with the 12*9712c20fSFrederick Mayle# distribution. 13*9712c20fSFrederick Mayle# * Neither the name of Google LLC nor the names of its 14*9712c20fSFrederick Mayle# contributors may be used to endorse or promote products derived from 15*9712c20fSFrederick Mayle# this software without specific prior written permission. 16*9712c20fSFrederick Mayle# 17*9712c20fSFrederick Mayle# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 18*9712c20fSFrederick Mayle# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 19*9712c20fSFrederick Mayle# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 20*9712c20fSFrederick Mayle# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 21*9712c20fSFrederick Mayle# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 22*9712c20fSFrederick Mayle# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 23*9712c20fSFrederick Mayle# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 24*9712c20fSFrederick Mayle# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 25*9712c20fSFrederick Mayle# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26*9712c20fSFrederick Mayle# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 27*9712c20fSFrederick Mayle# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28*9712c20fSFrederick Mayle 29*9712c20fSFrederick Mayle# Collection of common shell functions for 'run-checks.sh' et 'test-shell.sh' 30*9712c20fSFrederick Mayle 31*9712c20fSFrederick Mayle# All internal variables and functions use an underscore as a prefix 32*9712c20fSFrederick Mayle# (e.g. _VERBOSE, _ALL_CLEANUPS, etc..). 33*9712c20fSFrederick Mayle 34*9712c20fSFrederick Mayle# Sanitize the environment 35*9712c20fSFrederick Mayleexport LANG=C 36*9712c20fSFrederick Mayleexport LC_ALL=C 37*9712c20fSFrederick Mayle 38*9712c20fSFrederick Mayleif [ "$BASH_VERSION" ]; then 39*9712c20fSFrederick Mayle set -o posix 40*9712c20fSFrederick Maylefi 41*9712c20fSFrederick Mayle 42*9712c20fSFrederick Mayle# Utility functions 43*9712c20fSFrederick Mayle 44*9712c20fSFrederick Mayle_ALL_CLEANUPS= 45*9712c20fSFrederick Mayle 46*9712c20fSFrederick Mayle# Register a function to be called when the script exits, even in case of 47*9712c20fSFrederick Mayle# Ctrl-C, logout, etc. 48*9712c20fSFrederick Mayle# $1: function name. 49*9712c20fSFrederick Mayleatexit () { 50*9712c20fSFrederick Mayle if [ -z "$_ALL_CLEANUPS" ]; then 51*9712c20fSFrederick Mayle _ALL_CLEANUPS=$1 52*9712c20fSFrederick Mayle # Ensure a clean exit when the script is: 53*9712c20fSFrederick Mayle # - Exiting normally (EXIT) 54*9712c20fSFrederick Mayle # - Interrupted by Ctrl-C (INT) 55*9712c20fSFrederick Mayle # - Interrupted by log out (HUP) 56*9712c20fSFrederick Mayle # - Being asked to quit nicely (TERM) 57*9712c20fSFrederick Mayle # - Being asked to quit and dump core (QUIT) 58*9712c20fSFrederick Mayle trap "_exit_cleanups \$?" EXIT INT HUP QUIT TERM 59*9712c20fSFrederick Mayle else 60*9712c20fSFrederick Mayle _ALL_CLEANUPS="$_ALL_CLEANUPS $1" 61*9712c20fSFrederick Mayle fi 62*9712c20fSFrederick Mayle} 63*9712c20fSFrederick Mayle 64*9712c20fSFrederick Mayle# Called on exit if at least one function was registered with atexit 65*9712c20fSFrederick Mayle# $1: final exit status code 66*9712c20fSFrederick Mayle_exit_cleanups () { 67*9712c20fSFrederick Mayle local CLEANUP CLEANUPS 68*9712c20fSFrederick Mayle # Ignore calls to atexit during cleanups 69*9712c20fSFrederick Mayle CLEANUPS=$_ALL_CLEANUPS 70*9712c20fSFrederick Mayle _ALL_CLEANUPS= 71*9712c20fSFrederick Mayle for CLEANUP in $CLEANUPS; do 72*9712c20fSFrederick Mayle ($CLEANUP) 73*9712c20fSFrederick Mayle done 74*9712c20fSFrederick Mayle exit "$@" 75*9712c20fSFrederick Mayle} 76*9712c20fSFrederick Mayle 77*9712c20fSFrederick Mayle 78*9712c20fSFrederick Mayle 79*9712c20fSFrederick Mayle 80*9712c20fSFrederick Mayle# Dump a panic message then exit. 81*9712c20fSFrederick Mayle# $1+: message 82*9712c20fSFrederick Maylepanic () { 83*9712c20fSFrederick Mayle echo "ERROR: $@" >&2 84*9712c20fSFrederick Mayle exit 1 85*9712c20fSFrederick Mayle} 86*9712c20fSFrederick Mayle 87*9712c20fSFrederick Mayle# If the previous command failed, dump a panic message then exit. 88*9712c20fSFrederick Mayle# $1+: message. 89*9712c20fSFrederick Maylefail_panic () { 90*9712c20fSFrederick Mayle if [ $? != 0 ]; then 91*9712c20fSFrederick Mayle panic "$@" 92*9712c20fSFrederick Mayle fi; 93*9712c20fSFrederick Mayle} 94*9712c20fSFrederick Mayle 95*9712c20fSFrederick Mayle_VERBOSE=0 96*9712c20fSFrederick Mayle 97*9712c20fSFrederick Mayle# Increase verbosity for dump/log/run/run2 functions 98*9712c20fSFrederick Mayleincrease_verbosity () { 99*9712c20fSFrederick Mayle _VERBOSE=$(( $_VERBOSE + 1 )) 100*9712c20fSFrederick Mayle} 101*9712c20fSFrederick Mayle 102*9712c20fSFrederick Mayle# Decrease verbosity 103*9712c20fSFrederick Mayledecrease_verbosity () { 104*9712c20fSFrederick Mayle _VERBOSE=$(( $_VERBOSE - 1 )) 105*9712c20fSFrederick Mayle} 106*9712c20fSFrederick Mayle 107*9712c20fSFrederick Mayle# Returns success iff verbosity level is higher than a specific value 108*9712c20fSFrederick Mayle# $1: verbosity level 109*9712c20fSFrederick Mayleverbosity_is_higher_than () { 110*9712c20fSFrederick Mayle [ "$_VERBOSE" -gt "$1" ] 111*9712c20fSFrederick Mayle} 112*9712c20fSFrederick Mayle 113*9712c20fSFrederick Mayle# Returns success iff verbosity level is lower than a specific value 114*9712c20fSFrederick Mayle# $1: verbosity level 115*9712c20fSFrederick Mayleverbosity_is_lower_than () { 116*9712c20fSFrederick Mayle [ "$_VERBOSE" -le "$1" ] 117*9712c20fSFrederick Mayle} 118*9712c20fSFrederick Mayle 119*9712c20fSFrederick Mayle# Dump message to stdout, unless verbosity is < 0, i.e. --quiet was called 120*9712c20fSFrederick Mayle# $1+: message 121*9712c20fSFrederick Mayledump () { 122*9712c20fSFrederick Mayle if [ "$_VERBOSE" -ge 0 ]; then 123*9712c20fSFrederick Mayle printf "%s\n" "$*" 124*9712c20fSFrederick Mayle fi 125*9712c20fSFrederick Mayle} 126*9712c20fSFrederick Mayle 127*9712c20fSFrederick Mayle# If --verbose was used, dump a message to stdout. 128*9712c20fSFrederick Mayle# $1+: message 129*9712c20fSFrederick Maylelog () { 130*9712c20fSFrederick Mayle if [ "$_VERBOSE" -ge 1 ]; then 131*9712c20fSFrederick Mayle printf "%s\n" "$*" 132*9712c20fSFrederick Mayle fi 133*9712c20fSFrederick Mayle} 134*9712c20fSFrederick Mayle 135*9712c20fSFrederick Mayle_RUN_LOG= 136*9712c20fSFrederick Mayle 137*9712c20fSFrederick Mayle# Set a run log file that can be used to collect the output of commands that 138*9712c20fSFrederick Mayle# are not displayed. 139*9712c20fSFrederick Mayleset_run_log () { 140*9712c20fSFrederick Mayle _RUN_LOG=$1 141*9712c20fSFrederick Mayle} 142*9712c20fSFrederick Mayle 143*9712c20fSFrederick Mayle# Run a command. Output depends on $_VERBOSE: 144*9712c20fSFrederick Mayle# $_VERBOSE <= 0: Run command, store output into the run log 145*9712c20fSFrederick Mayle# $_VERBOSE >= 1: Dump command, run it, output goest to stdout 146*9712c20fSFrederick Mayle# Note: Ideally, the command's output would go to the run log for $_VERBOSE >= 1 147*9712c20fSFrederick Mayle# but the 'tee' tool doesn't preserve the status code of its input pipe 148*9712c20fSFrederick Mayle# in case of error. 149*9712c20fSFrederick Maylerun () { 150*9712c20fSFrederick Mayle local LOGILE 151*9712c20fSFrederick Mayle if [ "$_RUN_LOG" ]; then 152*9712c20fSFrederick Mayle LOGFILE=$_RUN_LOG 153*9712c20fSFrederick Mayle else 154*9712c20fSFrederick Mayle LOGFILE=/dev/null 155*9712c20fSFrederick Mayle fi 156*9712c20fSFrederick Mayle 157*9712c20fSFrederick Mayle if [ "$_VERBOSE" -ge 1 ]; then 158*9712c20fSFrederick Mayle echo "COMMAND: $@" 159*9712c20fSFrederick Mayle "$@" 160*9712c20fSFrederick Mayle else 161*9712c20fSFrederick Mayle "$@" >>$LOGFILE 2>&1 162*9712c20fSFrederick Mayle fi 163*9712c20fSFrederick Mayle} 164*9712c20fSFrederick Mayle 165*9712c20fSFrederick Mayle# Same as run(), but only dump command output for $_VERBOSE >= 2 166*9712c20fSFrederick Maylerun2 () { 167*9712c20fSFrederick Mayle local LOGILE 168*9712c20fSFrederick Mayle if [ "$_RUN_LOG" ]; then 169*9712c20fSFrederick Mayle LOGFILE=$_RUN_LOG 170*9712c20fSFrederick Mayle else 171*9712c20fSFrederick Mayle LOGFILE=/dev/null 172*9712c20fSFrederick Mayle fi 173*9712c20fSFrederick Mayle 174*9712c20fSFrederick Mayle if [ "$_VERBOSE" -ge 1 ]; then 175*9712c20fSFrederick Mayle echo "COMMAND: $@" 176*9712c20fSFrederick Mayle fi 177*9712c20fSFrederick Mayle if [ "$_VERBOSE" -ge 2 ]; then 178*9712c20fSFrederick Mayle "$@" 179*9712c20fSFrederick Mayle else 180*9712c20fSFrederick Mayle "$@" >>$LOGFILE 2>&1 181*9712c20fSFrederick Mayle fi 182*9712c20fSFrederick Mayle} 183*9712c20fSFrederick Mayle 184*9712c20fSFrederick Mayle# Extract number of cores to speed up the builds 185*9712c20fSFrederick Mayle# Out: number of CPU cores 186*9712c20fSFrederick Mayleget_core_count () { 187*9712c20fSFrederick Mayle case $(uname -s) in 188*9712c20fSFrederick Mayle Linux) 189*9712c20fSFrederick Mayle grep -c -e '^processor' /proc/cpuinfo 190*9712c20fSFrederick Mayle ;; 191*9712c20fSFrederick Mayle Darwin) 192*9712c20fSFrederick Mayle sysctl -n hw.ncpu 193*9712c20fSFrederick Mayle ;; 194*9712c20fSFrederick Mayle CYGWIN*|*_NT-*) 195*9712c20fSFrederick Mayle echo $NUMBER_OF_PROCESSORS 196*9712c20fSFrederick Mayle ;; 197*9712c20fSFrederick Mayle *) 198*9712c20fSFrederick Mayle echo 1 199*9712c20fSFrederick Mayle ;; 200*9712c20fSFrederick Mayle esac 201*9712c20fSFrederick Mayle} 202*9712c20fSFrederick Mayle 203*9712c20fSFrederick Mayle 204*9712c20fSFrederick Mayle# Check for the Android ADB program. 205*9712c20fSFrederick Mayle# 206*9712c20fSFrederick Mayle# On success, return nothing, but updates internal variables so later calls to 207*9712c20fSFrederick Mayle# adb_shell, adb_push, etc.. will work. You can get the path to the ADB program 208*9712c20fSFrederick Mayle# with adb_get_program if needed. 209*9712c20fSFrederick Mayle# 210*9712c20fSFrederick Mayle# On failure, returns 1, and updates the internal adb error message, which can 211*9712c20fSFrederick Mayle# be retrieved with adb_get_error. 212*9712c20fSFrederick Mayle# 213*9712c20fSFrederick Mayle# $1: optional ADB program path. 214*9712c20fSFrederick Mayle# Return: success or failure. 215*9712c20fSFrederick Mayle_ADB= 216*9712c20fSFrederick Mayle_ADB_STATUS= 217*9712c20fSFrederick Mayle_ADB_ERROR= 218*9712c20fSFrederick Mayle 219*9712c20fSFrederick Mayleadb_check () { 220*9712c20fSFrederick Mayle # First, try to find the executable in the path, or the SDK install dir. 221*9712c20fSFrederick Mayle _ADB=$1 222*9712c20fSFrederick Mayle if [ -z "$_ADB" ]; then 223*9712c20fSFrederick Mayle _ADB=$(which adb 2>/dev/null) 224*9712c20fSFrederick Mayle if [ -z "$_ADB" -a "$ANDROID_SDK_ROOT" ]; then 225*9712c20fSFrederick Mayle _ADB=$ANDROID_SDK_ROOT/platform-tools/adb 226*9712c20fSFrederick Mayle if [ ! -f "$_ADB" ]; then 227*9712c20fSFrederick Mayle _ADB= 228*9712c20fSFrederick Mayle fi 229*9712c20fSFrederick Mayle fi 230*9712c20fSFrederick Mayle if [ -z "$_ADB" ]; then 231*9712c20fSFrederick Mayle _ADB_STATUS=1 232*9712c20fSFrederick Mayle _ADB_ERROR="The Android 'adb' tool is not in your path." 233*9712c20fSFrederick Mayle return 1 234*9712c20fSFrederick Mayle fi 235*9712c20fSFrederick Mayle fi 236*9712c20fSFrederick Mayle 237*9712c20fSFrederick Mayle log "Found ADB program: $_ADB" 238*9712c20fSFrederick Mayle 239*9712c20fSFrederick Mayle # Check that it works correctly 240*9712c20fSFrederick Mayle local ADB_VERSION 241*9712c20fSFrederick Mayle ADB_VERSION=$("$_ADB" version 2>/dev/null) 242*9712c20fSFrederick Mayle case $ADB_VERSION in 243*9712c20fSFrederick Mayle "Android Debug Bridge "*) # Pass 244*9712c20fSFrederick Mayle log "Found ADB version: $ADB_VERSION" 245*9712c20fSFrederick Mayle ;; 246*9712c20fSFrederick Mayle *) # Fail 247*9712c20fSFrederick Mayle _ADB_ERROR="Your ADB binary reports a bad version ($ADB_VERSION): $_ADB" 248*9712c20fSFrederick Mayle _ADB_STATUS=1 249*9712c20fSFrederick Mayle return 1 250*9712c20fSFrederick Mayle esac 251*9712c20fSFrederick Mayle 252*9712c20fSFrederick Mayle _ADB_STATUS=0 253*9712c20fSFrederick Mayle return 0 254*9712c20fSFrederick Mayle} 255*9712c20fSFrederick Mayle 256*9712c20fSFrederick Mayle 257*9712c20fSFrederick Mayle# Return the path to the Android ADB program, if correctly detected. 258*9712c20fSFrederick Mayle# On failure, return the empty string. 259*9712c20fSFrederick Mayle# Out: ADB program path (or empty on failure) 260*9712c20fSFrederick Mayle# Return: success or failure. 261*9712c20fSFrederick Mayleadb_get_program () { 262*9712c20fSFrederick Mayle # Return cached value as soon as possible. 263*9712c20fSFrederick Mayle if [ -z "$_ADB_STATUS" ]; then 264*9712c20fSFrederick Mayle adb_check $1 265*9712c20fSFrederick Mayle fi 266*9712c20fSFrederick Mayle echo "$_ADB" 267*9712c20fSFrederick Mayle return $_ADB_STATUS 268*9712c20fSFrederick Mayle} 269*9712c20fSFrederick Mayle 270*9712c20fSFrederick Mayle# Return the error corresponding to the last ADB function failure. 271*9712c20fSFrederick Mayleadb_get_error () { 272*9712c20fSFrederick Mayle echo "$_ADB_ERROR" 273*9712c20fSFrederick Mayle} 274*9712c20fSFrederick Mayle 275*9712c20fSFrederick Mayle# Check that there is one device connected through ADB. 276*9712c20fSFrederick Mayle# In case of failure, use adb_get_error to know why this failed. 277*9712c20fSFrederick Mayle# $1: Optional adb program path 278*9712c20fSFrederick Mayle# Return: success or failure. 279*9712c20fSFrederick Mayle_ADB_DEVICE= 280*9712c20fSFrederick Mayle_ADB_DEVICE_STATUS= 281*9712c20fSFrederick Mayleadb_check_device () { 282*9712c20fSFrederick Mayle if [ "$_ADB_DEVICE_STATUS" ]; then 283*9712c20fSFrederick Mayle return $_ADB_DEVICE_STATUS 284*9712c20fSFrederick Mayle fi 285*9712c20fSFrederick Mayle 286*9712c20fSFrederick Mayle # Check for ADB. 287*9712c20fSFrederick Mayle if ! adb_check $1; then 288*9712c20fSFrederick Mayle _ADB_DEVICE_STATUS=$_ADB_STATUS 289*9712c20fSFrederick Mayle return 1 290*9712c20fSFrederick Mayle fi 291*9712c20fSFrederick Mayle 292*9712c20fSFrederick Mayle local ADB_DEVICES NUM_DEVICES FINGERPRINT 293*9712c20fSFrederick Mayle 294*9712c20fSFrederick Mayle # Count the number of connected devices. 295*9712c20fSFrederick Mayle ADB_DEVICES=$("$_ADB" devices 2>/dev/null | awk '$2 == "device" { print $1; }') 296*9712c20fSFrederick Mayle NUM_DEVICES=$(echo "$ADB_DEVICES" | wc -l) 297*9712c20fSFrederick Mayle case $NUM_DEVICES in 298*9712c20fSFrederick Mayle 0) 299*9712c20fSFrederick Mayle _ADB_ERROR="No Android device connected. Please connect one to your machine." 300*9712c20fSFrederick Mayle _ADB_DEVICE_STATUS=1 301*9712c20fSFrederick Mayle return 1 302*9712c20fSFrederick Mayle ;; 303*9712c20fSFrederick Mayle 1) # Pass 304*9712c20fSFrederick Mayle # Ensure the same device will be called in later adb_shell calls. 305*9712c20fSFrederick Mayle export ANDROID_SERIAL=$ADB_DEVICES 306*9712c20fSFrederick Mayle ;; 307*9712c20fSFrederick Mayle *) # 2 or more devices. 308*9712c20fSFrederick Mayle if [ "$ANDROID_SERIAL" ]; then 309*9712c20fSFrederick Mayle ADB_DEVICES=$ANDROID_SERIAL 310*9712c20fSFrederick Mayle NUM_DEVICES=1 311*9712c20fSFrederick Mayle else 312*9712c20fSFrederick Mayle _ADB_ERROR="More than one Android device connected. \ 313*9712c20fSFrederick MaylePlease define ANDROID_SERIAL in your environment" 314*9712c20fSFrederick Mayle _ADB_DEVICE_STATUS=1 315*9712c20fSFrederick Mayle return 1 316*9712c20fSFrederick Mayle fi 317*9712c20fSFrederick Mayle ;; 318*9712c20fSFrederick Mayle esac 319*9712c20fSFrederick Mayle 320*9712c20fSFrederick Mayle _ADB_DEVICE_STATUS=0 321*9712c20fSFrederick Mayle _ADB_DEVICE=$ADB_DEVICES 322*9712c20fSFrederick Mayle 323*9712c20fSFrederick Mayle FINGERPRINT=$(adb_shell getprop ro.build.fingerprint) 324*9712c20fSFrederick Mayle log "Using ADB device: $ANDROID_SERIAL ($FINGERPRINT)" 325*9712c20fSFrederick Mayle return 0 326*9712c20fSFrederick Mayle} 327*9712c20fSFrederick Mayle 328*9712c20fSFrederick Mayle# The 'adb shell' command is pretty hopeless, try to make sense of it by: 329*9712c20fSFrederick Mayle# 1/ Removing trailing \r from line endings. 330*9712c20fSFrederick Mayle# 2/ Ensuring the function returns the command's status code. 331*9712c20fSFrederick Mayle# 332*9712c20fSFrederick Mayle# $1+: Command 333*9712c20fSFrederick Mayle# Out: command output (stdout + stderr combined) 334*9712c20fSFrederick Mayle# Return: command exit status 335*9712c20fSFrederick Mayleadb_shell () { 336*9712c20fSFrederick Mayle local RET ADB_LOG 337*9712c20fSFrederick Mayle # Check for ADB device. 338*9712c20fSFrederick Mayle adb_check_device || return 1 339*9712c20fSFrederick Mayle ADB_LOG=$(mktemp "${TMPDIR:-/tmp}/adb-XXXXXXXX") 340*9712c20fSFrederick Mayle "$_ADB" shell "$@" ";" echo \$? > "$ADB_LOG" 2>&1 341*9712c20fSFrederick Mayle sed -i -e 's![[:cntrl:]]!!g' "$ADB_LOG" # Remove \r. 342*9712c20fSFrederick Mayle RET=$(sed -e '$!d' "$ADB_LOG") # Last line contains status code. 343*9712c20fSFrederick Mayle sed -e '$d' "$ADB_LOG" # Print everything except last line. 344*9712c20fSFrederick Mayle rm -f "$ADB_LOG" 345*9712c20fSFrederick Mayle return $RET 346*9712c20fSFrederick Mayle} 347*9712c20fSFrederick Mayle 348*9712c20fSFrederick Mayle# Push a file to a device. 349*9712c20fSFrederick Mayle# $1: source file path 350*9712c20fSFrederick Mayle# $2: device target file path 351*9712c20fSFrederick Mayle# Return: success or failure. 352*9712c20fSFrederick Mayleadb_push () { 353*9712c20fSFrederick Mayle adb_check_device || return 1 354*9712c20fSFrederick Mayle run "$_ADB" push "$1" "$2" 355*9712c20fSFrederick Mayle} 356*9712c20fSFrederick Mayle 357*9712c20fSFrederick Mayle# Pull a file from a device 358*9712c20fSFrederick Mayle# $1: device file path 359*9712c20fSFrederick Mayle# $2: target host file path 360*9712c20fSFrederick Mayle# Return: success or failure. 361*9712c20fSFrederick Mayleadb_pull () { 362*9712c20fSFrederick Mayle adb_check_device || return 1 363*9712c20fSFrederick Mayle run "$_ADB" pull "$1" "$2" 364*9712c20fSFrederick Mayle} 365*9712c20fSFrederick Mayle 366*9712c20fSFrederick Mayle# Same as adb_push, but will panic if the operations didn't succeed. 367*9712c20fSFrederick Mayleadb_install () { 368*9712c20fSFrederick Mayle adb_push "$@" 369*9712c20fSFrederick Mayle fail_panic "Failed to install $1 to the Android device at $2" 370*9712c20fSFrederick Mayle} 371*9712c20fSFrederick Mayle 372